更新 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 版本:

版本号遵循语义化版本规范:major.minor.patch。在这个例子中,29 是主版本,1 是次版本,3 是补丁版本。
要获取关于 Docker 设置的更多详细信息,可以运行这个命令:
docker info

它会输出大量关于 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 设置,找到“检查更新”选项。你可以在这里禁用自动更新,并根据需要手动检查。

手动更新 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 正在正常工作:

Docker Engine 更新后如何更新容器镜像
更新 Docker Engine 不会更新你的容器镜像,你需要单独处理它们。
拉取更新的镜像版本
你可以运行 docker pull 命令来获取镜像的最新版本:
docker pull postgres
这会拉取带有 latest 标签的最新版 PostgreSQL 镜像。但这并不总是意味着你所认为的“最新”,它只是镜像维护者可以指向任何版本的标签而已。
我个人建议,为了避免不必要的惊喜,最好始终明确指定标签:
docker pull postgres:18

这会专门拉取 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 的所有知识。
关于
关注我获取更多资讯