前言
終於進到個人最期待的部分~~希望今晚能夠精神奕奕地完成!
前幾篇都是關於 Docker 簡介,還有複習一些基礎操作來對 Docker 更熟悉一些。這篇終於要來看看 Docker 的 client-server 架構,還有它利用了那些 Linux kernel 的功能來實現容器技術。希望寫完這篇,能幫助我更容易掌握之後要寫的 Docker 網絡配置、容器間溝通等。
Let's Go ~!
Docker 的 client-server 架構
Docker 分為 client 和 server 端。所以實際上安裝 Docker Desktop(原名 Docker for Windows)的時候,就囊括了所有 Docker 需要的工具們,client 端工具(Docker CLI 或 docker
)和 server 端工具(Docker Engine / Docker Daemon / dockerd
)就是其中之二。當然還有其他可能會用到的工具,像是 docker-compose、kubernetes等等。(詳見官方文件 What’s included in the installer)。
※題外話:之前一直不知道為啥 Docker Engine 又稱作 Docker Daemon?Daemon 是什麼?看到鳥哥的這篇覺得描述得很清楚~
系統為了某些功能必須要提供一些服務 (service),實現這些服務的背後程式就稱作 daemon。例如,實現循環型例行性工作排程服務(service)的程式為 crond 這個 daemon 啦。
Docker CLI 與 Docker Daemon 間的關係與溝通
當在 command line 下 docker
指令,可能會以為 docker
這個指令幫我做了 docker 相關物件的處理。事實上,接收指令的是 client 端,它接收到指令後,替我們向 server 端發出請求;真正進行創建、啟動、管理 container/image/volume/網絡溝通的,是背後 server 端的 docker daemon(dockerd)。
dockerd(Server)是個持續運作的程序(process),負責管理 docker 物件們(object、image)。docker(CLI)可透過 REST API 向 dockerd 提出請求,也可透過 socker 來進行雙向溝通。
可採用的 Socket 管道主要有三種:
[官方文件 Daemon Socket Option]
[預設]UNIX domain socket / IPC socket(Inter-Process Communication 行程間通訊)
(關於 UNIX domain socket 可參考 UNIX Domain Socket使用)- 用於:同機上的 client & server 溝通(透過 Docker Desktop 一起裝的 c & s 即屬此類)
- 補充 UNIX domain socket / IPC socket:
- 同主機上的 process 間通訊
- 不用經過網路協議、校驗等,而直接複製應用層級資料給對象 process
- 不使用
<ip>:<port>
來識別 process,而採用 .sock 檔案路徑作為 process 識別 - client & server 會綁定到同一個 .sock 檔位置,用它來交換資料。docker 預設會把 socket 檔建於 /var/run/docker.sock
tcp
- 用於:與遠端 server 溝通(例如,想在 WSL 使用 docker 時,就會需要在 WSL 上面載 docker,並遠端連線到 dockerd)
- 注意:透過 tcp 連線到 daemon 都不會經過加密與驗證,可透過 2375 port 來監聽
-H tcp://0.0.0.0:2375
(-H:配置讓 docker daemon 監聽 socket,若要一次監聽多個 sockets 則可接多個 -H)
It is conventional to use port 2375 for un-encrypted, and port 2376 for encrypted communication with the daemon.
—— Docker 官方文件
- fd
- 用於:systemd-based systems。用法同上
-H fd://
- 用於:systemd-based systems。用法同上
底層實現
關於 docker 底層使用到的 Linux kernel 功能,官方文件也有簡單介紹。主要用到這四項:
- Namespaces
- Control Groups(cgroup)
- Union FS(Union File System)
- Container Format
這幾條的詳細內容之後再補上~
結語
等之後補齊再來結語吧~
參考資料
書籍:
Docker 官方文件:
其他資料: