Docker C/S架構
簡介
Docker是一個開源的應用容器引擎,基於GO語言。
Docker可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的Linux機器上,也可以實現虛擬化。
容器是完全使用沙箱機制,相互之間不會有任何接口(類似iPhone的app),更重要的是容器性能開銷極低。
整體架構圖
概念
Docker是CS架構,主要有兩個概念:
-
docekr daemon:運行在宿主機上,docker守護經常,用戶通過docker client (輸入docker命令)與docekr daemon交互
-
docker client: docker 命令行工具,是用戶使用docker的主要方式,docker client 與docker daemon通信並將結果返回給用戶,docker client 也可以通過socket 或者 RESTful api訪問遠程的docker daemon
使用docker的三個主要概念:
- docker image: 鏡像只是讀的,鏡像中包含有需要運行的文件。鏡像用來創建container 容器,一個鏡像可以運行多個容器container,鏡像只有讀取的權限,不能修改。鏡像還可以通過Dockerfile腳本創建,也可以下載遠程倉庫中的鏡像
- docker container:容器是docker運行組件,啟動一個鏡像就是一個容器,容器是一個隔離的環境,多個容器之間是不會相互影響的,保證容器中的程序月在一個相對安全的環境中
- docekr hub/registry:共享和管理docker 鏡像,用戶可用上傳下載遠程倉庫中的鏡像,官方倉庫地址
簡單來說:鏡像就是相當於打包好的版本,鏡像啟動之后運行在容器中,倉庫就是存放鏡像的地方
命令執行過程
- Docker的守護進程運行在宿主機上,也就是我們常說的“C/S架構”的Server(服務)端,守護進程會在啟動后,一直在后台運行,負責實現Docker的各種功能
- 用戶通過client客戶端輸入docker命令通過命令行接口將用戶輸入的命令傳遞給docker daemon守護進程
- 守護進程將命令執行的結果返回給客戶端,返顯示在命令行接口中
Remote API
除了使用客戶端的命令行接口,docker也提供了Remote API接口調用的方式,與docker的守護進程通信的方式。
Remote API 和常見的網絡平台提供的api接口相似,是RESful 風格的api接口。這就意味着我們可以直接通過編程的方式調用docker API接口,與docker環境集成。
Docker的Remote在某些復雜的情況下,也支持以下方式進行交互:
- STDIN:標准輸入
- STDOUT:標准輸出
- STDERR: 標准錯誤輸出
通過Remote API的形式,來實現Docker的C/S架構的模式圖:
用戶可以與自定義的程序(JAVA、C++等)進行交互,而這些程序通過調用Remote API與Docker的守護進行進行協作。
客戶端與守護進程的通信方式
Docker的客戶端與守護進程,實際上是通過Socket進行連接的。
Docker提供了三種進行Socket連接的模式:
- Unix的端口模式【Docker默認的客戶端與守護進程的連接方式】
unix:///var/run/docker.sock
- TCP協議的host:port模式
tcp://host:port
- fd的Socket模式
fd://socketfd
完整的Docker的C/S模式的運行方式圖:
演示
- 啟動docker 並查看守護進程
# 啟動docker 環境
[root@bogon /]# systemctl start docker
# 根據管道,搜索關鍵詞docker,查看docker守護進程
[root@bogon /]# ps -ef |grep docker
root 1534 1 0 18:57 ? 00:00:01 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root 5161 3667 0 19:03 pts/0 00:00:00 grep --color=auto docker
- 查看docker version詳情
docker version
- 修改配置文件使用Remote API 來實現socket連接
# 1. 修改配置文件 /lib/systemd/system/docker.service文件
vim /lib/systemd/system/docker.service
# 注釋掉圖中第第二行,並在其上方添加一行(默認端口為2375)
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 2. 重啟服務
systemctl daemon-reload
service docker restart
- 測試訪問接口
curl localhost:2375/images/json
#查看宿主機的所有鏡像json格式
[
{
"VirtualSize": 141468644,
"Size": 141468644,
"SharedSize": -1,
"RepoTags": [
"nginx:latest"
],
"RepoDigests": [
"nginx@sha256:fd63aac07effae8efcc4677b6197783b11a674b6664ba86e76884b1af3ffe345"
],
"ParentId": "",
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"Id": "sha256:e9ce56a96f8e0e9f75051f258a595d1257bd6bb91913b79455ea77e67e686c5c",
"Created": 1637086817,
"Containers": -1
},
{
"VirtualSize": 133277153,
"Size": 133277153,
"SharedSize": -1,
"RepoTags": null,
"RepoDigests": [
"nginx@sha256:644a70516a26004c97d0d85c7fe1d0c3a67ea8ab7ddf4aff193d9f301670cf36"
],
"ParentId": "",
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"Id": "sha256:87a94228f133e2da99cb16d653cd1373c5b4e8689956386c1c12b60a20421a02",
"Created": 1634004220,
"Containers": -1
},
{
"VirtualSize": 440930756,
"Size": 440930756,
"SharedSize": -1,
"RepoTags": [
"jenkins/jenkins:lts"
],
"RepoDigests": [
"jenkins/jenkins@sha256:4b17ea5e222f5fbfcf8d77ac497c6f597ebe5141c39e210dac6c5815485e20a4"
],
"ParentId": "",
"Labels": {
"org.opencontainers.image.version": "2.303.2",
"org.opencontainers.image.vendor": "Jenkins project",
"org.opencontainers.image.url": "https://www.jenkins.io/",
"org.opencontainers.image.title": "Official Jenkins Docker image",
"org.opencontainers.image.source": "https://github.com/jenkinsci/docker",
"org.opencontainers.image.licenses": "MIT",
"org.opencontainers.image.description": "The Jenkins Continuous Integration and Delivery server"
},
"Id": "sha256:e4ebf98bd6ca32c9bbc21810ce1b953dfba5308bbfa9651a3f1573a5a0aff2aa",
"Created": 1633538013,
"Containers": -1
}
]
注意:使用原有命令接口需要,修改原來配置