Docker 24.0.5离线安装全攻略:RPM与二进制两种方式详解
2026/9/7 2:01:11 网站建设 项目流程

简介:docker 24.0.5 离线安装包专为无法连接公网的环境设计,帮助运维人员在隔离网络或离线服务器上快速完成Docker部署。资源共18个文件,包含17个rpm依赖包与1个install_docker.sh安装脚本,压缩后体积108.02MB,一次下载即可获得全部所需组件。rpm包不仅提供docker-ce主程序与cli,还集成了containerd.io运行时、docker-compose-plugin 2.20.2、buildx插件以及fuse、slirp4netns等底层依赖,覆盖docker rootless模式和compose编排所需组件;脚本会自动完成安装并启动服务,但需注意连续执行两次以确保所有依赖注册和启用成功。安装后docker与docker compose命令可直接生效,无需再联网拉取。当前已有933人学习使用,适合内网部署、离线交付以及对系统环境有严格管控要求的场景,可显著节省手动匹配依赖的时间,降低安装失败风险。 说实话,看到“docker 24.0.5 离线安装”这个需求,我就知道你又遇到内网环境了。我这边也经常碰到这种场景,客户那边机房物理隔离,或者干脆就是涉密网络,外网一个端口都不给你留,但业务又必须容器化落地。这种时候,你想在线执行curl -fsSL https://get.docker.com | bash那一套是根本行不通的,唯一的出路就是把安装包在有网的机器上备齐,再拿U盘或内网传输工具搬进去装。

这篇文章我就把我在离线环境下安装 docker 24.0.5 的完整过程复盘一遍,覆盖两种主流安装方式:RPM包安装和二进制包安装。内容包括怎么在有网机器上把依赖准备齐全、到离线机器上具体执行哪些命令、装完之后的daemon.json怎么配、以及我实际踩过的坑和排查思路。不管你是CentOS、Ubuntu还是麒麟、欧拉这类国产系统,都能在这篇文章里找到可落地的方案。

1. 为什么选24.0.5,以及离线装Docker前必须想清楚的事

1.1 关于版本选择的一点建议

24.0.x是2023年中的稳定版本线,24.0.5这个补丁版本发布时修复了不少问题,整体属于“稳”的阶段。我选这个版本的原因其实很简单:离线环境不是拿来尝鲜的,越新越容易翻车。你在有网环境装错了可以一键重来,离线环境一旦装到一半发现版本bug,重新传包、重新依赖,折腾的时间成本非常高。

另外,24.0.x版本对containerd的依赖清晰,systemd集成也成熟,社区资料多。以后真要排查问题,网上的案例一搜一大把,这对离线场景来说非常重要。当然,如果你所在组织的安全基线要求更高的版本,思路是一样的,把下面的版本号替换掉即可。

1.2 离线装的本质:把“在线安装会做的事”提前做完

在线安装docker,本质上就是四条路:

  1. 配置docker-ce的yum/apt软件源
  2. 让包管理器自己拉取 docker-ce、docker-ce-cli、containerd.io 以及一堆依赖
  3. 通过包管理器完成二进制文件、systemd服务文件、配置文件的放置
  4. 启动服务并验证

离线安装的难点在第2步和第3步。没有外网,包管理器拉不到东西,所以我们必须在有网机器上提前把依赖下载好,再以本地包或二进制文件的方式搬过去。理解了这个逻辑,后面整个操作其实就非常清晰了——不是在装一个多复杂的软件,而是在手动补全“安装包分发”这个动作。

在开始之前,我建议你先确认两件事。第一,目标机器的CPU架构,x86_64还是aarch64,这个直接决定下载哪个包,搞错了装上也会报错;第二,目标机器的Linux发行版和版本,因为下面两种安装方式适用的场景不同。你也可以直接看下面这个对比表,快速判断自己该走哪条路。

对比项RPM包方式二进制tar包方式
适用系统CentOS / RHEL / 麒麟 / 欧拉等RPM系所有Linux发行版(包括Debian、Ubuntu)
依赖处理需要手动收集依赖rpm包基本无依赖,解压即用
包体大小约300MB~500MB(含依赖)约80MB
systemd服务RPM包会自带service文件需要手写service文件
后续卸载维护yum remove即可删文件、停服务

