CentOS 8 系统下的包依赖冲突问题

Docker CE Stable - x86_64 94 kB/s | 66 kB 00:00

错误:

问题: 安装的软件包的问题 buildah-1.19.7-1.module_el8.4.0+781+acf4c33b.x86_64


今天给自己的小玩意安装docker的时候遇到报错

通过报错我们可知,遇到的是 CentOS 8 系统下的包依赖冲突问题,核心原因很明确:

  1. 系统预装了 buildah(一款容器构建工具),它依赖 系统自带的 runc 包(版本要求 ≥1.0.0-26)
  2. Docker 的 containerd.io 包会自带并替换系统原生的 runc (为了保证 Docker 运行的一致性),这就和 buildah 的依赖要求产生了冲突;
  3. 同时系统开启了「模块化过滤」,部分兼容的 runc 包被屏蔽,无法满足依赖要求。

下面提供 3 种解决方案,按「操作简单度」从高到低排序,优先推荐第一种(最快捷,不影响核心功能)。

方案一:直接允许替换冲突包(推荐,一步到位)

yum/dnf 提供了 --allowerasing 参数,专门用于解决这类「冲突包替换」问题,它会自动卸载冲突的旧包(系统自带的 runc、不兼容的 buildah 相关组件),同时安装 Docker 所需的包,完全满足你的需求。

操作命令(指定安装 Docker 20.10.0,避免最新版冲突)

bash 复制代码
# 安装指定版本 Docker 20.10.0,允许替换冲突包
yum install -y --allowerasing docker-ce-20.10.0 docker-ce-cli-20.10.0 containerd.io

说明

  • 这个命令会自动卸载「与 containerd.io 冲突的系统 runc」和「依赖该 runcbuildah」;
  • buildah 是 CentOS 8 默认预装的容器工具,和 Docker 功能重叠,卸载后不影响系统核心运行,也不影响 Docker 的使用;
  • 执行完成后,直接继续后续的 Docker 启动、配置步骤即可。

方案二:先卸载冲突包,再安装 Docker(稳妥,手动清理)

如果不想让系统自动替换包,可以先手动卸载冲突的 buildah 和系统原生 runc,再安装 Docker,步骤更清晰,适合对系统包有严格控制的场景。

操作步骤

卸载冲突包

bash 复制代码
# 卸载 buildah 及其依赖的冲突包
yum remove -y buildah runc

安装指定版本 Docker 20.10.0

bash 复制代码
# 此时无冲突,直接安装即可
yum install -y docker-ce-20.10.0 docker-ce-cli-20.10.0 containerd.io

方案三:禁用模块化过滤(进阶,保留系统原生包)

如果需要保留 buildah 和系统原生 runc,可以禁用 CentOS 8 的「模块化过滤」,让系统显示被屏蔽的 runc 包,从而满足依赖要求。这个方案操作稍复杂,适合需要同时使用 buildah 和 Docker 的场景。

操作步骤

  1. 禁用模块化过滤(临时生效,测试用)

    bash 复制代码
    yum module disable -y container-tools
  2. 更新 yum 缓存

    bash 复制代码
    yum clean all && yum makecache fast
  3. 安装 Docker(此时会自动匹配兼容的 runc 包)

    bash 复制代码
    yum install -y docker-ce-20.10.0 docker-ce-cli-20.10.0 containerd.io
  4. (可选)永久禁用模块化过滤

    bash 复制代码
    # 编辑yum配置文件,添加模块化过滤禁用参数
    echo "module_hotfixes=1" >> /etc/yum.conf

后续验证步骤(无论哪种方案,安装后都要执行)

运行

bash 复制代码
# 1. 启动Docker并设置开机自启
systemctl enable docker --now

# 2. 验证Docker版本是否正确(20.10.0)
docker --version

# 3. 验证Docker是否正常运行(拉取一个测试镜像)
docker pull hello-world

# 4. 运行测试容器,确认无报错
docker run hello-world

关键注意事项

  1. 优先选择「方案一」,--allowerasing 是 yum/dnf 解决这类冲突的官方推荐方案,操作最简单、成功率最高;

  2. 指定 Docker 安装,避免安装最新版 Docker 带来新的依赖冲突(最新版 containerd.iorunc 的版本要求更高,冲突概率更大)或者安装ce版本也成;

  3. 卸载 buildah 不会影响系统其他功能,它只是一个可选的容器构建工具,和 Docker 功能重叠,无需担心系统稳定性;

  4. 若执行命令后仍有报错,可尝试添加 --nobest 参数(跳过「最佳候选包」限制),完整命令:

    bash 复制代码
    yum install -y --allowerasing --nobest docker-ce-20.10.0 docker-ce-cli-20.10.0 containerd.io

总结

  1. 核心问题:buildah 依赖系统 runc,与 Docker 的 containerd.io 自带 runc 冲突;
  2. 最优解:使用 --allowerasing 参数一键替换冲突包,快速安装指定版本 Docker 20.10.0;
  3. 验证关键:安装后通过 docker --versiondocker run hello-world 确认 Docker 正常运行;
  4. 避坑点:指定 Docker 版本安装,避免最新版带来额外依赖冲突。

END

如果觉得这份基础知识点总结清晰,别忘了动动小手点个赞👍,再关注一下呀~ 后续还会分享更多有关开发问题的干货技巧,同时一起解锁更多好用的功能,少踩坑多提效!🥰 你的支持就是我更新的最大动力,咱们下次分享再见呀~🌟

相关推荐
王大傻09282 小时前
kali-linux-2025.4 鼠标不显示的问题 --- 已解决
linux·服务器·网络安全
海兰2 小时前
Docker单节点部署Elasticsearch 9.0+(开发环境)
运维·docker·容器
人间打气筒(Ada)2 小时前
Docker主机集群化方案 Docker Swarm
运维·docker·容器·docker swarm·docker stack
white-persist2 小时前
【内网运维 联合解析】Docker 全体系详解(功能原理 + 命令参数 + 实战攻防)
运维·docker·容器
一池秋_2 小时前
aarch64_Ubuntu (Linux)连不上adb解决方法
linux·ubuntu·adb
_OP_CHEN2 小时前
【Linux系统编程】(二十四)深入 Ext2 块组内部:inode、数据块与目录的底层工作机制
linux·操作系统·文件系统·c/c++·inode·块组·数据块映射
程序 代码狂人3 小时前
帆软-服务器器数据集权限配置
运维·服务器
博语小屋5 小时前
设计一个简单的网络计算器并将其守护进程化
linux·网络·tcp/ip
星火开发设计5 小时前
枚举类 enum class:强类型枚举的优势
linux·开发语言·c++·学习·算法·知识