Skip to main content

Docker Overview

Standards​

談到技術就必須先說標準,有了標準,大家才能夠在相同的規格下各自發展良性競爭,作為使用者,也可以在相同規格下,有更多的工具可以選擇。

The Open Container Initiative (OCI)​

定義容器底層相關的規格。

  1. The image-spec
  2. The runtime-spec
  3. The distribution-spec

Docker technology​

Docker 主要提供的元件可以分為兩部分

  • Client: 主要負責提供 API,讓使用者操作容器的事務。
  • Server(Engine): 主要負責容器的生命週期和建置啟動...等。

Docker Engine​

Docker Engine 是由多個元件組合而成的,

  • RUNC: Interface with kernel
  • shim: Enables pluggable lower level
  • containerd: Lifecycle management
  • daemon: Expose API
  • CLI: Command Line

dokcer daemon (dockerd)​

dockerd 是管理容器的主要服務。主要負責處理來自 Docker CLI 的 API 請求。

containerd​

containerd 是一個高性能的 container-runtime,它提供建置和管理容器所需的基本功能。
它負責處理低層次的容器操作,如啟動和停止容器、拉取和推送 image 等。 (實際上是將 image 轉換為 OCI bundle,告訴 runc 執行)

起初是讓 containerd 成為一個專門管理容器生命週期事件的工具。然而,現在已經擴展到包括管理映像、網絡和卷的能力,可以協助類似 Kubernetes 這樣的專案執行工作。

shim​

Shim 為 containerd 和 runc 之間提供了一個抽象層,使容器成為 Daemonless Container。
當 containerd 和 runc 解耦,可以在不影響已運行容器的情況下,單獨更新 daemon 或是 containerd。

RUNC​

runc 是實際建立和執行容器的底層 runtime。它是根據 OCI 規範實現的,確保了容器的標準化。
runc 負責處理容器的所有細節,如設置命名空間、控制組、掛載文件系統等。

Docker Image​

Docker Image 可以將其理解為一組 vm-template,裡面包含啟動應用所需的內容。(ReadOnly)
Docker 可以透過這個 Image 來啟動一組或是多組的應用。

Docker Image 的多層結構允許層之間的共享和重用。每一層都有自己的 Hash Value,當我們 pull image 下來時,會檢查 layer 是否已經存在,就不需要再 pull 下來。
(Sharing image layers)

Base Layer​

所有的 Docker Image 都是從 Base Layer 往上添加新層。

Merge Layer​

上層的文件可以選擇覆蓋下層的文件,透過多重合併的機制,可以確保每一層的獨立,又可以根據需要添加多層文件,簡化每一層的邏輯。

Hashes​

同一個標籤也可能會是不同版本的 Image,所以需要使用 Hash,來讓我們可以識別版本內容是否有差異。

  • Images digests: Image Manifest File 的 Hash。
  • Layer digests: Layer Contents 的 Hash。
  1. Content hashes: 未壓縮的 Hash。
  2. distribution hashes: 壓縮的 Hash。(減少網路流量)

Multi-Architecture​

  1. 清單列表
  2. 清單 透過這兩個資訊,可以知道對應不同架構下,需要的不同 Layer 資訊,從而透過一個 image,建立不同架構下的應用程式。

命名和標籤​

Docker Continaer​

虛擬機 vs 容器​

VirtualMachineContainer
對硬體做虛擬化對 OS 做虛擬化
啟動時間長啟動時間短
攻擊面較大攻擊面較小

佈署和管理容器​

Docker ComposeDocker SwarmDocker Stack
透過 YAML 檔設定,減少冗長的 command可擴展的容器集群結合 Compose 和 Swarm 的特性
單台主機上面的容器管理提供高可用和高擴展可以使用 Compose 格式檔案佈署到集群
不適合用於大規模佈署

Docker Network​

Docker Network 提供了多種 Network 模式,可以根據需求彈性地配置容器間的通訊方式。

HostBirdge NetworksOverlay NetworkNone
與主機共享相同的網路介面和埠類似區域網路 (最常見的類型)類似 VPN,可以跨不同的主機通訊容器不含網路功能
可以建立自定義的 BridgeNetwork,限制不同組容器間的通訊可以使用 TLS 加密來保護網路流量

Volumn​

Volume 是一個獨立於容器生命週期的儲存空間,讓容器可以儲存持久性資料。它就像是容器的外部硬碟,即使容器被刪除,Volume 和其中的資料仍然會保留下來。

特點​

  • 獨立性:Volume 是獨立的物件,不受容器生命週期的影響。
  • 靈活性:可以將 Volume 映射到專用的外部儲存系統,例如雲端或地端的儲存設備。
  • 共享性:不同容器可以透過 Volume 來存取和共用相同的資料。

Reference​

https://leanpub.com/dockerdeepdive