【Day 4】Docker 架構與底層實現


前言

終於進到個人最期待的部分~~希望今晚能夠精神奕奕地完成!

前幾篇都是關於 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

  1. [預設]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
  2. 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 官方文件

  1. fd
    • 用於:systemd-based systems。用法同上 -H fd://

底層實現

關於 docker 底層使用到的 Linux kernel 功能,官方文件也有簡單介紹。主要用到這四項:

  1. Namespaces
  2. Control Groups(cgroup)
  3. Union FS(Union File System)
  4. Container Format

這幾條的詳細內容之後再補上~


結語

等之後補齊再來結語吧~


參考資料

旨在督促閱讀,同時學習組織與分享,《­Docker——從入門到實踐》原文:https://github.com/yeasy/docker_practice/,繁中版:https://philipzheng.gitbooks.io/docker_practice/






Related Posts

漫談傳輸介面-PCI

漫談傳輸介面-PCI

MTR04_0713

MTR04_0713

Day02  深入了解 Lazy-load 的背後實作 - Intersection Observer API

Day02 深入了解 Lazy-load 的背後實作 - Intersection Observer API



Comments