Docker 版本与架构
1. 版本基线
核对日期:2026-08-12(Asia/Shanghai)。
这里的“最新版本”指各项目官方稳定发布页中,在核对日标记为 Latest 或位于稳定 release notes 顶部的版本,不包含 RC、Beta、nightly 和 master 构建。
| 组件 | 最新稳定版 | 发布日期 | 版本口径与官方来源 |
|---|---|---|---|
| Docker Engine / Docker CLI | 29.7.2 | 2026-08-05 | Engine 的 CE 打包版本;发布说明同时关联 Moby 与 CLI 里程碑。Engine 29 release notes |
| Docker Desktop | 4.86.0 | 2026-08-10 | macOS、Windows、Linux 桌面套件版本,内含多个独立组件。Desktop release notes |
| Docker Compose | 5.4.0 | 2026-08-03 | Compose CLI 插件的独立稳定版本。Compose releases |
| Docker Buildx | 0.36.1 | 2026-08-04 | Docker CLI 高级构建插件的独立稳定版本。Buildx releases |
| BuildKit | 0.32.2 | 2026-08-04 | 构建后端的独立稳定版本;Engine 29.7.2 也更新到此版本。BuildKit releases |
1.1 为什么版本号不相同
Docker 不是单一二进制:
- Engine 由
dockerd、API、CLI 打包及 containerd/runc 等依赖组成。 - Desktop 是一套桌面产品,固定打包某个时点的 Engine、Buildx、Compose 等组件。
- Compose、Buildx、BuildKit 各自独立发布,发布节奏不同。
- 独立最新版不代表 Desktop 已经内嵌该版本。例如 Desktop 4.86.0 的发布说明列出 Engine 29.7.2 和 Buildx 0.36.0,而当日 Buildx 独立稳定版是 0.36.1。
因此,不能只说“Docker 是 29.7.2”就推断 Compose 或 Desktop 的版本。必须从实际环境读取:
docker version
docker info
docker compose version
docker buildx version
docker buildx inspect --bootstrapdocker version 同时显示 Client 与 Server。Client 可以通过远程 API 连接另一台主机,因此二者可能不同;排障记录必须同时保存两部分。
2. 组件关系
查看图表代码
2.1 Docker CLI
docker 是客户端。它解析参数,通过 Unix socket、Windows named pipe 或受 TLS 保护的 TCP 连接 daemon。常见目标由 Context 管理:
docker context ls
docker context show2.2 Docker daemon
dockerd 管理镜像、容器、网络、卷、构建入口和 API。Linux 默认 socket 是 /var/run/docker.sock。
安全警告: 能读写 Docker socket 的进程通常可以创建特权容器、挂载宿主机根目录,进而获得宿主机控制权。不要把 socket 暴露到互联网,也不要随意挂载进业务容器。
2.3 containerd 与 runc
containerd管理镜像内容、快照和容器任务生命周期。runc根据 OCI Runtime Specification 创建 namespaces、cgroups、root filesystem,并启动容器进程。- 容器启动后,实际工作负载是宿主机内核管理的普通进程,不包含独立内核。
2.4 BuildKit、Buildx 与 Compose
- BuildKit 是构建执行引擎,负责 Dockerfile 前端、并行执行、缓存、输出与证明材料。
- Buildx 是 Docker CLI 插件,为 BuildKit 提供 builder 管理、多平台构建、远程缓存和 Bake 等能力。
- Compose 把
compose.yaml中的服务、网络、卷、配置和 Secret 转为一组 Engine API 操作。
3. 镜像与容器模型
镜像是只读内容寻址对象,主要包括:
- manifest 或多平台 manifest index;
- 配置对象,包括入口命令、环境变量、用户和历史;
- 一个或多个只读 filesystem layer。
容器在镜像层之上增加可写层并附加运行时配置。删除容器会删除该可写层;命名卷和 bind mount 中的数据不随普通容器删除而消失。
registry image layers(只读)
+
container writable layer(随容器删除)
+
volume / bind mount(生命周期独立或由宿主机管理)4. Linux 隔离基础
容器隔离主要来自内核机制,而不是 Docker 自己模拟一台计算机:
| 机制 | 作用 |
|---|---|
| PID namespace | 隔离进程编号和进程树 |
| Mount namespace | 隔离挂载点和根文件系统 |
| Network namespace | 隔离网卡、路由、端口和防火墙视图 |
| UTS namespace | 隔离 hostname/domain name |
| IPC namespace | 隔离共享内存、信号量和消息队列 |
| User namespace | 把容器 UID/GID 映射为宿主机非特权 ID |
| cgroups v2 | 统计并限制 CPU、内存、PIDs、I/O 等资源 |
| seccomp | 过滤系统调用 |
| AppArmor/SELinux | 通过 LSM 约束文件和内核对象访问 |
| capabilities | 把传统 root 权限拆分成独立能力 |
隔离不是绝对安全边界。共享内核意味着内核漏洞、过度 capability、特权模式、危险挂载或错误配置都可能削弱隔离。
5. OCI 标准
Open Container Initiative 定义了三类关键规范:
- Image Specification:镜像清单、配置与层的格式。
- Runtime Specification:如何运行 filesystem bundle。
- Distribution Specification:Registry 的内容分发 API。
遵循 OCI 让 Docker 构建的镜像可以被兼容运行时和 Registry 使用,但不同产品的扩展特性、认证方式和默认行为仍可能不同。
6. 请求到进程的完整链路
执行:
docker run --name web -p 8080:80 nginx:alpine大致发生以下步骤:
- CLI 解析参数并调用 Engine API。
- daemon 解析
nginx:alpine;本地不存在时向 Registry 获取 manifest。 - Registry 根据宿主机平台返回对应 manifest,内容层按 digest 下载并校验。
- daemon 创建容器配置、可写层和网络端点。
- containerd 建立 task,runc 创建 namespaces/cgroups 并应用安全配置。
- 容器内 PID 1 启动镜像的
ENTRYPOINT与CMD。 - 端口发布规则把宿主机 8080 转发到容器 80。
7. Engine API 兼容
CLI 与 daemon 通过带版本的 API 通信。新 CLI 通常能与一定范围内的旧 daemon 协商,但新功能会受服务器 API 限制。
docker version --format '{{json .}}'
docker version --format 'client={{.Client.Version}} api={{.Client.APIVersion}} server={{.Server.Version}} api={{.Server.APIVersion}}'仅在兼容性排查中临时固定 API:
export DOCKER_API_VERSION=1.49
docker version
unset DOCKER_API_VERSION不要长期强制旧 API;它会隐藏新能力,并可能让行为与本地 CLI 文档不一致。
8. Engine 29 升级重点
Engine 29.0 引入了破坏性变更和废弃项,升级跨大版本前必须阅读完整发布说明。特别注意:
- 新安装默认使用 containerd image store;旧安装可能仍保留经典 graphdriver 状态。
- nftables 后端在 29.0 中仍以实验方式引入,不能把实验特性直接视为生产默认。
- API 最低兼容范围、网络行为、镜像存储、废弃参数可能变化。
- 29.7.0 将
imagemount 类型转为非实验能力,并增加默认停止超时配置;29.7.2 修复了 29.7.0 的镜像拉取及旧内核权限回归。
升级策略见维护、备份与升级。
9. 现场信息采集
出现版本或运行时问题时,先保存:
docker version
docker info
docker context inspect "$(docker context show)"
docker compose version
docker buildx version
docker buildx ls
uname -a
cat /etc/os-releasedocker info 可能包含 registry 地址、代理和节点标签。对外分享前应脱敏。
10. 官方参考
继续阅读
- 命令
- 命令
- 故障排查