简介: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,本质上就是四条路:
- 配置docker-ce的yum/apt软件源
- 让包管理器自己拉取 docker-ce、docker-ce-cli、containerd.io 以及一堆依赖
- 通过包管理器完成二进制文件、systemd服务文件、配置文件的放置
- 启动服务并验证
离线安装的难点在第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 versiondocker 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-size和max-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这几项是否一致。运维场景里,环境一致性就是安全感,版本参差不齐的集群,后续排查问题会让你怀疑人生。
本文还有配套的精品资源,点击获取