本文介绍Docker版本号演进历史。
1、前言
古语有云:天下大势,分久必合,合久必分。技术生态的迭代演进,同样遵循这一底层规律。一款产品从单一开源项目走向成熟商业化,必然会经历架构拆分、定位细分、权责剥离的过程。Docker的版本规则变更(从 SemVer 到 CalVer,再回归到 SemVer)和项目主体更名,似乎是这一技术发展大势的典型缩影。
Docker 在十余年的发展历程中经历了几次重要调整。本文将梳理 Docker Engine 版本号的演变历史。并详细介绍从 23.0.0 回归 SemVer 以来的各个主要版本及其关键变更。
2、版本号规则的历史变迁
第一阶段:传统 SemVer 时期(2013 -- 2017.02)
Docker 诞生之初使用标准的三段式语义化版本号(Semantic Versioning,简称 SemVer),格式为 MAJOR.MINOR.PATCH:
| 版本示例 | 发布时间 |
|---|---|
1.0.0 |
2014-06-08 |
1.13.1 |
2017-02-08 |
第二阶段:CalVer 日历化版本时期(2017.03 -- 2022)
2017年3月,17.03.0版本发布。从此,Docker 改用基于时间的日历化版本号(Calendar Versioning,简称 CalVer),格式为 YY.MM.patch:
YY:年份后两位MM:月份patch:补丁版本号(可选)
例如 17.03.0-ce 代表 2017 年 3 月发布的社区版(Community Edition),20.10.23 代表 2020 年 10 月发布的第 23 个补丁。
在此期间,Docker 还通过版本后缀区分发行渠道:其中-ce表示社区版(Community Edition),-ee表示企业版(Enterprise Edition)。注:但从 19.03 开始,社区版不再标注 -ce 后缀。
短短一个月之后,即2017年4月,在美国奥斯汀(Austin)举办的 DockerCon 技术大会上,Docker 底层核心开源项目正式官宣更名Moby。代码仓库也从原来的 docker/docker 迁移到 moby/moby 仓库,并拥有了项目自己的 Logo。其中 Moby 由社区维护,Docker-CE 由 Docker 公司维护,Docker-EE 是 Docker 公司闭源的商业产品。
此次更名意义非凡,它彻底厘清了项目与产品的权责边界,完成了技术生态的精准拆分:Moby 作为纯粹的开源底层项目,全权交由全球社区自主迭代维护,保持开源技术的开放性与活跃度;Docker CE 由 Docker 公司官方运营维护,面向大众提供标准化免费容器服务;Docker EE 则作为闭源商业产品,承载公司商业化营收与企业级定制服务,形成"开源打底、商业赋能"的完整生态格局。
第三阶段:SemVer 回归(2023.02 至今)
在 23.0.0-rc.1 的发布页面中,Docker 官方正式宣布放弃 CalVer,回归 SemVer。原文如下:
Starting with the 23.0.0 release, we're moving away from using CalVer versioning, and use versioning that's using SemVer format. Changing the version format is a stepping-stone towards go module compatibility, but the repository does not yet use go-modules, and still requires using a "+incompatible" version; we'll be working towards go module compatibility in a future release.
中文试译如下:
从 23.0.0 版本开始,我们将不再使用 CalVer 版本号,转而采用 SemVer 格式的版本号。更改版本格式是迈向 Go module 兼容性的一步,但仓库目前尚未使用 go-modules,仍需要 "+incompatible" 版本后缀;我们将在未来的版本中继续推进 Go module 的兼容性。
回归 SemVer 的核心原因是为了与 Go module 的版本机制兼容------CalVer 格式无法被 Go module 原生命名规则正确解析,导致每次引用都需要添加 +incompatible 后缀。
3、SemVer 回归后各主要版本一览
以下列出从 23.0.0 开始的所有主要版本、发布日期及核心变更内容:
23.0.0(2023-02-02)
| 项目 | 内容 |
|---|---|
| 状态 | 已停止维护 |
核心变更:
- Buildx/BuildKit 成为默认构建器 :
docker build命令现在直接映射为docker buildx build,旧版构建器需显式设置DOCKER_BUILDKIT=0才能使用。 - Swarm 新能力 :新增实验性集群卷(CSI)支持、SwarmKit 作业、
docker stack config预览命令。 - 网络增强 :支持 RFC 3021 点对点
/31和单主机/32网段;ipvlan驱动新增l3s模式。 - CLI 改进 :
docker completion自动生成 shell 补全、docker stop/restart --signal指定信号、dockerd --validate验证配置文件。 - 移除项 :彻底移除 LCOW(Windows 上的 Linux 容器)支持、移除
~/.dockercfg旧配置读取、移除过时 overlay 网络与外部键值存储选项。 - 安全增强 :容器
hostconfig.json权限设为0600,Seccomp 配置全面重构。
24.0.0(2023-05-17)
| 项目 | 内容 |
|---|---|
| 状态 | 已停止维护 |
核心变更:
- Containerd 内容存储实验性支持:首次支持将 containerd 作为镜像存储后端,替代传统 graphdriver。
--host支持 SSH 路径 :docker -H ssh://host/path可指定远程主机的 Docker 套接字路径。- 默认网络选项配置 :新增
--default-network-opt守护进程标志。 - OCI 运行时注解 :支持通过
--annotation为容器设置 OCI 运行时注解。 - 移除项 :移除
AUFS和旧版overlay存储驱动、移除加密 Swarm overlay 网络中对xt_u32内核模块的依赖、移除经典 Swarm 相关未使用代码。 - 性能优化 :大幅减少
overlay2下容器启动的开销。
25.0.0(2024-01-19)
| 项目 | 内容 |
|---|---|
| 状态 | 仍维护中 |
核心变更:
- OpenTelemetry 追踪:支持分布式链路追踪,方便可观测性集成。
- 日志格式切换 :
dockerd新增--log-format标志,支持文本(默认)或 JSON 格式。 - 递归只读挂载:内核 5.12+ 的主机上,只读绑定挂载默认为递归只读。
- CDI 设备支持:Linux 下支持容器设备接口(Container Device Interface),简化 GPU 等硬件集成。
- IPv6 增强:支持基于 IPv6 传输的覆盖网络,指定 IPv6 子网时自动启用 IPv6。
- 多网络配置 :支持通过
docker run一次指定多个--network标志。 - 移除项 :移除已弃用的
devicemapper存储驱动程序、移除 Debian Upstart 初始化系统支持。 - API 升级 :升级至 API v1.44,移除
VirtualSize字段。
26.0.0(2024-03-21)
| 项目 | 内容 |
|---|---|
| 状态 | 已停止维护 |
核心变更:
- 卷子路径挂载(Volume Subpath) :支持
--mount type=volume,volume-subpath=<路径>,多个容器可共享同一卷的不同子目录。 - Rootless 模式主机环回 :设置环境变量后容器内可通过
10.0.2.2固定 IP 访问宿主机。 - Containerd 镜像存储优化 :
docker image ls不再显示多平台镜像的重复条目,并开始暴露 Prometheus 指标。 - 安全修复 :修复 CVE-2024-29018,阻止仅连接
internal网络的容器通过外部 DNS 服务器泄露数据。
27.0.1(2024-06-25)
注:
27.0.0因 GitHub 预发布标签错误被意外创建,官方实际未发布此版本,27.0 系列的第一个正式版本为27.0.1。
| 项目 | 内容 |
|---|---|
| 状态 | 已停止维护 |
核心变更:
- ip6tables 默认启用 :Linux 桥接网络默认开启
ip6tables,IPv6 不再是实验性功能,实现 IPv4 与 IPv6 行为一致。 - 自动 ULA 前缀:创建支持 IPv6 的桥接网络时,自动使用从主机 ID 派生的唯一本地地址(ULA)前缀。
- IPv6 直接路由模式 :新增
gateway_mode_ipv6=routed驱动选项,支持 IPv6 直接路由(无需 NAT)。 default-address-pools增强 :支持任意大小的 IPv6 地址池,可在daemon.json中默认启用 IPv6。- 安全增强 :允许
--privileged与自定义 seccomp 配置文件结合使用。 - Rootless 增强:内核 ≥ 5.11 时支持原生 overlay diff。
28.0.0(2025-02-20)
| 项目 | 内容 |
|---|---|
| 状态 | 已停止维护 |
核心变更:
- 镜像挂载 :全新
--mount type=image支持将镜像内容直接挂载到容器内部,支持image-subpath挂载特定路径。 - 网络重大重构 :
- 旧版
docker-proxy与新dockerd不兼容,rootlesskit-docker-proxy不再使用。 - bridge 和 macvlan 网络中容器接口使用随机生成的 MAC 地址。
- IPv6 地址由 IPAM 分配(不再从 MAC 地址派生),禁用重复地址检测以加速启动。
- 新增
nat-unprotected(直接路由访问)和isolated(内部网络无宿主机地址)网关模式。 - 端口发布安全加固:已发布端口的行为变更,未发布端口被默认阻止直接访问。
- 引入
ipset依赖。
- 旧版
- 多平台操作增强 :
docker load、docker save、docker history新增--platform标志。 - 移除项 :移除外部 graph-driver 插件支持、移除
api-cors-header配置、移除对推送不可分发制品的支持。
29.0.0(2025-11-11)
| 项目 | 内容 |
|---|---|
| 状态 | 当前主力维护版本 |
29.0.0 是去年最重要的一次底层架构升级。官方发布附带了如下说明:
This release includes several breaking changes and deprecations. Review the release notes carefully before upgrading.
Experimental support for nftables can now be enabled by setting Docker daemon's firewall-backend option to nftables. For more information, see Docker Engine docs.
containerd image store is now the default for fresh installs. This doesn't apply to daemons configured with userns-remap (see moby#47377).
中文翻译:
本次发布包含多项破坏性变更和弃用项。升级前请仔细阅读发布说明。
现在可以通过将 Docker 守护进程的
firewall-backend选项设置为nftables来启用对 nftables 的实验性支持。更多信息请参阅 Docker Engine 文档。containerd 镜像存储现已成为全新安装的默认选项。此变更不适用于配置了
userns-remap的守护进程(参见 moby#47377)。
核心变更:
- Containerd 镜像存储默认启用:全新安装默认使用 containerd image store,不再使用传统 graphdriver。现有环境不会被自动迁移,旧驱动仍可用但已标记弃用。好处包括架构更简洁,解锁按需拉取、远程存储、P2P 分发等能力,与 Kubernetes 生态更一致。
- nftables 实验性支持 :通过
"firewall-backend": "nftables"直接创建 nftables 规则,不再依赖 iptables 兼容层。注意此为实验性功能,不建议在生产环境启用,且暂不支持 Swarm 模式。 - 最低 API 版本上调至 1.44 :不再支持 v25 之前的旧版客户端,连接时收到
"client version 1.43 is too old"错误。 - Moby 项目迁移至 Go modules :依赖管理从 vendor 切换至
go.mod,彻底解决了此前+incompatible的问题,改善安全扫描和 CI/CD 流程。
4、版本编号对照总结
| 版本 | 发布日期 | 版本规则 | 关键主题 | 当前状态 |
|---|---|---|---|---|
23.0.0 |
2023-02-02 | SemVer 回归 | BuildKit 默认,Swarm CSI | 已停止 |
24.0.0 |
2023-05-17 | SemVer | containerd 存储实验性 | 已停止 |
25.0.0 |
2024-01-19 | SemVer | OpenTelemetry,CDI 设备 | LTS 维护 |
26.0.0 |
2024-03-21 | SemVer | volume-subpath | 已停止 |
27.0.1 |
2024-06-25 | SemVer | IPv6 全面启用 | 已停止 |
28.0.0 |
2025-02-20 | SemVer | 镜像挂载,网络重构 | 已停止 |
29.0.0 |
2025-11-11 | SemVer | containerd 默认,nftables | 主力维护 |
5、结语
Docker 的版本号从 SemVer 起步,到 CalVer 的七年,再到 SemVer 的回归,其三段式演进的本质,是项目定位迭代的缩影:
- 早期小规模开源阶段:简单 SemVer,满足基础兼容管理;
- 规模化商用阶段:CalVer 日历版本,适配固定季度发布节奏,方便运维识别发布时间;
- 云原生深度集成阶段:回归 SemVer,对齐 Go 语言生态与 OCI 容器标准,解决依赖、兼容性、自动化工具链痛点。
从功能演进来看,23.0--29.0 这几版的主线非常清晰:全面拥抱 containerd 生态、淘汰 iptables、完善 IPv6 支持。对于运维团队而言,了解这些版本的差异和变更方向,有助于制定合理的升级策略,避免踩坑。
当前生产环境还在使用 23.x--27.x 的用户,建议优先评估升级到 25.0(仍有安全维护)或直接迁移到 29.x(主力版本),享受 containerd 原生镜像存储和 nftables 带来的现代化体验。
注:目前笔者开发维护项目使用的版本为20.10,考虑到主力机器依然为CentOS7,秉持稳字当头、够用即可的原则,暂不盲目跟进新版本迭代。如工作有需求,再进行更新。
附录
- Moby 官方发布仓库:https://github.com/moby/moby/releases
- 本文数据来源于 endoflife.date、VersionLog 以及 Docker 官方文档
- 本文版本时间、变更内容均来自 Moby GitHub 发布的原始说明文档