我的经验是:如果目标系统是CentOS 7/8这类成熟RPM系,优先用RPM包方式,省心;如果目标系统比较冷门,或者你不想被依赖问题折磨,二进制包方式几乎是一招通吃。

2. 准备工作:在有网机器上把安装包“一网打尽”

2.1 方式一:用yumdownloader收集RPM包及全部依赖

假设你手头有一台和离线机相同系统版本的联网机器(这里以CentOS 7.9为例),第一步先配置docker-ce的官方源。注意,这里配置源只是为了下载,不会真的安装docker。

yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

然后创建一个目录,把要装的包和依赖全部拉进去:

mkdir -p /opt/docker-offline cd /opt/docker-offline yumdownloader --resolve \ docker-ce-24.0.5 \ docker-ce-cli-24.0.5 \ containerd.io \ docker-compose-plugin \ docker-buildx-plugin

这里要特别说一下--resolve参数的作用。它会像正常yum安装一样,把 docker-ce 24.0.5 依赖的所有rpm包(比如container-selinux、libseccomp、policycoreutils-python-utils、tar等)全都下载到当前目录。少了这个参数,你只拿到一个孤零零的docker-ce主包,到了离线机器上一装就是一堆依赖报错。

我实际遇到的情况是,有些依赖可能来自epel源,如果你的联网机器没装epel,yumdownloader会提示找不到某些包,这时候先yum install -y epel-release再重新下载。下完之后,把整个目录打成tar包:

cd /opt tar -czf docker-offline-centos7.tar.gz docker-offline/

拷贝到离线机器上就行。这里再补一个很多人会忽略的细节:下载完看一眼目录里是不是有container-selinux这个包,这个包是最容易被漏掉的,而且经常在官方源里没有,要从epel里才能拉下来。没有它,docker-ce装不上是大概率事件。

2.2 方式二:直接下载静态二进制tar包,一包走天下

如果你不想跟依赖做斗争,我强烈推荐直接用官方静态二进制包。这个包把docker运行时、dockerd、containerd等所有二进制都编译打包好了,不含任何依赖,适用于几乎所有Linux发行版。

下载地址:

wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.5.tgz

如果你的目标机器是ARM架构,把路径里的x86_64换成aarch64

wget https://download.docker.com/linux/static/stable/aarch64/docker-24.0.5.tgz

如果你还想离线使用docker compose v2插件,可以顺手把compose的二进制一起下下来:

wget https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-linux-x86_64

注意:compose是单独的Go二进制,放到/usr/libexec/docker/cli-plugins/目录下就能被docker命令识别。别下载错了平台版本。

2.3 两种情况都建议做的一件事:把版本记录写清楚

别笑,我吃过这个亏。有次我给三台机器装了不同小版本的docker,过了两个月要统一升级,结果谁也想不起来当时到底装的哪个rpm包。所以我现在养成了个习惯:在存放安装包的目录里放一个VERSION.txt,写清楚docker版本、containerd.io版本、compose插件版本、下载日期、来源路径。这个习惯在离线环境下尤其重要,因为你没法随时上外网查历史版本信息。

3. 离线机器上的实际安装步骤

3.1 RPM方式:离线环境下最稳的三步走

把之前的tar包上传到离线机器后,先解压:

tar -xzf docker-offline-centos7.tar.gz cd docker-offline

用本地rpm包安装,我推荐用yum localinstall,因为它在本地解析依赖时表现得比rpm更聪明,能处理本地包之间的相互依赖:

yum localinstall -y *.rpm

如果一切正常,你会看到yum自动处理了本地依赖然后安装成功。这时候先别急着启动,先确认一下安装结果:

docker --version

输出类似Docker version 24.0.5, build ced0996就说明安装OK。

3.2 二进制方式:复制文件、写系统服务、启动

二进制方式稍微多几步,但完全不挑系统。先把包解压,并把二进制复制到PATH目录:

