0%

深入淺出理解 Docker 的底層運作與架構

今天我們要一起來聊聊 Docker,Docker 是現代開發與運維中不可或缺的工具,用來打包、部署和運行應用程式。它讓你能在任何環境中快速部署應用,實現「一次構建,隨處運行」的目標,是一個讓開發者與運維工程師都愛不釋手的工具。想像 Docker 就像是「貨櫃」,它能把你的應用程式打包起來,無論搬到哪台電腦上都能保證一致運行。準備好了嗎?讓我們開始吧!

Docker 是什麼?

Docker 是一個容器化技術 (Containerlize)。什麼是容器化呢?想像你有一台「神奇咖啡機」,每天要為不同客戶沖泡咖啡。如果每次都要在客戶家現場準備咖啡豆、糖、水,還要調整不同的咖啡機,結果做出來的咖啡味道可能忽濃忽淡。但如果有了 Docker,你可以把咖啡豆、糖、水,甚至連沖泡的設定和一台標準化的「神奇咖啡機」都打包好。無論這台咖啡機被帶到哪裡,只要按下開始鍵,就能保證沖出來的咖啡味道一模一樣。

在程式世界裡,這杯「咖啡」就是你的應用程式,「神奇咖啡機」就是 Docker 容器。它把程式碼、依賴庫、設定檔通通裝進這個標準化的環境,讓程式能在任何地方(你的電腦、雲端伺服器)穩定運行。

概念

要理解 Docker 的運作,我們需要先了解幾個核心概念:

  • Image

    • 應用程式的靜態模板,其中包含應用程式及其運行所需的依賴(EX:程式碼、程式庫)。
    • 類似於 VM 中的「快照」(Snapeshot)。
  • Container

    • 從 Image 啟動的執行實例,是一個輕量的隔離運行環境。
    • 每個容器共享宿主機的作業系統核心,但彼此隔離。
  • Registry

    • 儲存和分發 Image 的地方(EX: Docker Hub or Private Registry)。

底層技術

Docker 的強大主要建立在 Linux 提供的核心功能之上

  • Namespace

    • 用於實現 Container 的 process 隔離
    • 每個 Container 都有自己的命名空間,確保不同容器之間的資源互不影響。
    • 常見的 Namespace:
      • PID (Process ID):每個容器看到的是自己的 Process 列表。
      • NET (網路):每個容器配備獨立的網路接口和 IP。
      • MNT (掛載):每個容器有自己的檔案系統視圖。
  • Cgroups

    • 用於資源的分配與限制,EX: CPU、記憶體和網路資源的管理。
    • 能避免單一容器過度佔用資源,確保整體系統性能穩定。
  • UnionFS

    • 支援分層的檔案系統,可有效 ++減少重複數據的存儲量++。
    • Docker 的 Image 由多層構成,每層只存儲新增或修改的部分,未改變的部分會繼續共享。
  • Container Runtime

    • Docker 使用 containerd 作為 Container Runtime,負責管理 Container 的生命周期(啟動、停止、刪除)。

核心架構

Docker 的核心架構就像一家咖啡機。你(Docker Client)用遙控器操作,咖啡機的大腦(Docker Daemon)接到訂單後,指揮咖啡機的沖泡模組(Containerd)啟動咖啡機(OCI Runtime),從原料供應商(Docker Registry)拿來咖啡豆和配方,沖出一杯完美的咖啡(Container)。

  • Docker Client
    用戶與 Docker 互動的介面,負責接收指令(docker run) 後,傳給 Docker Daemon。
    就像你手上有一個「咖啡機遙控器」,按下「沖泡」按鈕(docker run),告訴咖啡機要做什麼。

  • Docker Daemon
    Docker 接收指令、管理一切的中心,負責處理所有 Container 的操作(如啟動、停止、刪除等),同時管理 Image、網路和儲存等資源。它會持續運行,並監聽來自 Docker Client 的請求。
    就像咖啡機的「智能大腦」。接收你的指令 (docker run),然後指揮咖啡機磨豆、加水、沖泡、分配原料。

  • Containerd
    Container 的核心執行環境,管理 Container 的生命周期(創建、啟動、停止等)。它是 Docker Daemon 的一部分,但獨立出來,讓架構更模組化。
    就像咖啡機裡的「沖泡模組」。大腦 (Daemon) 告訴它做事,它負責把咖啡豆變成咖啡(管理 Container 的生命周期),確保每杯咖啡都能順利沖泡。

  • Docker Registry
    儲存和分發 Docker Image 的地方 (預設 Docker Hub,但也可以是 Private Registry)。
    就像「原料供應商」(Docker Hub),提供咖啡豆、糖和配方(Image),可以隨時去拿來用。docker pull nginx 就是去拿原料。

  • OCI Runtime(runc)
    標準化的 Container Runtime (runc) 在幕後把 Container 跑起來,它是底層工具,你不會直接跟它打交道。
    就像咖啡機的「引擎」,默默地讓咖啡機運作(啟動和運行 Container)。

1
2
3
4
用戶 --> [Docker Client] --> [Docker Daemon] --> [Containerd]
↘︎ ↓
[Docker Registry] [OCI Runtime]
(外部支援) (底層實現)

docker_architecture

工作流程

假設執行以下指令:docker run hello-world

  1. 查找 Image

    • Docker Client 發送請求到 Docker Daemon。
    • Daemon 會先檢查本地是否已有 hello-world Image,若不存在,則從 Docker Hub 拉取。
  2. 啟動容器

    • 使用拉取下來的 Image 創建容器。
    • 分配資源(EX: CPU、Memory)並設置 Namespace。
  3. 運行應用程式

    • 啟動容器內的應用程式。
    • 使用者可以通過容器內的網路端口與應用程式進行互動。

Docker

應用場景

  • 開發環境一致性
    開發者能夠在本地建立與生產環境完全一致的運行環境,從而有效解決「在我這裡可以跑」這類常見問題,大幅提升開發流程的穩定性和可靠性。

  • CI/CD 流程
    支援快速完成應用程式的打包、測試與部署,顯著縮減從開發到上線的整體交付周期,讓產品更新和改進更加高效。

  • 微服務架構
    將每個微服務打包成獨立容器後,能夠更輕鬆地實現高效管理與彈性擴展,有助於系統在應對複雜需求時保持靈活性與穩定性。

優缺點

優點 缺點
輕量級:共享 OS 核心,減少資源需求 容器隔離性不如虛擬機(需注意安全設置)
啟動速度快:秒級啟動,提升開發效率 高效管理需要學習曲線(如編排工具 Kubernetes)
高可移植性:支援跨平台部署 大量容器可能增加監控和調試的複雜度

總結

Docker 通過整合 Linux 的 Namespace、Cgroups 和 UnionFS,提供了一個輕量且高效的容器化平台。它的設計理念簡單,但底層運作機制複雜且高效,是現代軟體開發與部署的核心工具。

Docker 是容器技術的橋梁、是一種輕量虛擬化技術,讓你的應用程式無縫運行在任何環境中!