Docker 更新指南:安全、高效的实践路径

本文深入探讨了 Docker 更新的多个维度,包括 Docker Engine、Docker Desktop 和容器镜像的更新。作为一名资深技术专家,我将分享如何安全、高效地执行这些更新,避免常见问题,并给出实用的最佳实践,帮助开发者维护一个稳定可靠的 Docker 环境。

阅读时长: 11 分钟
共 5017字
作者: eimoon.com

更新 Docker 听起来是个简单的操作,但实际上它包含了三个完全不同的概念:你可能需要更新的是 Docker Engine、Docker Desktop,或者是你的容器镜像。很多开发者对此并不清楚,要不就是盲目更新所有东西,结果弄坏了现有配置;要不就是完全不更新,让自己面临各种安全风险。

我认为,安全地更新 Docker 的关键,在于搞清楚你到底在更新什么,并针对不同的场景采取正确的步骤。在本文中,我将以一个技术专家的视角,带大家逐一击破这些疑问,讲解每种更新的实际作用、何时需要它们,以及如何一步步安全执行,确保你现有的容器安然无恙。

如果你是 Docker 新手,建议先从 Docker 入门课程开始,打好基础再来关注更新和维护。

“更新 Docker”到底意味着什么?

正如我之前提到的,“更新 Docker”这个词语可以指代三个不同的东西。把它们搞混,很可能就会不小心弄坏一个原本能正常运行的系统。你可能是在更新 Docker Engine(运行容器的核心软件)、Docker Desktop(桌面版图形界面应用程序),或者你的应用所依赖的容器镜像。

每种更新对你的系统影响都不一样,我来细细解释。

更新 Docker Engine 与更新容器镜像

Docker Engine 是管理你所有容器的运行时。

当你更新 Docker Engine 时,你实际上是在升级系统上创建、运行和管理容器的核心软件。这属于系统层面的修改,会影响 Docker 的整体运作方式。简单来说,你在安装新的二进制文件,更新后台守护进程,甚至可能改变 Docker 与操作系统交互的方式。

容器镜像 则是你的容器运行所依赖的“蓝图”。

更新镜像意味着拉取容器内打包应用的更新版本。举个例子,如果你正在一个容器里跑 PostgreSQL 14,想升级到 PostgreSQL 18,那么更新镜像就是拉取那个新版本。Docker Engine 本身并没变,变化的只是你容器内部的软件。

这里最关键的一点是:更新 Docker Engine 可能会影响你所有的容器,而更新单个镜像只影响那些从该特定镜像构建的容器。

运行中的容器会怎样?

Docker Engine 的更新通常不会自动重启你的容器。

在 Linux 系统上更新 Docker Engine 时,Docker 守护进程会重启,但在大多数现代配置下,你的容器会继续运行。Docker 有一个叫 “实时恢复”(live restore) 的功能,它能在守护进程更新时保持容器的运行状态。你可以通过运行 docker info 命令,查找 “Live Restore Enabled: true” 来检查它是否启用。

Docker Desktop 则完全是另一回事了。

在 macOS 和 Windows 上,更新 Docker Desktop 会停止所有运行中的容器。整个 Docker VM 会在更新过程中重启。你的容器在更新完成后不会自动启动,你需要手动启动它们,或者使用重启策略。

镜像更新需要你重新创建容器。

拉取新版镜像对正在运行的容器没有任何影响。如果你想使用更新后的镜像,你需要停止旧容器,删除它,然后从更新后的镜像创建一个新容器。

这就是理解 Engine 更新和镜像更新之间区别的重要性。一个可能需要提前计划停机时间,而另一个则不然。

为何要更新 Docker?

过时的 Docker 版本会让你暴露在已知的安全漏洞和兼容性问题之下。如果这还不足以让你信服,那么请继续往下看。

安全与稳定性

每一个 Docker 发布版本都会修复之前版本中发现的安全漏洞。

