简介:本资源为 Docker 24.0.5 离线安装包,面向内网、无外网环境或需要批量部署容器的运维与开发人员,解决服务器无法联网拉取镜像与依赖的安装难题。压缩包共 18 个文件,以 17 个 rpm 依赖包和 1 个 install_docker.sh 安装脚本为主,整体约 108.02MB,涵盖 docker-ce、docker-ce-cli、containerd.io、docker-buildx-plugin、docker-compose-plugin 等核心组件,以及 container-selinux、fuse-overlayfs、slirp4netns、libcgroup 等运行依赖,并附带 docker compose 命令支持。执行脚本即可完成安装,安装后 Docker 会自动启动,需注意脚本要执行两遍以确保依赖与主程序完整就位。目前已有 935 人学习下载,适合需要离线部署、快速搭建容器环境或排查依赖缺失问题的读者参考使用。
1. 内网服务器上那台死活装不上的 Docker,到底卡在哪
很多做交付的同行都遇到过这种场景:客户机房完全隔离外网,或者云上买了几台内网机器只开了跳板机端口,你手里只有一个 U 盘和一台能上网的笔记本。这时候要装 Docker,yum install docker-ce直接报错找不到源,apt-get update卡在Could not resolve,连curl -fsSL https://get.docker.com都跑不通。Docker 24.0.5 这个版本在内网交付里出现频率很高,因为它对 cgroup v2、nftables 的支持已经比较稳,同时还没引入后面几个版本里一些让人头疼的默认行为变更。所谓 docker 离线安装,本质就是把在线安装过程中所有需要联网拉取的环节——软件包、依赖、镜像——提前在能上网的机器上准备好,再搬到目标机器上按顺序落地。这套流程适合经常做内网部署、信创环境交付、或者需要批量初始化一批隔离节点的运维和开发。下面把我自己反复走过的一套流程拆开讲,包括包怎么选、依赖怎么补、镜像怎么搬、以及几个每次都会有人翻车的地方。
2. 离线包怎么备:从在线机器上把 Docker 24.0.5 的依赖链完整扒下来
离线安装失败,十次里有八次不是 Docker 本身装不上,而是依赖没备齐。Docker 的 rpm/deb 包不是孤立的,它依赖containerd.io、docker-ce-cli、docker-buildx-plugin、docker-compose-plugin,再往下还有libcgroup、device-mapper-libs、iptables或nftables相关的一串。你在在线机器上yum install docker-ce能成功,是因为 yum 自动帮你解了依赖;到了离线机器上,缺一个就是一片红。
2.1 用 downloadonly 把整条依赖链抓全
我一般不会只下 Docker 那几个主包,而是用yumdownloader或dnf download配合--resolve把依赖树一次性拉下来。这一步必须在和目标机器操作系统版本、架构完全一致的在线机器上做,CentOS 7 和 Rocky 9 的包不能混用。
# 在能联网、且系统版本与目标机一致的机器上执行 # 创建存放目录 mkdir -p /tmp/docker-offline/packages cd /tmp/docker-offline/packages # 方式一:用 yumdownloader 下载 docker-ce 及其全部依赖 # --resolve 表示递归解析依赖,--destdir 指定下载目录 yumdownloader --resolve --destdir=/tmp/docker-offline/packages \ docker-ce-24.0.5 \ docker-ce-cli-24.0.5 \ containerd.io \ docker-buildx-plugin \ docker-compose-plugin # 方式二:如果系统是 dnf(Rocky/Alma/Fedora) dnf download --resolve --alldeps --destdir=/tmp/docker-offline/packages \ docker-ce-24.0.5 docker-ce-cli-24.0.5 containerd.io这里几个参数值得说清楚。--resolve是让工具顺着依赖关系往下找,不加这个你只会拿到主包。--destdir指定输出目录,别下到默认当前目录,不然几十个包混在一起很难整理。版本号我习惯写全24.0.5,不写24.0.5-1.el7这种完整 release 号,是因为不同小版本 release 号会变,写太死反而下不到。如果你不确定目标机到底缺哪些依赖,可以在目标机上先跑一次rpm -qpR docker-ce-24.0.5.x86_64.rpm看它声明了哪些依赖,再回在线机器上对照着补。
2.2 离线源目录怎么组织,才能让目标机一条命令装完
包下齐之后不要散着拷过去,我习惯在 U 盘或内网共享目录里建一个本地 yum 源的结构,这样目标机上可以用yum --disablerepo=* --enablerepo=local直接装,依赖自动解决,比一个个rpm -ivh省心得多。
# 在离线包目录里生成 repodata cd /tmp/docker-offline/packages # 安装 createrepo 工具(在线机器上) yum install -y createrepo # 生成仓库元数据 createrepo . # 打包整个目录,准备搬运 cd /tmp/docker-offline tar czf docker-24.0.5-offline.tar.gz packages/到了目标机器上,解压后配置一个本地 repo 文件:
# 目标机器上操作 tar xzf docker-24.0.5-offline.tar.gz -C /opt/ # 写本地源配置 cat > /etc/yum.repos.d/local-docker.repo <<'EOF' [local-docker] name=Local Docker Offline Repo baseurl=file:///opt/packages enabled=1 gpgcheck=0 EOF # 清缓存并安装 yum clean all yum --disablerepo=* --enablerepo=local-docker install -y \ docker-ce-24.0.5 docker-ce-cli-24.0.5 containerd.io \ docker-buildx-plugin docker-compose-plugingpgcheck=0是因为离线包没有导入官方 GPG key,内网环境里这样最省事;如果你们安全规范要求校验签名,那就得提前把 key 文件也带过去并rpm --import。--disablerepo=*是防止目标机上还残留着指向外网的源,导致 yum 又去联网超时。装完之后systemctl enable --now docker启动,docker version能看到 Client 和 Server 都是 24.0.5 就算成了。
3. 镜像怎么搬:save/load 与 registry 两种离线方案的选择
Docker 装上了只是第一步,真正干活还得有镜像。内网机器docker pull必然失败,所以镜像也得离线搬。这里有两种主流做法,选哪种取决于你要搬多少镜像、目标机器有几台。
3.1 docker save / load:适合少量镜像的一次性搬运
如果只是几台机器、十来个镜像,docker save打成 tar 包最直接。它的原理是把镜像的所有 layer 和元数据打包成一个文件,目标机docker load后原样恢复,镜像 ID 都不变。
# 在线机器上,先把需要的镜像拉下来 docker pull nginx:1.25-alpine docker pull redis:7.2-alpine docker pull mysql:8.0.35 # 单个镜像保存 docker save -o nginx-1.25-alpine.tar nginx:1.25-alpine # 多个镜像合并保存到一个 tar,减少文件数量 docker save -o base-images.tar \ nginx:1.25-alpine \ redis:7.2-alpine \ mysql:8.0.35 # 压缩一下,镜像 tar 通常很大 gzip base-images.tar # 目标机器上加载 gunzip -c base-images.tar.gz | docker load # 或者 docker load -i base-images.tar-o指定输出文件,后面跟一个或多个镜像名。多个镜像合并保存的好处是只产生一个文件,搬运方便;坏处是文件可能好几个 G,传输中断了得重来。我一般会按业务分组,比如base-images.tar、app-images.tar分开打。加载完用docker images确认,注意docker load不会自动打 tag,如果 save 的时候镜像有 tag,load 回来 tag 还在;如果 save 的是镜像 ID,load 回来就是<none>,得手动docker tag。
3.2 搭一个内网 registry:镜像多、机器多时的正解
当你要维护几十个镜像、目标机器有十几台甚至更多时,挨个 save/load 就是体力活。这时候在离线环境里起一个私有 registry,所有机器从它拉,才是可持续的做法。registry 本身也是个镜像,可以一起离线搬进去。
# 在线机器上拉 registry 镜像并保存 docker pull registry:2.8.3 docker save -o registry-2.8.3.tar registry:2.8.3 # 目标机器(选一台作为 registry 主机)上加载并启动 docker load -i registry-2.8.3.tar docker run -d -p 5000:5000 --restart=always --name registry \ -v /data/registry:/var/lib/registry \ registry:2.8.3registry 起来之后,其他内网机器要能访问它,得改 Docker 配置允许 http 推送(默认只允许 https)。在每台需要推拉的机器上编辑/etc/docker/daemon.json:
{ "insecure-registries": ["192.168.1.100:5000"] }192.168.1.100换成你 registry 主机的内网 IP。改完systemctl restart docker。然后在线机器上给镜像重新打 tag 并推到一个中间 tar,再在能同时访问在线机器和内网 registry 的跳板机上完成推送:
# 给镜像打上私有 registry 的 tag docker tag nginx:1.25-alpine 192.168.1.100:5000/library/nginx:1.25-alpine # 推送 docker push 192.168.1.100:5000/library/nginx:1.25-alpine其他机器直接docker pull 192.168.1.100:5000/library/nginx:1.25-alpine就行。这套方案前期麻烦一点,但镜像一多优势立刻体现,而且后面更新镜像也方便。选 save/load 还是 registry,我的判断标准是:镜像少于 20 个、机器少于 5 台,save/load 够用;超过这个量级,直接上 registry,别犹豫。
4. 避坑排查:离线装 Docker 时最常翻车的五个地方
这套流程我走过很多次,每次带新人还是会在这几个点上卡住。下面按「现象 → 原因 → 解决」列出来,照着排基本能覆盖九成问题。
现象一:yum install报Error: Package: docker-ce-24.0.5 requires: containerd.io >= 1.6.4,但 containerd.io 的包明明在目录里。原因是本地 repo 的元数据没生成或者没更新,yum 看不到目录里的包。解决:回到包目录重新createrepo .,目标机上yum clean all再装。如果还不行,检查baseurl路径是不是写错了,file://后面必须是绝对路径且指向包含repodata的那一层。
现象二:装完启动systemctl start docker失败,journalctl -u docker看到failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain。原因是目标机 iptables 版本和 Docker 24.0.5 期望的不匹配,或者 firewalld 和 iptables 规则打架。解决:先确认iptables -V版本,CentOS 7 上如果是 1.4.21 一般没问题;如果是 nftables 后端,检查update-alternatives --display iptables。临时绕过可以改/etc/docker/daemon.json加"iptables": false,但这会牺牲容器网络隔离,只建议在明确不需要 NAT 的场景用。更稳的做法是升级 iptables 或切回 legacy 后端。
现象三:docker load报Error processing tar file(exit status 1): unexpected EOF。原因是镜像 tar 在传输或压缩过程中损坏了,尤其是用 U 盘拷贝大文件时。解决:在源机器上sha256sum base-images.tar.gz记下校验值,目标机拷完先校验,不一致就重传。另外docker save出来的 tar 不要用tar命令再套一层,直接 gzip 就行,套多层容易出问题。
现象四:容器起来了但docker exec进去发现 DNS 解析不了,ping baidu.com失败。原因是离线环境没有外部 DNS,Docker 默认给容器配的 DNS 是宿主机的/etc/resolv.conf,如果宿主机本身没配内网 DNS,容器里就是空的。解决:在/etc/docker/daemon.json里显式指定"dns": ["192.168.1.1"],换成你们内网实际的 DNS 地址,然后重启 Docker。或者启动容器时--dns 192.168.1.1单独指定。
现象五:docker-compose命令找不到,明明装了docker-compose-plugin。原因是 Docker 24 里 compose 是插件形式,命令是docker compose(中间空格),不是老的docker-compose(连字符)。解决:用docker compose version验证。如果确实需要老的docker-compose二进制,得单独去下它的离线包,但我不建议,新项目统一用插件版,少一个依赖少一个坑。
5. 批量交付时的一个提速技巧:把离线包做成自解压安装脚本
单台机器手动敲命令还能接受,但如果一次要初始化十几台隔离节点,重复操作既慢又容易漏步骤。我后来习惯把整个离线安装流程封装成一个自解压脚本,U 盘插上去执行一个文件,剩下的自动跑完。核心思路是把包目录和安装逻辑一起打包,用makeself或者手写一个 shell 头。
#!/bin/bash # install-docker-offline.sh # 用法:将本脚本与 packages 目录放在同一层,root 执行 set -e WORKDIR=$(cd "$(dirname "$0")" && pwd) PKG_DIR="$WORKDIR/packages" # 1. 配置本地源 cat > /etc/yum.repos.d/local-docker.repo <<EOF [local-docker] name=Local Docker Offline Repo baseurl=file://$PKG_DIR enabled=1 gpgcheck=0 EOF # 2. 安装 yum clean all yum --disablerepo=* --enablerepo=local-docker install -y \ docker-ce-24.0.5 docker-ce-cli-24.0.5 containerd.io \ docker-buildx-plugin docker-compose-plugin # 3. 配置 daemon.json,按需修改 DNS 和 insecure-registries mkdir -p /etc/docker cat > /etc/docker/daemon.json <<'EOF' { "dns": ["192.168.1.1"], "insecure-registries": ["192.168.1.100:5000"], "log-driver": "json-file", "log-opts": {"max-size": "100m", "max-file": "3"} } EOF # 4. 启动并设开机自启 systemctl enable --now docker # 5. 验证 docker version && echo "Docker 24.0.5 离线安装完成"这个脚本里set -e保证任何一步失败就停,不会带着半成品继续往下跑。daemon.json里的log-opts是我强烈建议加的,默认 Docker 日志不轮转,跑几个月能把磁盘写满,这个坑我在生产环境见过不止一次。DNS 和 registry 地址按实际环境改。脚本和packages目录一起拷到目标机,chmod +x后直接跑,十几台机器一台几分钟就完事。
从那以后我每次做离线交付,都会先在在线机器上把包和脚本一起准备好,到了现场先跑一遍sha256sum校验,再执行安装脚本,最后docker run hello-world验证。这套动作已经成了肌肉记忆,省下来的时间够我多排查两个业务问题了。希望帮到你。
本文还有配套的精品资源,点击获取