tar -xzf docker-24.0.5.tgz cp docker/* /usr/bin/

如果你需要compose插件,创建插件目录并放置:

mkdir -p /usr/libexec/docker/cli-plugins/ cp docker-compose-linux-x86_64 /usr/libexec/docker/cli-plugins/docker-compose chmod +x /usr/libexec/docker/cli-plugins/docker-compose

然后需要手写systemd服务文件。创建一个/etc/systemd/system/docker.service文件,内容如下:

[Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service containerd.service Wants=network-online.target [Service] Type=notify ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target

这个文件看起来简单,但每行都有讲究。Type=notify表示dockerd启动完成后通过sd_notify通知systemd,而不是简单检查进程是否拉起,这样能确保Docker真正可用之后服务才算启动成功;Delegate=yes允许docker管理自己的cgroup、namespace等子系统;KillMode=process保证重启docker服务时不会误杀容器内的进程。

写完之后重载并启动:

systemctl daemon-reload systemctl enable docker systemctl start docker

启动后验证一下:

systemctl status docker docker version

docker version要能看到Client和Server两部分,如果你只看到Client而没有Server部分,说明dockerd没有正常运行,往下看第四节。

3.3 安装完成后的基础配置:提前写好daemon.json

无论是RPM方式还是二进制方式,我强烈建议你在启动服务后立刻配置/etc/docker/daemon.json。这里放一些常用的基础配置,特别是日志限制,不配的话默认的json-file日志会无限制增长,最终把你的磁盘打满。

{ "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" }, "storage-driver": "overlay2", "iptables": true, "ip-forward": true }

解释一下几个关键项。native.cgroupdriver=systemd是为了统一cgroup驱动,如果以后要接Kubernetes,这一步能避免很多驱动不匹配的问题;max-sizemax-file限制每个容器日志文件的大小和数量,生产环境必配;storage-driver指定overlay2,这是现代Linux内核上性能最好的存储驱动。

配置完成后重启docker:

systemctl daemon-reload systemctl restart docker

最后验证一次容器能正常运行:

docker run --rm hello-world

如果离线环境连hello-world镜像都没有,可以用docker pull在有网机器上拉好镜像再docker save -o hello.tar hello-world:latest带进来导入,这部分属于离线镜像分发的话题,我这里先按下不表。

4. 常见问题与排错记录:离线安装最坑的几个点

4.1 依赖报错:缺少container-selinux和libseccomp

RPM方式安装最常见的报错就是:

错误:依赖检测失败: container-selinux >= 2.107 被 docker-ce-24.0.5-1.el7.x86_64 需要 libseccomp >= 2.3 被 docker-ce-24.0.5-1.el7.x86_64 需要

遇到这个报错说明你有网机器下载依赖的时候没有收集全。解决办法就是回到有网机器上补下:

yum install -y container-selinux libseccomp yumdownloader --resolve container-selinux libseccomp

然后把新下载的rpm也拷到离线机器上重新执行yum localinstall -y *.rpm。如果目标机器是CentOS 7,libseccomp版本可能过低,这时候需要手动更新libseccomp到2.4以上,否则dockerd启动时会报version LIBSE CCP_2.4 not found,具体解法看4.2。

4.2 启动失败:dockerd报错,服务起不来

systemctl start docker执行后过几秒报错,或者一直卡住,这是离线安装最常见的情况。第一件事是看日志:

journalctl -u docker --no-pager -n 50

我遇到的典型错误有这么几类。

第一类:Failed to start Docker Application Container Engine,日志里出现:

/usr/bin/dockerd: /lib64/libseccomp.so.2: version `LIBSE_CCP_2.4' not found (required by /usr/bin/dockerd)

这是libseccomp版本不匹配导致的。解决办法是下载新版本的libseccomp rpm包安装,CentOS 7上可以这样:

wget http://rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/libseccomp-2.3.1-4.el7.x86_64.rpm rpm -Uvh libseccomp-2.3.1-4.el7.x86_64.rpm

如果rpmfind上面的版本还是不够,可以考虑从更高版本的CentOS仓库里借libseccomp,但这样有风险,我一般直接更新到2.4+版本。

第二类:网络转发没有开启,日志里出现:

WARNING: IPv4 forwarding is disabled

先检查cat /proc/sys/net/ipv4/ip_forward,如果输出是0,临时开启:

echo 1 > /proc/sys/net/ipv4/ip_forward

永久开启需要改/etc/sysctl.conf,加上net.ipv4.ip_forward = 1,然后sysctl -p生效。

第三类:overlay存储驱动挂载失败:

Error starting daemon: error initializing graphdriver: overlay2: unknown option

这种通常是内核版本过低或必须的模块没加载。先用uname -r看内核版本,CentOS 7的内核3.10虽然能用overlay2,但需要确认是否加载了overlay模块,执行modprobe overlay试试。如果不行,老老实实改成vfs驱动或升级内核。

4.3 SELinux和防火墙导致的“装成功但不可用”

有时候docker启动成功了,docker ps也正常,但容器网络不通,或者启动容器的瞬间被拒绝。

如果是CentOS/RHEL系,先检查SELinux状态:

getenforce

如果输出是Enforcing,而daemon.json里没做适配,docker可能报:

SELinux is not supported with the overlay2 graph driver on this kernel 要么把SELinux关掉(setenforce 0),要么在daemon.json里加 "selinux-enabled": false

但关SELinux这事在严格安全要求的网络环境里可能过不了合规,我一般建议在daemon.json里显式禁用docker自己的selinux支持,保留系统层面的SELinux策略,虽然保守但至少能用。

防火墙这块,如果你本机开了firewalld,docker会尝试自动操作iptables规则。但有些安全加固过的系统,docker的规则会被firewalld覆盖,导致容器出不去外网。排查时可以先临时停掉firewalld:

systemctl stop firewalld

如果停掉之后网络恢复正常,那就是firewalld和docker iptables规则冲突。一个临时解决办法是把docker0网卡加入trusted zone:

firewall-cmd --permanent --zone=trusted --add-interface=docker0 firewall-cmd --reload

但要注意,docker每创建一个自定义网桥,都需要类似处理,比较繁琐。在生产环境我更推荐直接用docker的iptables能力,把firewalld对docker网段的干扰降到最低,或者干脆在安全策略允许的条件下禁用firewalld。

4.4 离线机器上镜像导入的一个连带问题

装好docker之后,你会发现在离线机器上没法直接docker pull任何镜像。这时候需要把有网机器上拉好的镜像保存成文件带进来:

docker save -o nginx-1.25.tar nginx:1.25

到离线机器上导入:

docker load -i nginx-1.25.tar

这里提一个细节:save命令保存的是镜像本身的层数据,如果你忘了打tag,导入后镜像的repository和tag可能会变成<none>:<none>,所以保存前最好确认一下docker images里的REPOSITORY和TAG标记完整。另外,对于多架构镜像(比如同时有amd64和arm64),在有网机器上save时要指定平台参数,否则默认只会保存当前机器的架构版本,拿到离线机上可能跑不起来。

5. 批量部署的扩展思路:做一个本地yum源

如果你的离线环境不止一两台机器,而是几十台甚至上百台,一台台rpm安装或解压二进制就太低效了。我建议在离线内网里找一台机器作为“软件分发节点”,把之前下载的所有rpm包做成一个本地yum源,然后其他机器通过内网地址直接yum安装。

做法很简单。在有网机器上下载依赖时,注意保留你收集的那个rpm目录。把它传到内网的一台服务器上(假设IP是192.168.10.20),安装createrepo并生成仓库元数据:

yum install -y createrepo mkdir -p /data/docker-repo cp *.rpm /data/docker-repo/ createrepo /data/docker-repo

然后在那台分发节点上启动一个HTTP服务,简单起见可以用nginx或者python:

cd /data/docker-repo && python3 -m http.server 8080

其他离线机器上配置一个本地repo文件/etc/yum.repos.d/docker-local.repo

[docker-local] name=Docker Local Repo baseurl=http://192.168.10.20:8080/ enabled=1 gpgcheck=0

之后每台机器只需要执行yum install -y docker-ce-24.0.5,依赖自动从内网源里解析,效率比手动rpm安装高得多。这个方法同样适用于离线安装其他软件,思路完全通用。

我在实际项目里用这套方案批量部署过几十台机器,基本零失败。唯一要注意的是,内网分发节点的HTTP服务要设置开机自启,不然节点重启之后,其他机器再装软件就会发现源不可用。

最后再说一个个人习惯:装完所有机器后,我一定会每台机器执行一次docker info,重点看Server Version、Storage Driver、Cgroup Driver这几项是否一致。运维场景里,环境一致性就是安全感,版本参差不齐的集群,后续排查问题会让你怀疑人生。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询