运行旧版本意味着你容易受到攻击者已知漏洞的利用。安全研究人员和 Docker 社区会积极发现并报告这些问题,而 Docker 公司会在新版本中进行修复。如果你不更新,就像是给攻击者敞开了大门。

同样,稳定性也会随着每个版本的发布而提升。新版本中的错误修复解决了很多困扰用户的问题,这些问题甚至可能导致你的生产环境容器崩溃。

你无需在新版本一发布就立即更新,但如果跳过好几个月的更新,你就错过了几十个安全补丁和稳定性改进。

与现代系统的兼容性

无论你是否更新 Docker,操作系统和开发工具都在不断进步。

你的操作系统会收到更新,你的 CI/CD 工具会获得新功能,像 Kubernetes 这样的编排平台最终也会停止支持旧的 Docker 版本。如果你还在用两年前的 Docker,你会先看到兼容性警告,然后是错误,最后可能完全无法使用。

现代容器镜像也期望更新的 Docker 功能。镜像构建者会使用多阶段构建、BuildKit 优化以及更新的存储驱动,这些都是旧版 Docker 不支持的。你可能拉取一个镜像,但它在你的老旧环境中根本跑不起来。

如果你打算将 Docker 与编排工具一起使用,我们的 Kubernetes 入门课程是一个很不错的开始。

如何查看你当前的 Docker 版本

在更新之前,最好先检查你当前的 Docker 版本。

验证已安装的版本

运行这个命令可以查看你当前的 Docker 版本:

docker --version

这会显示你系统上安装的 Docker Engine 版本:

Image 1 - Docker version command

版本号遵循语义化版本规范:major.minor.patch。在这个例子中,29 是主版本,1 是次版本,3 是补丁版本。

要获取关于 Docker 设置的更多详细信息,可以运行这个命令:

docker info

Image 2 - Docker info command

它会输出大量关于 Docker 安装的信息,包括服务器版本、存储驱动、内核版本,以及像“实时恢复”这样的功能是否启用。基本更新通常不需要这么多信息,但对于排查问题来说,它很实用。

判断是否需要更新

次版本更新通常是安全的,应该定期应用。

如果你当前是 Docker 29.1.0,而 29.1.3 版本可用,这属于次要更新,包含了错误修复和安全补丁。这类更新很少会出问题,有空的时候就应该应用。

**主版本更新则需要更加谨慎。**从 Docker 24 跳到 Docker 29 可能引入重大变更、废弃功能或新的要求。在跨主版本更新之前,务必查看目标版本的 Docker 发布说明,了解具体有哪些变化。

你可以在 Docker 官方文档或 GitHub 发布页面上找到最新的 Docker 版本。将其与 docker --version 显示的版本进行比较,就能知道你落后了多少。

如何更新 Docker Engine

更新过程取决于你是在 Linux 上运行 Docker Engine,还是在 macOS/Windows 上使用 Docker Desktop。

在 Linux 上更新 Docker

Linux 使用系统自带的包管理器来更新 Docker Engine。

具体命令因发行版而异,但过程大致相同:

  • 更新你的软件包列表
  • 升级 Docker

以下是在 Ubuntu 和 Debian 系列系统上的操作步骤:

sudo apt update
sudo apt upgrade docker-ce docker-ce-cli containerd.io

对于基于 Red Hat 的系统,如 CentOS 或 Fedora,运行以下命令:

sudo yum update docker-ce docker-ce-cli containerd.io

Docker 守护进程会在更新期间自动重启。

如果你的实时恢复功能已启用(通过 docker info 检查),那么运行中的容器会继续保持运行。如果没有启用,它们会停止,你需要手动启动它们。

更新完成后,你可以验证新版本:

docker --version

如果你是使用便利脚本而不是包仓库安装的 Docker,你需要再次下载并运行该脚本来更新。

在 macOS 和 Windows 上更新 Docker Desktop

Docker Desktop 的更新方式与 Linux 上的 Docker Engine 不同。

