從 Docker 到 runC:容器底層原理詳解
目錄
1. Docker 與 runC 的關系
2. Docker 的核心組件
3. runC 的核心功能
4. 實戰示例:從 Docker 到 runC
4.1 示例場景:運行一個簡單容器
4.2 Docker 底層調用 runC 的流程
4.3 查看 runC 的調用
4.4 直接調用 runC 創建容器
4.5 驗證容器的隔離性
5. runC 的核心代碼解析
5.1 創建命名空間
5.2 設置 Cgroups
5.3 掛載文件系統
6. Docker 與 runC 的協作流程圖
7. 總結
1. Docker 與 runC 的關系
Docker 是一個容器化平臺,其核心功能是通過容器運行時(Container Runtime)來創建和管理容器。runC 是 Docker 默認使用的底層容器運行時,它實現了 Open Container Initiative (OCI) 標準,負責與 Linux 內核交互,完成容器的創建、啟動和銷毀。
Docker 與 runC 的協作流程:
- Docker 客戶端(CLI)向 Docker 守護進程(
dockerd
)發送指令(如docker run
)。 dockerd
將指令轉化為容器配置(JSON 格式),并調用 containerd(Docker 的容器管理服務)。- containerd 通過 containerd-shim 調用 runC,由 runC 負責創建容器的命名空間(Namespaces)、控制組(Cgroups)和文件系統掛載。
- 容器啟動后,
containerd-shim
與容器保持通信,確保容器生命周期的管理。
2. Docker 的核心組件
Docker 的架構由多個組件組成,以下是關鍵部分:
組件 | 作用 |
---|---|
Docker CLI | 用戶交互接口,用于執行 docker run 等命令。 |
Dockerd | Docker 守護進程,處理 Docker CLI 的請求,管理容器生命周期。 |
Containerd | 容器管理服務,負責與 runC 交互,管理容器的創建、運行和銷毀。 |
runC | 容器運行時,負責與 Linux 內核交互,實現容器的隔離和資源限制。 |
libcontainer | Docker 自研的容器管理庫(已逐步被 containerd 替代)。 |
3. runC 的核心功能
runC 是一個輕量級的容器運行時,支持以下核心功能:
- Namespaces 隔離:通過 Linux 的命名空間(PID、Mount、UTS、IPC、Network、User)實現容器的隔離。
- Cgroups 資源限制:通過 Linux 的控制組(CPU、內存、磁盤 I/O)限制容器資源使用。
- 文件系統掛載:掛載容器的根文件系統(RootFS),通常基于 UnionFS(如 AUFS、OverlayFS)。
4. 實戰示例:從 Docker 到 runC
以下是一個完整的示例,演示如何通過 Docker 創建一個容器,并分析 runC 的底層行為。