Docker Engine v29 升级笔记:最低 API 提到 1.44,新装默认 containerd image store
Docker Engine v29(29.0.0,2025-11-10)已发布。本文只针对直接在主机上运行 Docker Engine (Community Edition) 的 Linux 用户;Docker Desktop 用户不需要做任何操作。
- 发布说明:https://docs.docker.com/engine/release-notes/29/
- 官方博客:https://www.docker.com/blog/docker-engine-version-29/
- GitHub Release:https://github.com/moby/moby/releases/tag/docker-v29.0.0
最低 API 版本提升到 1.44
Docker 版本早于 v25 已 EOL。v29 的守护进程现在要求 API 版本 v1.44 或更高(对应 Moby v25)。旧客户端调用会直接报 Minimum supported API version 错误,处理方式见官方博客。
containerd 镜像存储成为新装默认
从 v29 起,containerd image store 成为新安装实例中镜像层与内容管理的默认实现。旧的 graph drivers 仍然可用,但已标记弃用,新装也可以通过 opt-out 关掉 containerd image store。
这次切换解锁的是 snapshotter 层面的能力:懒加载、远程内容存储、P2P 分发,与 containerd 生态的对齐也更好。graph driver 后端会在未来版本中移除。
影响范围仅限新装:存量用户不会被强制迁移,但可以现在就 opt-in 迁移,提前把路径跑通。
Moby 迁移到 Go modules
Moby 代码库现在完全 module-aware,仓库里有 go.mod。Go 模块路径的变化:
// 已弃用
import "github.com/docker/docker"
// 改用
import (
"github.com/moby/moby/client"
"github.com/moby/moby/api"
)
github.com/moby/moby 本身被视为内部实现细节,不保证稳定。从 v29 起,release tag 统一加 docker- 前缀,例如 docker-v29.0.0。这一项只影响 Go 模块使用者和包维护者,不涉及普通容器用户。
nftables 实验防火墙后端
Linux 上的 bridge 与 overlay 网络,可以改为让 Docker 创建 nftables 规则而不是 iptables:把守护进程的 firewall-backend 选项设为 nftables。
这条路径在 firewalld 主机上更干净——iptables 规则必须经由 firewalld 已弃用的 direct 接口创建,nftables 不需要。
初始版本中 nftables 支持标记为 experimental。Swarm 支持计划在后续版本提供,目前不能在启用了 Swarm 的节点上启用 nftables。未来版本 nftables 会成为默认防火墙后端,iptables 支持届时被弃用。
其他新特性与变更
docker image load/save支持--platform做多平台选择,例如:docker image load --platform linux/amd64,linux/arm64 -i image.tardocker image ls默认启用新视图(类似--tree但折叠),不再默认显示未打 tag 的镜像。GET /containers/json新增Health字段,描述健康检查状态。Windows 上支持
docker run --runtime。docker service create/update支持memory-swap与memory-swappiness。29.4.2 起
--mount支持bind-create-src。CLI 插件钩子在命令失败时也会触发(error-hooks)。
29.5.0 起 rootless 默认网络驱动改为 gvisor-tap-vsock,不再安装 slirp4netns。
支持 systemd
Type=notify-reload。为容器默认启用 private time namespace。
29.6.0 新增
GET /images/{name}/attestations,用于获取 in-toto 证明(SLSA provenance、SPDX SBOM)。29.7.0 新增实验性 embedded-containerd(containerd 跑在守护进程内)、image mount type 转正、
default-stop-timeout守护进程选项。29.8.0 新增
--umask与 AppArmor 默认 profile 定制。
弃用与破坏性变更集中在几处:cgroup v1 弃用,支持至少延续到 2029-05;Docker Content Trust 从 CLI 移除,需要的话可以构建为独立插件;多个弃用 API 字段与方法被清理,Go SDK 也移除了弃用包与类型。打包层面,Debian armhf(32 位)包目标为 ARMv7,不再支持 ARMv6,官方 Raspbian(32 位)包不再提供。运行时组件更新到 Go 1.26.5、containerd v2.3、runc v1.4.3。
安全修复
29.7.0 将 github.com/moby/go-archive 更新到 v0.3.0,修复 CVE-2026-17106 / GHSA-hfg8-hc9c-6c3h。近年多个安全修复涉及授权绕过与 BuildKit 漏洞,升级时不要只看主版本号。
升级建议
- 先确认客户端与工具链使用的 API 版本不低于 v1.44,否则会撞上
Minimum supported API version。 - 新装默认走 containerd image store;存量环境可以先 opt-in 迁移验证,不必等到强制切换。
- 启用了 Swarm 的节点暂时不要打开 nftables 防火墙后端。
- 仍依赖 cgroup v1 的环境注意弃用时间线;使用 Docker Content Trust 的流程需要改走独立插件。
- 当前 29.7.2(2026-08-05)是 29 分支最新稳定版本,29.8.0 也已发布。