默认情况下,自动更新是启用的。Docker Desktop 在启动时会检查更新,并在新版本可用时显示通知。点击通知,Docker Desktop 就会自动下载并安装更新。

如果你偏爱手动更新,可以打开 Docker Desktop 设置,找到“检查更新”选项。你可以在这里禁用自动更新,并根据需要手动检查。

Image 3 - Docker update through Docker Desktop

手动更新 Docker 也是完全没问题的。

你只需从 Docker 官网下载最新的 Docker Desktop 安装程序并运行它。安装程序会检测你现有的安装并进行升级,而不会删除你的镜像或容器。

不过要记住,Docker Desktop 在更新期间会停止所有容器。 整个 Docker VM 会重启,所以请预留几分钟的停机时间。你的容器不会自动重启,除非你配置了 --restart always 这样的重启策略。

更新后,打开 Docker Desktop 并等待它完全启动,然后再运行 docker --version 确认新版本。

单独管理多个容器可不是什么值得骄傲的事。查阅我们的 Docker Compose 指南来学习如何进行多容器构建。

如何验证 Docker 更新

Docker 现在应该已经更新了,但我们还是要验证一下是否真是如此。

确认已安装的版本

首先,检查版本号:

docker --version

输出应该显示你的目标版本。如果仍然显示旧版本,说明更新没有正确完成,或者你需要重启你的终端来加载新的二进制文件。

我电脑上的版本没变,那只是因为我本来就是最新版。

下一步是检查 Docker 守护进程的状态:

docker info

如果它报错“Cannot connect to the Docker daemon”,说明守护进程没有运行。在 Linux 上,用下面的命令重启它:

sudo systemctl restart docker

在 macOS 和 Windows 上,只需打开 Docker Desktop 并等待它启动即可。

在我们的最新文章 18 个常用 Docker 命令中,学习日常容器操作的必备命令。

运行一个测试容器

为了验证更新后没有出什么岔子,可以尝试拉取并运行一个简单的容器:

docker run hello-world

这个命令会拉取小巧的 hello-world 镜像并运行它。你将看到一条消息,表明 Docker 正在正常工作:

Image 4 - hello world container

Docker Engine 更新后如何更新容器镜像

更新 Docker Engine 不会更新你的容器镜像,你需要单独处理它们。

拉取更新的镜像版本

你可以运行 docker pull 命令来获取镜像的最新版本:

docker pull postgres

这会拉取带有 latest 标签的最新版 PostgreSQL 镜像。但这并不总是意味着你所认为的“最新”,它只是镜像维护者可以指向任何版本的标签而已。

我个人建议,为了避免不必要的惊喜,最好始终明确指定标签:

docker pull postgres:18

Image 5 - Pulling new images

这会专门拉取 PostgreSQL 18 版本。如果 18.1 版本发布了,再次运行此命令将拉取更新后的 18.1 镜像,但仍会保持在 18 系列内。

对于其他镜像,首先用 docker images 命令检查它们的当前版本。然后根据需要拉取更新的版本。你现有的容器会继续运行旧镜像,直到你用新镜像重新创建它们。

重建自定义镜像

如果你用 Dockerfile 构建自己的镜像,那么在拉取基础镜像更新后,你需要重建它们。

假设你的 Dockerfile 以 FROM python:3.14 开始。即便你拉取了最新的 python:3.14 镜像,你的自定义镜像仍然使用旧的缓存层。你需要重建它来获取更新:

docker build --no-cache -t myapp:latest .

这会忽略所有缓存层,并从头开始重建所有内容。虽然耗时更长,但它能确保你使用的是最新鲜的基础镜像和依赖项。

重建之后,停止你的旧容器,并用更新后的镜像启动新容器——更新不会自动应用于运行中的容器。

更新后需要释放磁盘空间吗?我们的 Docker Prune 教程会教你如何安全地清理未使用的镜像和容器。

常见的 Docker 更新问题

Docker 更新失败的方式其实很有迹可循,而且大多数问题都能快速解决。我来分享几个我个人遇到过的。

