(二)容器架構詳解
(1)Docker 的核心組件包括:
- Docker 客戶端 - Client
- Docker 服務器 - Docker daemon
- Docker 鏡像 - Image
- Registry
- Docker 容器 - Container
Docker 架構如下圖所示:

? Docker 采用的是 Client/Server 架構,客戶端向服務器發送請求,服務器負責構建、運行和分發容器,客戶端和服務器可以運行在同一個 Host 上,客戶端也可以通過 socket 或 REST API 與遠程的服務器通信,
①Docker 客戶端
? 最常用的 Docker 客戶端是 docker命令,通過 docker 我們可以方便地在 Host 上構建和運行容器,docker支持很多操作(子命令),后面會逐步用到,
root@cuiyongchao:~# docker
attach context exec import logout port rm service system version
build cp export info logs ps rmi stack tag volume
builder create help inspect network pull run start top wait
commit diff history kill node push save stats trust
config engine image load pause rename search stop unpause
container events images login plugin restart secret swarm update
? 除了 docker 命令列工具,用戶也可以通過 REST API 與服務器通信,
②Docker 服務器
? Docker daemon 是服務器組件,以 Linux 后臺服務的方式運行,
root@cuiyongchao:~# systemctl status docker.service
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-10-26 08:56:51 UTC; 17h ago
Docs: https://docs.docker.com
Main PID: 24967 (dockerd)
Tasks: 24
CGroup: /system.slice/docker.service
├─24967 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
└─26575 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.2 -container-port 80
? Docker daemon 運行在 Docker host 上,負責創建、運行、監控容器,構建、存盤鏡像, 默認配置下,Docker daemon 只能回應來自本地 Host 的客戶端請求,如果要允許遠程客戶端請求,需要在組態檔中打開 TCP 監聽,步驟如下:
-
編輯組態檔 /etc/systemd/system/multi-user.target.wants/docker.service,在環境變數
ExecStart后面添加-H tcp://0.0.0.0,允許來自任意 IP 的客戶端連接,[Service] Type=notify # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not support the cgroup feature set required # for containers run by docker ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0如果使用的是其他作業系統,組態檔的位置可能會不一樣,
-
重啟 Docker daemon
root@cuiyongchao:~# systemctl daemon-reload root@cuiyongchao:~# systemctl restart docker.service -
服務器 IP 為 10.0.0.20,客戶端在命令列里加上 -H 引數,即可與遠程服務器通信,
root@cuiyongchao:~# docker -H 10.0.0.20 infoinfo子命令用于查看 Docker 服務器的資訊,
-
③ Docker 鏡像
? 可將 Docker 鏡像看著只讀模板,通過它可以創建 Docker 容器,例如某個鏡像可能包含一個 Ubuntu 作業系統、一個 Apache HTTP Server 以及用戶開發的 Web 應用,
-
鏡像有多種生成方法:
- 可以從無到有開始創建鏡像;
- 也可以下載并使用別人創建好的現成的鏡像;
- 還可以在現有鏡像上創建新的鏡像;
我們可以將鏡像的內容和創建步驟描述在一個文本檔案中,這個檔案被稱作 Dockerfile,通過執行
docker build <docker-file>命令可以構建出 Docker 鏡像,后面我們會討論,
④ Docker 容器
? Docker 容器就是 Docker 鏡像的運行實體,用戶可以通過 CLI(docker)或是 API 啟動、停止、移動或洗掉容器,可以這么認為,對于應用軟體,鏡像是軟體生命周期的構建和打包階段,而容器則是啟動和運行階段,
⑤ Registry
? Registry 是存放 Docker 鏡像的倉庫,Registry 分私有和公有兩種,Docker Hub(https://hub.docker.com/) 是默認的 Registry,由 Docker 公司維護,上面有數以萬計的鏡像,用戶可以自由下載和使用,出于對速度或安全的考慮,用戶也可以創建自己的私有 Registry,后面我們會學習如何搭建私有 Registry,
docker pull 命令可以從 Registry 下載鏡像,
docker run 命令則是先下載鏡像(如果本地沒有),然后再啟動容器,
(2) docker組件如何協調作業
-
洗掉一個容器:先停止,在洗掉,
root@cuiyongchao:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6ee2d8da8a46 httpd "httpd-foreground" About an hour ago Up About an hour 0.0.0.0:81->80/tcp jolly_galois 6b8f44806be2 httpd "httpd-foreground" About an hour ago Up About an hour 0.0.0.0:80->80/tcp inspiring_moser root@cuiyongchao:~# docker stop 6ee2d8da8a46 6ee2d8da8a46 root@cuiyongchao:~# docker rm 6ee2d8da8a46 6ee2d8da8a46 root@cuiyongchao:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6b8f44806be2 httpd "httpd-foreground" About an hour ago Up About an hour 0.0.0.0:80->80/tcp inspiring_moser root@cuiyongchao:~# docker stop 6b8f44806be2 6b8f44806be2 root@cuiyongchao:~# docker rm 6b8f44806be2 6b8f44806be2 root@cuiyongchao:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES root@cuiyongchao:~# -
洗掉容器鏡像
root@cuiyongchao:~# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE httpd latest 3dd970e6b110 13 days ago 138MB hello-world latest bf756fb1ae65 9 months ago 13.3kB root@cuiyongchao:~# docker rmi -f 3dd970e6b110 root@cuiyongchao:~# docker rmi -f bf756fb1ae65 -
啟動一個容器:
root@cuiyongchao:~# docker run -d -p 80:80 httpd ① Unable to find image 'httpd:latest' locally ② latest: Pulling from library/httpd bb79b6b2107f: Already exists ③ 26694ef5449a: Already exists 7b85101950dd: Already exists da919f2696f2: Already exists 3ae86ea9f1b9: Already exists Digest: sha256:b82fb56847fcbcca9f8f162a3232acb4a302af96b1b2af1c4c3ac45ef0c9b968 Status: Downloaded newer image for httpd:latest ④ 0b41ce9e0937c5e42a643fc34ffd2cc4b1cff608884b23ef1461501b42296f88 ⑤ root@cuiyongchao:~#- ①Docker 客戶端執行
docker run命令, - ②Docker daemon 發現本地沒有 httpd 鏡像,
- ③daemon 從 Docker Hub 下載鏡像,
- ④下載完成,鏡像 httpd 被保存到本地,
- ⑤Docker daemon 啟動容器,
- ①Docker 客戶端執行
-
docker images可以查看到 httpd 已經下載到本地,root@cuiyongchao:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpd latest 3dd970e6b110 13 days ago 138MB root@cuiyongchao:~# -
docker ps或者docker container ls顯示容器正在運行,root@cuiyongchao:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0b41ce9e0937 httpd "httpd-foreground" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp quirky_lederberg root@cuiyongchao:~# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0b41ce9e0937 httpd "httpd-foreground" 4 minutes ago Up 4 minutes 0.0.0.0:80->80/tcp quirky_lederberg root@cuiyongchao:~#
(3)小結
? Docker 借鑒了集裝箱的概念,標準集裝箱將貨物運往世界各地,Docker 將這個模型運用到自己的設計哲學中,唯一不同的是:集裝箱運輸貨物,而 Docker 運輸軟體,
? 每個容器都有一個軟體鏡像,相當于集裝箱中的貨物,容器可以被創建、啟動、關閉和銷毀,和集裝箱一樣,Docker 在執行這些操作時,并不關心容器里到底裝的什么,它不管里面是 Web Server,還是 Database,
? 用戶不需要關心容器最侄訓在哪里運行,因為哪里都可以運行,開發人員可以在筆記本上構建鏡像并上傳到 Registry,然后 QA 人員將鏡像下載到物理或虛擬機做測驗,最終容器會部署到生產環境,
? 使用 Docker 以及容器技術,我們可以快速構建一個應用服務器、一個訊息中間件、一個資料庫、一個持續集成環境,因為 Docker Hub 上有我們能想到的幾乎所有的鏡像,
? 不知大家是否意識到,潘多拉盒子已經被打開,容器不但降低了我們學習新技術的門檻,更提高了效率,如果你是一個運維人員,想研究負載均衡軟體 HAProxy,只需要執行docker run haproxy,無需繁瑣的手工安裝和配置既可以直接進入實戰,如果你是一個開放人員,想學習怎么用 django 開發 Python Web 應用,執行 docker run django,在容器里隨便折騰吧,不用擔心會搞亂 Host 的環境,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/196008.html
標籤:其他
上一篇:容器基礎之(二)容器架構【2】
