内网环境、完全离线的服务器,或者只是不想让 yum 每次去外网拉包,最常见的做法是先把 Docker 的一组 RPM 包下载到本机,再用 yum / dnf 从本地安装。命令本身只有几行,但坑集中在两个地方:包文件的位置,以及这组包版本号里同时混着 el8 和 el9。下面把完整流程、每个包的职责和常见报错整理一遍。
一、安装前先确认两件事
系统版本和 CPU 架构决定了该下载哪一套包,装之前先看一眼:
cat /etc/os-release
uname -m版本对应关系:
| 系统 | 包标签 |
|---|---|
| CentOS 7 / RHEL 7 | el7 |
| CentOS 8 / RHEL 8 / Rocky Linux 8 / AlmaLinux 8 | el8 |
| RHEL 9 / Rocky Linux 9 / AlmaLinux 9 | el9 |
架构上,普通 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.rpmdnf
若使用 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-ce | Docker 引擎本体 dockerd | 没有服务端 |
docker-ce-cli | 命令行客户端 docker | 敲 docker 提示 command not found |
docker-buildx-plugin | buildx 构建插件 | docker buildx 不可用 |
docker-compose-plugin | Compose 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 docker2. 验证安装
docker version # 客户端 + 服务端版本都能打出来才算通
docker info # 看存储驱动、cgroup 驱动等运行时信息
docker run --rm hello-worlddocker 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.rpm2. 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.rpm4. 已经装过旧版 Docker
机器上存在旧版本时,dnf install 会直接回一句 already installed 然后什么都不做。本地 RPM 做升级要用 upgrade 语义:
sudo dnf upgrade -y ./docker-ce-26.1.3-1.el8.x86_64.rpm5. 完全离线时依赖解析失败
即使装的是本地 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 带来的,照着上面的报错对号入座即可。
评论区