权限、服务和安装错误

“Permission denied”错误意味着你的用户无法访问 Docker 套接字。

在 Linux 上,将你的用户添加到 docker 组:

sudo usermod -aG docker $USER

注销并重新登录,使更改生效。之后,你运行 docker 命令就不再需要 sudo 了。

“Cannot connect to the Docker daemon”错误意味着 Docker 没有运行。

检查服务状态:

sudo systemctl status docker

如果它已停止或失败,启动它:

sudo systemctl start docker

如果它无法启动,请使用 journalctl -u docker 检查日志,看看是哪里出了问题。

在 macOS 和 Windows 上,只需启动 Docker Desktop 应用即可。

安装期间的包冲突发生在旧的 Docker 包干扰新的 Docker 包时。

你可以运行此命令来删除旧的 Docker 包,然后再安装更新版本:

sudo apt remove docker docker-engine docker.io containerd runc

然后按照你的发行版官方安装说明重新安装 Docker。

回滚或降级 Docker

如果更新破坏了你的配置,你可以降级到以前的版本。

在 Linux 上,在你的包管理器中查找可用版本:

apt list -a docker-ce

安装特定的旧版本:

sudo apt install <specific-version>

<specific-version> 替换为你需要的版本。在降级过程中,你的容器和镜像会保持完整。

对于 macOS 和 Windows,回滚更简单。从 Docker 的发布存档中下载旧的安装程序并运行它。安装程序会用旧版本替换当前版本,而不会触及你的容器或镜像。

Docker 更新的最佳实践

最好的建议是定期更新 Docker。如果你已经好几年没更新了,强烈建议你查阅发布页面,看看有没有什么重大变更。

安全地保持 Docker 最新

设定一个提醒,定期检查 Docker 更新,而不是等到出问题才行动。

我一般每月检查一次更新——不是说每次更新都要安装,而是需要知道有哪些更新可用。而且,你需要一个提醒机制。安全补丁的重要性高于功能更新,所以当它们发布时,优先处理。

一个好的习惯是,在更新前记录下你当前的设置。记下你的 Docker 版本,用 docker ps 列出正在运行的容器,并记录任何自定义配置。如果出了问题,你就能清楚知道哪里变了。

如果你在生产环境中运行 Docker,务必先在开发机上测试更新。搭建一个类似的环境,在那里更新 Docker,并确保你的容器仍然正常工作,然后再去动生产环境。

何时自动化更新

对于停机时间不重要的开发环境,自动化是有意义的。

你可以配置 Docker Desktop 自动更新,或者在 Linux 上为安全补丁设置无人值守升级。这对于本地开发机器来说很管用,因为重启不会中断关键服务。

但千万不要在没有适当保护措施的情况下自动化生产环境的更新。

你需要在将更新应用到运行实际工作负载的系统之前,进行监控、制定回滚策略和进行充分测试。Docker 更新可能会出问题——对于生产系统,我倾向于认为应该有人工参与。

我个人更喜欢通过每月提醒手动更新,到目前为止都还没出过任何问题。

总结

更新 Docker 的第一步是搞清楚你到底在更新什么。

Docker Engine 更新、Docker Desktop 更新和容器镜像更新是三码事,它们对你系统影响不同。了解你需要哪种更新,根据你的平台采取正确的流程,然后进行测试。就是这么简单。

在手机上设置一个提醒吧。每月检查更新,优先处理安全补丁,并在更改任何东西之前做好记录。更新不应该让你焦虑不安——它应该是一项例行的维护任务。

对于生产环境,请记住你的容器依赖于 Docker 的正常运行。对待更新,要像对待任何其他关键基础设施变更一样谨慎——深思熟虑,充分测试,并准备好回滚计划,以防万一。

现在你已经知道如何更新 Docker 了——下一步是用我们的 Docker 中级课程来进一步提升你的容器技能。你将学习到关于网络、高级容器镜像和 Docker Compose 的所有知识。

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计