
简介本资源为 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 盘和一台能上网的笔记本。这时候要装 Dockeryum 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 # 方式二如果系统是 dnfRocky/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* --enablerepolocal直接装依赖自动解决比一个个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] nameLocal Docker Offline Repo baseurlfile:///opt/packages enabled1 gpgcheck0 EOF # 清缓存并安装 yum clean all yum --disablerepo* --enablerepolocal-docker install -y \ docker-ce-24.0.5 docker-ce-cli-24.0.5 containerd.io \ docker-buildx-plugin docker-compose-plugingpgcheck0是因为离线包没有导入官方 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 的时候镜像有 tagload 回来 tag 还在如果 save 的是镜像 IDload 回来就是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 --restartalways --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失败。原因是离线环境没有外部 DNSDocker 默认给容器配的 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] nameLocal Docker Offline Repo baseurlfile://$PKG_DIR enabled1 gpgcheck0 EOF # 2. 安装 yum clean all yum --disablerepo* --enablerepolocal-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验证。这套动作已经成了肌肉记忆省下来的时间够我多排查两个业务问题了。希望帮到你。本文还有配套的精品资源点击获取