我的docker随笔48:Docker版本号演进史

本文介绍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 loaddocker savedocker 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,秉持稳字当头、够用即可的原则,暂不盲目跟进新版本迭代。如工作有需求,再进行更新。

附录

相关推荐
阿拉雷️2 小时前
部署实战】Docker + AI Agent:让AI一键部署Spring Boot到服务器,从打包到上线只要一条指令
人工智能·spring boot·docker
雨声不在2 小时前
macos 12使用docker
macos·docker·容器
BullSmall17 小时前
Anolis OS 8.10 完整安装 Docker CE(生产可用,解决 podman 冲突)
docker·容器·podman
梦梦代码精20 小时前
开源AI应用平台BuildingAI解析:插件化架构、应用市场与热门案例
人工智能·机器学习·docker·开源
IT瑞先生1 天前
Docker快速部署Mysql的三种方法——实操篇
mysql·adb·docker
梦远青城1 天前
Docker 部署python的paddle进行OCR文字识别身份证
python·docker·ocr·paddle·身份证识别
java_logo1 天前
ELK Docker Compose 部署指南:轻松搭建日志检索平台
elk·elasticsearch·docker·容器·kibana·logstash·轩辕镜像
ShallWeL1 天前
Orin 上用 Docker 跑通目标检测功能
人工智能·目标检测·docker·容器
辰同学ovo1 天前
用“舞台换景”讲清 Docker 的 Restart 与 Recreate
运维·docker·容器