在 Ubuntu 22.04 上装 Docker 遇到依赖报错,这其实是老生常谈但确实让人头疼的问题。大多数情况下,这不是 Docker 本身的问题,而是系统环境、源配置或者之前的残留安装冲突导致的。
别慌,按下面这个排查路径走,90% 的依赖错误都能解决。我会把最常见的几种情况拆开说,你对照自己的报错信息对号入座。
1. 核心前提:确认你的“源”对不对
Ubuntu 22.04 自带的 apt 仓库里的 Docker 版本往往比较旧,或者干脆没有。如果你直接跑 sudo apt install docker.io,很容易因为内核模块或依赖包版本不匹配而出错。
正确姿势是添加官方 Docker 源:
# 1. 移除可能存在的旧版本(如果有的话)
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
# 2. 安装前置依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
# 3. 添加 Docker 官方 GPG key
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 4. 设置稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5. 再次更新并安装
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
注意: 如果你在步骤 5 报依赖错误,请看下一步。
2. 常见依赖错误及解决方案
情况 A:E: Unable to correct problems, you have held broken packages.
这是最经典的报错。意思是有些包的版本被锁定了,或者新旧版本冲突,导致 apt 无法自动解决依赖链。
解决方法:
-
检查是否有包被 hold 住:
apt-mark showhold如果有输出,说明某些包被手动锁定版本了。用
sudo apt-mark unhold <包名>解除锁定。 -
尝试修复依赖:
sudo apt --fix-broken install这个命令会尝试自动修复损坏的依赖关系。
-
强制升级关键依赖:
有时候是libseccomp2或libssl3等基础库版本太旧。试着先升级这些:sudo apt upgrade libseccomp2 libssl3然后再重新执行 Docker 的安装命令。
情况 B:conflicts with ... 或 provides ...
这通常是因为你之前通过 snap 或者第三方 PPA 安装了 Docker,和现在要装的 docker-ce 冲突。
解决方法:
-
彻底清理旧环境:
Ubuntu 22.04 默认可能会预装一个 Snap 版本的 Docker(虽然很多用户没察觉)。Snap 版的 Docker 和 apt 版的经常打架。# 如果是 snap 安装的 sudo snap remove docker # 如果是 apt 安装的旧版 sudo apt purge docker* containerd* sudo apt autoremove -
清理配置文件残留:
有时候/var/lib/docker下的数据文件会导致新服务启动失败,虽然不是安装时的依赖错误,但后续会遇到。安装前可以备份后删除:sudo mv /var/lib/docker /var/lib/docker.bak
情况 C:dependency is not satisfied: xxx
这种通常是架构问题。比如你在 ARM 架构(如树莓派、华为鲲鹏服务器)上强行装了 AMD64 的包,或者反过来。
解决方法:
确保你的架构标识符正确。在执行添加源的那一步,$(dpkg --print-architecture) 应该返回 amd64 或 arm64。如果你是在 cross-compiling 或者特殊环境下,可能需要指定 --force-architecture(不推荐,除非你非常确定自己在做什么)。
更常见的情况是:你的 Ubuntu 22.04 不是最新的。
Docker 官方对 Ubuntu 22.04 (Jammy Jellyfish) 的支持要求系统内核较新。如果你的系统是早期发布的 22.04 LTS,内核可能偏旧,导致某些依赖包(如 linux-modules-extra)缺失。
运行以下命令更新系统和内核:
sudo apt update && sudo apt full-upgrade
sudo reboot
重启后,再试一次 Docker 安装。
3. 高级排查技巧:如何精准定位错误
如果上面都没搞定,你需要看具体的报错日志。apt 的报错有时候很模糊,你可以用 -V 参数开启详细模式:
sudo apt install -V docker-ce
或者查看 /var/log/apt/term.log 或 /var/log/dpkg.log,找到最后几行 ERROR 或 Failed 的信息。
另外,还有一个容易被忽视的点:防火墙或网络XX。
在公司内网或有严格XX的环境下,apt 下载依赖包时可能中断,导致部分包只下载了一半,从而引发依赖不一致。
检查方法:
# 检查 apt 是否配置了XX
env | grep -i proxy
# 如果没有配置XX但依然失败,尝试临时关闭XX测试
export http_proxy=""
export https_proxy=""
sudo apt install docker-ce
4. 终极方案:使用脚本一键安装
如果你不想折腾源和依赖,Docker 官方提供了一个便捷脚本,它会自动处理大部分依赖问题(包括添加源、安装组件)。
curl -fsSL https://get.docker.com | bash
警告: 这个脚本以 root 权限运行,请审查内容后再执行。但在绝大多数标准 Ubuntu 22.04 环境中,它是目前解决依赖问题最快、最稳妥的方式。它会绕过 apt 的复杂依赖解析,直接下载并安装 .deb 包。
总结建议
- 先清理: 删掉所有旧的 Docker 相关包(尤其是 snap 版的)。
- 再更新: 确保系统内核和基础库是最新的 (
apt full-upgrade)。 - 加官方源: 不要直接用
apt install docker.io。 - 最后手段: 用官方安装脚本
curl -fsSL https://get.docker.com | bash。
按照这个顺序下来,基本不会有问题。如果还有具体报错信息贴出来,我可以帮你进一步分析。
云技术博客