Docker C/S架構


Docker C/S架構

簡介

Docker是一個開源的應用容器引擎,基於GO語言。

Docker可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的Linux機器上,也可以實現虛擬化。

容器是完全使用沙箱機制,相互之間不會有任何接口(類似iPhone的app),更重要的是容器性能開銷極低。

整體架構圖

image-20211118103657015

概念

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

img

使用docker的三個主要概念:

  • docker image: 鏡像只是讀的,鏡像中包含有需要運行的文件。鏡像用來創建container 容器,一個鏡像可以運行多個容器container,鏡像只有讀取的權限,不能修改。鏡像還可以通過Dockerfile腳本創建,也可以下載遠程倉庫中的鏡像
  • docker container:容器是docker運行組件,啟動一個鏡像就是一個容器,容器是一個隔離的環境,多個容器之間是不會相互影響的,保證容器中的程序月在一個相對安全的環境中
  • docekr hub/registry:共享和管理docker 鏡像,用戶可用上傳下載遠程倉庫中的鏡像,官方倉庫地址

簡單來說:鏡像就是相當於打包好的版本,鏡像啟動之后運行在容器中,倉庫就是存放鏡像的地方

命令執行過程

image-20211118104015446

  1. Docker的守護進程運行在宿主機上,也就是我們常說的“C/S架構”的Server(服務)端,守護進程會在啟動后,一直在后台運行,負責實現Docker的各種功能
  2. 用戶通過client客戶端輸入docker命令通過命令行接口將用戶輸入的命令傳遞給docker daemon守護進程
  3. 守護進程將命令執行的結果返回給客戶端,返顯示在命令行接口中

Remote API

除了使用客戶端的命令行接口,docker也提供了Remote API接口調用的方式,與docker的守護進程通信的方式。

Remote API 和常見的網絡平台提供的api接口相似,是RESful 風格的api接口。這就意味着我們可以直接通過編程的方式調用docker API接口,與docker環境集成。

Docker的Remote在某些復雜的情況下,也支持以下方式進行交互:

  • STDIN:標准輸入
  • STDOUT:標准輸出
  • STDERR: 標准錯誤輸出

通過Remote API的形式,來實現Docker的C/S架構的模式圖:

img

用戶可以與自定義的程序(JAVA、C++等)進行交互,而這些程序通過調用Remote API與Docker的守護進行進行協作。

客戶端與守護進程的通信方式

Docker的客戶端與守護進程,實際上是通過Socket進行連接的。

Docker提供了三種進行Socket連接的模式:

  1. Unix的端口模式【Docker默認的客戶端與守護進程的連接方式】
unix:///var/run/docker.sock
  1. TCP協議的host:port模式
tcp://host:port
  1. fd的Socket模式
fd://socketfd

完整的Docker的C/S模式的運行方式圖:

img

演示

  1. 啟動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

image-20211118110403344

  1. 查看docker version詳情
docker version

image-20211118110723534

  1. 修改配置文件使用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

image-20211118113854899

image-20211118114206911

  1. 測試訪問接口
curl localhost:2375/images/json
#查看宿主機的所有鏡像json格式

image-20211118114424893

[
    {
        "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
    }
]

注意:使用原有命令接口需要,修改原來配置


相關Docker文章推薦

Docker文件系統 & 數據卷

Docker 安裝及基本命令

Docker 部署nginx/tomcat/ES+kibana

Docker網絡

Docker C/S架構

Dockerfile自定義鏡像


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM