侧边栏壁纸
博主头像
Setyg的博客

当秋风染红落叶的时候,就是新生~

  • 累计撰写 86 篇文章
  • 累计创建 66 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Rocky Linux 离线安装 Docker:用 yum/dnf 安装本地 RPM 包实践

Setyg
2026-09-27 / 0 评论 / 0 点赞 / 2 阅读 / 0 字

内网环境、完全离线的服务器,或者只是不想让 yum 每次去外网拉包,最常见的做法是先把 Docker 的一组 RPM 包下载到本机,再用 yum / dnf 从本地安装。命令本身只有几行,但坑集中在两个地方:包文件的位置,以及这组包版本号里同时混着 el8 和 el9。下面把完整流程、每个包的职责和常见报错整理一遍。

一、安装前先确认两件事

系统版本和 CPU 架构决定了该下载哪一套包,装之前先看一眼:

cat /etc/os-release
uname -m

版本对应关系:

系统包标签
CentOS 7 / RHEL 7el7
CentOS 8 / RHEL 8 / Rocky Linux 8 / AlmaLinux 8el8
RHEL 9 / Rocky Linux 9 / AlmaLinux 9el9

架构上,普通 x86 服务器是 x86_64,ARM 服务器要下 aarch64 的包,两者不能混装。

二、安装命令

yum

在基于 RPM 包管理的 Linux 系统(如 CentOS、RHEL、Rocky Linux 等)上,若这些包就在当前目录下,安装命令如下:

sudo yum install -y \
containerd.io-1.6.32-3.1.el8.x86_64.rpm \
docker-buildx-plugin-0.21.1-1.el9.x86_64.rpm \
docker-ce-26.1.3-1.el8.x86_64.rpm \
docker-ce-cli-26.1.3-1.el8.x86_64.rpm \
docker-ce-rootless-extras-26.1.3-1.el9.x86_64.rpm \
docker-compose-plugin-2.6.0-3.el9.x86_64.rpm

dnf

若使用 dnf(适用于较新的 RHEL 系发行版),安装命令如下:

sudo dnf install -y \
containerd.io-1.6.32-3.1.el8.x86_64.rpm \
docker-buildx-plugin-0.21.1-1.el9.x86_64.rpm \
docker-ce-26.1.3-1.el8.x86_64.rpm \
docker-ce-cli-26.1.3-1.el8.x86_64.rpm \
docker-ce-rootless-extras-26.1.3-1.el9.x86_64.rpm \
docker-compose-plugin-2.6.0-3.el9.x86_64.rpm

-y 参数会自动确认安装过程中的询问。若包不在当前目录,需将文件名替换为完整路径。

两条命令其实是等价的:从 RHEL 8 / CentOS 8 开始,yum 已经是指向 dnf 的软链接,敲哪个都会走 dnf 的依赖解析。老系统(CentOS 7)上才真的是 yum 本体。

三、这六个包分别管什么

包名作用不装会怎样
containerd.io容器运行时(守护进程 + runc)docker 起不来,缺 runc
docker-ceDocker 引擎本体 dockerd没有服务端
docker-ce-cli命令行客户端 docker敲 docker 提示 command not found
docker-buildx-pluginbuildx 构建插件docker buildx 不可用
docker-compose-pluginCompose V2,即 docker compose没有子命令 compose
docker-ce-rootless-extras无 root 运行 Docker 的支持脚本用不了 rootless 模式

注意版本号里的 el 标签并不统一:docker-ce、docker-ce-cli、containerd.io 是 el8,而 buildx、rootless-extras、compose-plugin 是 el9。这是 Docker 官方仓库的真实状态——对 el8 只维护到某个时间点,后续这几个子包只发 el9 构建。它们大多是 Go 静态编译出来的二进制或纯脚本,不绑定具体发行版的运行库,所以混装通常没问题。但如果 dnf 报出 glibc / libc 之类的依赖错误,说明这套组合在你的系统上确实不兼容,此时应统一换成同一个 el 版本的包,别硬装。

另外 docker-compose-plugin 是 2.6.0,明显比 docker-ce 26.1.3 落后很多,是较早期留下的包。Compose V2 目前仍在快速迭代,能升就一起升。

四、装完必须做的三件事

1. 启动并设为开机自启

sudo systemctl enable --now docker
sudo systemctl status docker

2. 验证安装

docker version          # 客户端 + 服务端版本都能打出来才算通
docker info             # 看存储驱动、cgroup 驱动等运行时信息
docker run --rm hello-world

docker version 如果只输出 Client 部分、Server 部分报错,说明 dockerd 没起来,先看 systemctl status docker 和 journalctl -u docker -n 50。

3. 免 sudo 用 docker(可选)

sudo usermod -aG docker $USER
newgrp docker

把当前用户加进 docker 组,之后就不用每条命令都 sudo。要注意这个组等价于 root 权限,只给可信用户加。

如果装了 rootless-extras 并且想用无 root 模式,还需要 slirp4netns、fuse-overlayfs 这两个依赖包,然后执行:

dockerd-rootless-setuptool.sh install

五、常见报错与处理

1. No match for argument / 找不到文件

yum 和 dnf 都是相对于当前工作目录去解析包文件名的,不是相对于包所在的目录。人在 /root、包在 /opt/docker-rpms 时,直接写文件名就会报找不到。

两种改法:先 cd 进包目录,或者把文件名换成完整路径。更稳妥的写法是给本地文件加 ./ 前缀,明确告诉包管理器「这是个本地文件,不是仓库里的包名」:

sudo dnf install -y ./containerd.io-1.6.32-3.1.el8.x86_64.rpm \
  ./docker-ce-26.1.3-1.el8.x86_64.rpm \
  ./docker-ce-cli-26.1.3-1.el8.x86_64.rpm

2. Public key for xxx.rpm is not installed

本地包没有导入 GPG 公钥时会卡在校验上。正规做法是导入 Docker 官方公钥:

sudo rpm --import https://download.docker.com/linux/centos/gpg

离线环境导不进来的话,只能临时跳过校验:

sudo dnf install -y --nogpgcheck ./docker-ce-26.1.3-1.el8.x86_64.rpm

--nogpgcheck 意味着放弃了「包没被篡改」这一层保障,只适合包来源完全可信(比如自己从官方下载后拷贝进来)的场景。

3. 与 podman / runc 的文件冲突

Rocky Linux、RHEL 8/9 默认预装了 podman,而 containerd.io 也会提供 /usr/bin/runc,两者会撞车,报错类似:

file /usr/bin/runc from install of containerd.io-1.6.32-3.1.el8.x86_64
conflicts with file from package runc-1.1.12-1.el8.x86_64

处理方式是移除冲突包,或者让 dnf 自动替换:

sudo dnf remove -y podman buildah runc
# 或者
sudo dnf install -y --allowerasing ./containerd.io-1.6.32-3.1.el8.x86_64.rpm

4. 已经装过旧版 Docker

机器上存在旧版本时,dnf install 会直接回一句 already installed 然后什么都不做。本地 RPM 做升级要用 upgrade 语义:

sudo dnf upgrade -y ./docker-ce-26.1.3-1.el8.x86_64.rpm

5. 完全离线时依赖解析失败

即使装的是本地 RPM,dnf 仍然会去仓库解析依赖。机器完全没网时会报 Failed to download metadata for repo。解决办法是搭一个本地仓库,把所有包(含依赖)放在同一目录:

sudo dnf install -y createrepo_c
sudo createrepo_c /opt/docker-rpms

再写一个 repo 文件指向本地目录:

sudo tee /etc/yum.repos.d/docker-local.repo <<'EOF'
[docker-local]
name=Local Docker RPMs
baseurl=file:///opt/docker-rpms
enabled=1
gpgcheck=0
EOF

之后就可以按包名正常安装了,依赖也能自动补齐。

六、锁住版本,防止被意外升级

手工装上的版本组合,很可能在下一次 dnf update 时被仓库里的新版本覆盖掉,尤其是容器运行时这种升级需要停服务的组件。想固定住版本,可以在 /etc/dnf/dnf.conf 里加一行排除规则:

exclude=docker-ce* docker-ce-cli* containerd.io docker-compose-plugin* docker-buildx-plugin* docker-ce-rootless-extras*

或者用 versionlock 插件精确锁定:

sudo dnf install -y python3-dnf-plugin-versionlock
sudo dnf versionlock add docker-ce docker-ce-cli containerd.io

七、速查卡

# 1. 确认系统与架构
cat /etc/os-release && uname -m

# 2. 进包目录(或改用完整路径 / ./ 前缀)
cd /opt/docker-rpms

# 3. 一次事务装完六个包
sudo dnf install -y ./*.rpm

# 4. 启动 + 自启 + 验证
sudo systemctl enable --now docker
docker version && docker run --rm hello-world

# 5. 免 sudo(可选)
sudo usermod -aG docker $USER && newgrp docker

一句话总结:路径要对,包要一次性装完,装完记得 systemctl 启动并验证。其余的坑基本都是版本混装和系统预装 podman 带来的,照着上面的报错对号入座即可。

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区