综合 Docker Engine v29 升级笔记:最低 API 提到 1.44,新装默认 containerd image store

2026-09-13 21:04:19

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.tar
    
  • docker image ls 默认启用新视图(类似 --tree 但折叠),不再默认显示未打 tag 的镜像。

  • GET /containers/json 新增 Health 字段,描述健康检查状态。

  • Windows 上支持 docker run --runtime

  • docker service create/update 支持 memory-swapmemory-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 也已发布。
复制全文 生成海报 Docker 运维 容器 containerd 升级 docker desktop

推荐文章

程序员茄子在线接单