第二篇:《Docker 架构与核心组件详解》

发布时间:2026/5/26 1:03:46

第二篇:《Docker 架构与核心组件详解》 理解了 Docker 是什么之后我们需要深入其内部搞清楚 Docker 是如何工作的。本文将剖析 Docker 的 C/S 架构、核心组件dockerd、containerd、runc 等以及它们之间的交互关系。掌握这些不仅能帮你更好地使用 Docker还能为故障排查和性能优化打下基础。一、Docker 的整体架构Docker 采用经典的 C/S客户端-服务器架构Docker Client用户交互的入口如 docker 命令。Docker Daemondockerd后台服务负责管理镜像、容器、网络等资源。Registry存放镜像的仓库默认 Docker Hub。text±----------------- REST API ±-----------------| Docker Client | ----------------- | Docker Daemon || (docker CLI) | (UNIX socket | (dockerd) || | /var/run/docker | |±----------------- .sock) ±-----------------|| (gRPC)v±-----------------| containerd || (容器运行时管理) |±-----------------|| (runc)v±-----------------| runc || (实际创建容器进程)|±-----------------二、核心组件详解2.1 Docker Client作用用户通过 CLI 输入命令如 docker run客户端将这些命令转换为 HTTP/REST 请求发送给 dockerd。通信方式默认使用 UNIX Socket (/var/run/docker.sock)也支持 TCP通常用于远程访问但生产环境需加密。其他客户端Docker Compose、Kubernetes 的 dockershim已废弃也可视为客户端。2.2 Docker Daemon (dockerd)作用Docker 的后台守护进程负责接收客户端请求管理容器、镜像、网络、卷等生命周期。关键子模块镜像管理pull、push、tag、build。容器管理create、start、stop、restart、rm。网络管理创建 bridge、overlay 网络配置 iptables。卷管理创建、删除 volume。配置文件/etc/docker/daemon.json用于配置镜像加速器、存储驱动、日志驱动等。2.3 containerd作用从 Docker 1.11 起dockerd 不再直接创建容器而是调用 containerd。containerd 是一个行业标准容器运行时支持 OCIOpen Container Initiative规范。职责管理容器的生命周期创建、启动、停止、暂停、删除。镜像传输和存储pull/push 镜像。管理容器网络接口通过 CNI。管理容器的存储快照。优势containerd 被 Kubernetes 等编排工具直接支持成为容器运行时的标准。2.4 runc作用runc 是 OCI 规范的参考实现负责实际创建和运行容器进程。它从 containerd 接收容器配置例如 rootfs、namespace 参数然后调用 Linux 内核接口clone、unshare 等生成容器进程。特点非常轻量直接与内核交互没有守护进程。2.5 containerd-shim作用每个容器对应一个 shim 进程用于解耦 containerd 和容器进程。当 containerd 重启时shim 不会重启保证容器继续运行。职责作为容器的父进程回收子进程僵尸进程处理。管理容器的退出状态并将状态报告给 containerd。2.6 Docker Registry作用存储和分发 Docker 镜像。公共 Registry 为 Docker Hub也可自建私有 Registry如 registry:2 镜像。镜像命名[registry-host]/[namespace]/[repository]:[tag]docker.io/library/nginx:latest默认仓库my-registry.example.com:5000/myapp:v1.0三、创建容器的完整流程以 docker run 为例Client → docker run nginx → 发送 REST 请求给 dockerd。dockerd 收到请求检查本地是否有 nginx 镜像若无则去 Registry pull。dockerd 调用 containerd通过 gRPC创建容器所需的对象。containerd 从镜像快照服务创建容器的 rootfs。containerd 调用 runc通过 runc create生成容器进程。runc 与内核交互设置命名空间、Cgroups启动容器进程。containerd-shim 作为容器进程的父进程接管后续状态管理。dockerd 将容器 ID 和状态返回给 Client。整个过程在毫秒级内完成。四、关键组件交互图文字描述textdocker run → dockerd → containerd → runc (创建容器进程) → shim↓镜像管理存储、pull← containerd 的快照服务↓网络与卷配置 ← dockerd 调用 libnetwork 和 volume 驱动五、Docker 依赖的底层 Linux 技术Namespaces命名空间实现资源隔离。包括PID namespace隔离进程 ID。NET namespace隔离网络设备、IP、端口。MNT namespace隔离文件系统挂载点。UTS namespace隔离主机名和域名。IPC namespace隔离进程间通信资源。USER namespace可选隔离用户 ID。Cgroups控制组实现资源限制CPU、内存、磁盘 IO 等。UnionFS联合文件系统实现镜像分层OverlayFS、AUFS 等。六、常见问题与排查方向七、总结Docker 并非一个单一的二进制文件而是一套由多个组件构成的完整生态系统。从面向用户的 docker 客户端到核心的 dockerd、containerd再到底层 runc 和内核特性每一层各司其职。理解这些组件及其协作方式有助于我们更高效地使用 Docker并在遇到问题时快速定位根源。

相关新闻