最有效方式是 apt-mark hold(debian/ubuntu)或 dnf versionlock(rhel/centos/rocky);前者轻量通用,后者支持精确版本号锁定,均需验证生效且可配合源配置排除兜底。

直接锁定当前 Docker 版本,是防止 apt 或 yum 自动升级最有效、最稳妥的方式。关键不是“不升级”,而是让包管理器明确知道“这个版本必须保留”。不同系统用不同机制,但目标一致:阻断自动更新路径。
Debian/Ubuntu 系统:用 apt-mark hold 锁定核心包
Debian 和 Ubuntu 使用 APT 包管理器,apt-mark hold 是官方推荐的轻量级锁定方式,适用于 docker-ce、docker-ce-cli、containerd.io 等主组件。
- 先确认已安装的包名和版本:运行
dpkg -l | grep docker或apt list --installed | grep docker,找出如docker-ce、docker-ce-cli、containerd.io - 执行锁定命令(需 root 权限):
sudo apt-mark hold docker-ce docker-ce-cli containerd.io - 验证是否生效:
apt-mark showhold应列出上述包名;
后续运行sudo apt upgrade时,这些包会显示为 “held back” - 如需解锁(例如主动升级时):
sudo apt-mark unhold docker-ce docker-ce-cli containerd.io
CentOS/RHEL 系统:用 yum-plugin-versionlock 精确锁版本号
YUM/DNF 不支持简单“hold”,但 versionlock 插件 可按具体版本号锁定,更细粒度,适合对版本敏感的生产环境。
- 安装插件:
sudo yum install yum-plugin-versionlock(CentOS 7)
或sudo dnf install 'dnf-command(versionlock)'(RHEL 8+ / CentOS Stream) - 查看当前 Docker 版本:
docker --version得到类似Docker version 24.0.7,再查包名与完整版本:yum list installed | grep docker,输出如docker-ce.x86_64 3:24.0.7-1.el7 - 锁定该精确版本:
sudo yum versionlock add docker-ce-3:24.0.7-1.el7
注意:版本字符串必须完全匹配(含 epoch3:和 release-1.el7) - 查看锁定列表:
yum versionlock list,确认条目存在
通用补充:源配置级屏蔽(辅助防线)
即使做了包锁定,某些场景(如全量 yum update --exclude= 调用)仍可能绕过。可在源配置中加一层排除规则,作为兜底。
- Debian/Ubuntu:
在/etc/apt/preferences.d/docker-pin.pref中写入:Package: docker-ce docker-ce-cli containerd.io<br> Pin: version 5:24.0.7-1~ubuntu~jammy<br> Pin-Priority: 1001
(版本号需从apt-cache policy docker-ce输出中复制) - CentOS/RHEL:
编辑/etc/yum.repos.d/docker-ce.repo,在[docker-ce-stable]段落末尾添加:exclude=docker-ce docker-ce-cli containerd.io
验证锁定是否真正生效
锁定不是一劳永逸,必须验证。最可靠方法是模拟升级:
- 运行
sudo apt update && sudo apt list --upgradable(Ubuntu)或sudo yum check-update(CentOS),确认 Docker 相关包不再出现在可升级列表中 - 尝试强制升级单个包:
sudo apt install docker-ce(Ubuntu)应提示 “Version … is to be installed, but it is held back”sudo yum update docker-ce(CentOS)应提示 “No packages marked for update” 或报错“no package available” - 重启服务不影响锁定,但建议升级后仍运行
sudo systemctl restart docker确保运行时加载新二进制(如果手动替换了)











