在线生产服务器上的重大 Docker Engine 升级
为什么要升级
28 到 29 版本的迁移本应是例行维护。Docker Engine 的小版本升级通常是无痛的。让这次升级复杂化的是同时将 Docker Compose 从 v2 升级到 v5——后者包含了影响我们几个 compose 文件的破坏性变更。
触发因素是安全公告:Docker Engine 28 存在已知的网络驱动漏洞,该漏洞已在版本 29 中修复。推迟升级是不可行的。
升级前的准备工作
我们从对所有运行中容器的完整快照开始,包括其网络配置、卷挂载点以及健康检查状态。这需要约 45 分钟,并为我们提供了一个精确的回滚基准。
接下来是 compose 文件审计。Docker Compose v5 删除了一些在 v2 中已弃用但仍可运行的功能——特别是某些 links 语法和旧版网络别名格式。我们在 17 个 compose 文件中发现了需要更新的地方。
实际升级过程
升级本身遵循标准的包管理流程:停止非关键容器,升级 Docker 软件包,升级 Compose 插件,重启 Docker daemon,逐批重启容器,每批之间进行健康检查。
我们遇到的第一个问题出现在重启时:三个容器因 compose 文件中的弃用语法而无法启动。由于我们在审计阶段已识别出这些问题,修复只需几分钟。
出乎意料的收获
Docker Compose v5 的启动速度明显更快。对于超过 20 个服务的大型 compose 栈,docker compose up 的速度提升约 40%。在部署密集的工作流程中,这实际上很有意义。
新的健康检查等待行为也更加可靠——v5 在标记容器健康之前,会更严格地遵守 start_period 配置。
如果需要回滚
我们没有遇到需要回滚的情况,但流程已经准备好了:通过包管理器降级 Docker Engine,还原 compose 文件备份,从快照重启容器。整个过程预计需要 20 分钟。有这个计划在手,实际升级感觉风险小多了。