简介这份资源面向需要在无外网或内网环境中部署容器运行时的运维与开发人员提供 Docker 24.0.5 的完整离线安装方案解决服务器无法联网拉取依赖、安装过程反复报错的痛点。压缩包共 18 个文件以 17 个 rpm 依赖包和 1 个 sh 安装脚本为主整体约 108.02MB其中 rpm 覆盖 docker-ce、docker-ce-cli、containerd.io、docker-buildx-plugin、docker-compose-plugin 等核心组件以及 container-selinux、fuse-overlayfs、slirp4netns、libcgroup 等运行依赖脚本则负责统一完成安装与启动。已有 934 人学习下载说明该方案在离线部署场景中具备一定参考价值。读者拿到后可直接在 CentOS 7 类系统上完成 Docker 及 Compose 命令的落地省去逐项排查依赖版本的时间同时可借助脚本理解离线安装的依赖顺序与启动逻辑适合作为内网环境标准化部署的参考模板。1. 内网服务器上跑起 Docker 24.0.5为什么离线包比在线装更值得折腾上周帮一个做工业视觉的朋友处理产线服务器机器在车间内网物理隔离连不了外网。他们要在上面跑一套缺陷检测服务依赖 Docker 做环境隔离但yum install docker-ce直接卡在源不可达。这种场景下docker 24.0.5 离线安装就是唯一出路——把 rpm 包和依赖提前在外网机器上拉全拷进内网按顺序装。这不是什么冷门需求。金融、能源、制造、医疗这些行业的很多机器天生不能出网而 Docker 又是部署标配。离线安装的核心难点不在装本身在于依赖闭环你缺一个container-selinux或libcgroup装到一半报错排查起来比在线装麻烦得多。这篇笔记把我在 CentOS 7 / openEuler / Kylin V10 上反复踩过的流程整理出来从依赖收集到 systemd 配置到镜像导入每一步都能直接抄。适合需要在内网批量部署 Docker 的运维和交付工程师也适合第一次接触离线安装、不想在依赖地狱里耗一整天的人。2. 离线包怎么攒依赖收集与版本锁定的完整链路2.1 为什么必须锁死 24.0.5 这个版本Docker 的版本号不是随便选的。24.0.5 属于 24.0.x 系列这个系列在 2023 年发布是最后一个默认使用cgroupfs作为 cgroup 驱动的大版本分支之一对 CentOS 7 的兼容性比 25.x 之后要好。25.x 开始对内核版本和 systemd 版本的要求更严CentOS 7 默认的 systemd 219 在某些子命令上会出兼容问题。另一个现实原因是很多内网环境里已经有一批 24.0.5 的镜像和 compose 文件在跑新机器装同版本能避免 API 版本不一致导致的client version too new报错。Docker Engine API 在 24.0.5 对应的是 1.43如果你装 26.xAPI 跳到 1.45老客户端连上来就可能被拒。所以版本锁定不是保守是让整个内网集群的 Docker 行为一致。我一般会在外网准备机上先确认目标版本再开始拉包。2.2 用 yumdownloader 把依赖树完整拉下来外网准备机需要和目标是同架构、同大版本的系统。比如目标机是 CentOS 7.9 x86_64准备机也必须是 CentOS 7.9 x86_64不能拿 CentOS 8 或 ARM 机器去拉。先装工具# 在外网 CentOS 7 准备机上执行 yum install -y yum-utils createrepo然后配置 Docker 官方源。注意这里用的是download.docker.com的静态仓库地址不是yum install直接装# 添加 Docker CE 仓库 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 只下载不安装把 docker-ce 24.0.5 及其全部依赖拉到本地目录 mkdir -p /opt/docker-offline/packages yumdownloader --resolve --destdir/opt/docker-offline/packages \ docker-ce-24.0.5 \ docker-ce-cli-24.0.5 \ containerd.io \ docker-buildx-plugin \ docker-compose-plugin--resolve是关键参数它会递归解析依赖并一并下载。--destdir指定输出目录。执行完后packages目录里应该有几十个 rpm包括container-selinux、libcgroup、fuse-overlayfs、slirp4netns这些。逻辑说明yumdownloader只下载不安装所以不会污染准备机环境。--resolve会读取仓库元数据把docker-ce依赖的每一个包都找出来。如果某个依赖在基础源里它也会从对应仓库拉。参数说明docker-ce-24.0.5这种写法不带.el7后缀yum 会自动匹配当前系统对应的发行版标签。如果你明确知道要24.0.5-1.el7也可以写全。2.3 生成 repodata 让内网 yum 能识别光有 rpm 文件不够内网机器用yum localinstall一个个装容易漏依赖。更好的做法是把这些包做成一个本地仓库让 yum 自己解决依赖顺序。# 在 packages 目录同级生成 repodata createrepo /opt/docker-offline/packages # 打包整个目录方便拷贝 tar czf docker-24.0.5-offline.tar.gz -C /opt/docker-offline packagescreaterepo会扫描目录下所有 rpm生成repodata/repomd.xml等元数据文件。内网机器把这个目录配成 yum 源后yum install docker-ce就能像在线一样自动解析依赖。逻辑说明repodata 是 yum 的索引没有它 yum 只能靠文件名猜依赖容易失败。生成后整个目录就是一个可移植的本地源。参数说明createrepo默认在当前目录生成repodata如果目录里包很多可以加--workers 4加速。打包时用-C指定父目录解压后目录结构保持一致。2.4 内网机器上的源配置与安装把 tar 包拷到内网机器比如放到/opt下# 内网机器上解压 tar xzf docker-24.0.5-offline.tar.gz -C /opt # 备份原有 yum 源避免干扰 mkdir -p /etc/yum.repos.d/backup mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ 2/dev/null # 新建本地源文件 cat /etc/yum.repos.d/docker-local.repo EOF [docker-local] nameDocker 24.0.5 Local Repository baseurlfile:///opt/docker-offline/packages enabled1 gpgcheck0 EOF # 清理缓存并安装 yum clean all yum makecache yum install -y docker-ce-24.0.5 docker-ce-cli-24.0.5 containerd.io docker-buildx-plugin docker-compose-plugingpgcheck0是因为离线包没有导入 GPG 公钥内网环境可以接受。如果安全要求高可以提前把 Docker 的 GPG key 也拷进去导入。逻辑说明把原有 repo 移走是为了防止 yum 尝试联网超时。file://协议让 yum 直接读本地目录。yum makecache会读取 repodata 建立缓存之后安装就很快。参数说明baseurl必须指向包含repodata的目录不是 rpm 文件所在目录的上一层。如果路径写错yum makecache会报Cannot find a valid baseurl。装完后验证docker version # 应输出 Client 和 Server 均为 24.0.5 systemctl enable docker systemctl start docker3. 装完不是终点systemd 配置、镜像导入与存储驱动调优3.1 让 Docker 开机自启并确认 cgroup 驱动离线安装后 Docker 默认不会开机自启需要手动 enable。更重要的是确认 cgroup 驱动和系统一致。# 查看当前 cgroup 版本 stat -fc %T /sys/fs/cgroup/ # 输出 cgroup2fs 表示 cgroup v2tmpfs 表示 cgroup v1 # 查看 Docker 当前使用的 cgroup 驱动 docker info | grep -i cgroupCentOS 7 默认是 cgroup v1Docker 24.0.5 默认用cgroupfs驱动一般能直接跑。但如果系统启用了 systemd 的cgroup管理建议把 Docker 也切成systemd驱动避免资源限制不生效。# 编辑 Docker 守护进程配置 mkdir -p /etc/docker cat /etc/docker/daemon.json EOF { exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, data-root: /var/lib/docker } EOF systemctl daemon-reload systemctl restart docker逻辑说明native.cgroupdriversystemd让 Docker 通过 systemd 管理 cgroup和 Kubernetes 等编排工具的行为一致。日志限制防止容器日志把磁盘写满这是内网机器最常见的翻车点之一。参数说明># 外网机器上拉取并保存镜像 docker pull nginx:1.25-alpine docker save -o nginx-1.25-alpine.tar nginx:1.25-alpine # 如果有多个镜像可以一起 save docker save -o app-images.tar nginx:1.25-alpine redis:7.2-alpine mysql:8.0内网机器导入# 内网机器上加载镜像 docker load -i nginx-1.25-alpine.tar # 确认镜像存在 docker images | grep nginx逻辑说明docker save把镜像的层和元数据打包成 tardocker load反向恢复。这种方式保留完整的镜像 ID 和标签比export/import更可靠后者会丢失层历史和元数据。参数说明-o指定输出文件-i指定输入文件。如果 tar 包很大可以用gzip压缩后再拷docker load支持直接读 gzip 流docker load -i images.tar.gz。3.3 存储驱动选 overlay2 还是 devicemapperCentOS 7 内核 3.10 默认支持overlay2但需要xfs文件系统且ftype1。如果/var/lib/docker所在分区是ext4overlay2也能跑但性能不如xfs。# 查看当前存储驱动 docker info | grep Storage Driver # 查看文件系统类型 df -T /var/lib/docker如果输出是overlay2基本不用动。如果是devicemapper说明内核或文件系统不满足条件需要检查# 检查 xfs 是否支持 ftype xfs_info /var/lib/docker | grep ftype # 输出 ftype1 才支持 overlay2逻辑说明overlay2是 Docker 24.0.5 的推荐驱动性能好、层数支持多。devicemapper是旧方案有 10GB 默认容量限制容易在生产环境爆盘。参数说明如果必须用devicemapper要在daemon.json里加storage-driver: devicemapper和storage-opts: [dm.directlvm_device/dev/sdb]等参数但强烈建议升级文件系统或换机器。3.4 验证容器网络与端口映射装完跑一个测试容器确认网络和端口映射正常# 启动一个 nginx 测试容器 docker run -d --name test-nginx -p 8080:80 nginx:1.25-alpine # 检查容器状态 docker ps # 从宿主机访问 curl http://127.0.0.1:8080如果curl不通先看docker ps里端口映射是否正确再检查防火墙# 查看防火墙规则 iptables -L -n | grep 8080 # 或 firewalld firewall-cmd --list-ports逻辑说明Docker 默认会在iptables的nat表里加 DNAT 规则。如果宿主机开了firewalld可能需要放行端口或把 Docker 网桥加入信任区域。参数说明-p 8080:80把宿主机 8080 映射到容器 80。如果只想本机访问可以写-p 127.0.0.1:8080:80避免暴露到内网其他机器。4. 离线安装的避坑清单从依赖缺失到镜像导入失败4.1 坑一container-selinux 版本冲突导致安装中断现象yum install docker-ce报Error: Package: docker-ce-24.0.5-1.el7.x86_64 requires container-selinux 2:2.9但本地源里没有或版本不够。原因container-selinux在 CentOS 7 的extras源里yumdownloader --resolve时如果准备机没启用extras就不会被拉下来。解决在准备机上先yum-config-manager --enable extras再重新执行yumdownloader。或者手动从 CentOS 镜像站下载container-selinux-2.119.2以上版本放进 packages 目录重新createrepo。4.2 坑二libcgroup 和 fuse-overlayfs 被遗漏现象安装过程没报错但systemctl start docker失败journalctl -u docker显示failed to start daemon: error initializing graphdriver: overlay2: unknown option。原因缺少fuse-overlayfs或libcgroup这两个包在某些最小化安装的 CentOS 7 上不是默认自带。解决在准备机上确认yumdownloader输出里包含fuse-overlayfs和libcgroup。如果没有手动yumdownloader fuse-overlayfs libcgroup补拉。内网安装时先装这两个再装 Docker。4.3 坑三docker save 的 tar 包在 load 时报“invalid tar header”现象docker load -i images.tar报Error processing tar file(exit status 1): invalid tar header。原因文件在拷贝过程中损坏或者用scp传输时没加-C压缩导致大文件截断。也可能是docker save时磁盘满tar 包不完整。解决在外网机器上先tar tf images.tar验证包完整性确认能列出内容。传输时用rsync -avz --progress或scp -C。内网机器上对比 md5md5sum images.tar和外网一致再 load。4.4 坑四daemon.json 格式错误导致 Docker 起不来现象改完daemon.json后systemctl restart docker失败journalctl显示unable to configure the Docker daemon with file /etc/docker/daemon.json: invalid character。原因JSON 里多了逗号、少了引号或者用了中文标点。这是血泪经验手写 JSON 很容易翻车。解决用python -m json.tool /etc/docker/daemon.json验证格式或者jq . /etc/docker/daemon.json。确认无误再重启。改之前先备份原文件出问题能快速回滚。4.5 坑五内网 yum 源路径写错导致 makecache 失败现象yum makecache报Cannot find a valid baseurl for repo: docker-local。原因baseurl写成了file:///opt/docker-offline但repodata在packages子目录里。yum 要求baseurl直接指向包含repodata的目录。解决确认ls /opt/docker-offline/packages/repodata/repomd.xml存在然后把baseurl改成file:///opt/docker-offline/packages。改完yum clean all再yum makecache。5. 批量交付时怎么把离线安装压成一条命令单台机器装完不算完产线交付经常是十几台同配置机器。一台台拷 tar 包、配源、装依赖太慢我一般会做一个自解压安装脚本把 packages 目录和安装逻辑打包成一个.run文件。核心思路是用makeself把目录做成自解压归档解压后自动执行install.sh。install.sh里做三件事配本地源、装 Docker、写daemon.json。#!/bin/bash # install.sh - 内网 Docker 24.0.5 一键安装 set -e SCRIPT_DIR$(cd $(dirname $0) pwd) PACKAGE_DIR$SCRIPT_DIR/packages # 1. 备份原有源 mkdir -p /etc/yum.repos.d/backup mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ 2/dev/null || true # 2. 配置本地源 cat /etc/yum.repos.d/docker-local.repo EOF [docker-local] nameDocker 24.0.5 Local Repository baseurlfile://$PACKAGE_DIR enabled1 gpgcheck0 EOF # 3. 安装 Docker yum clean all yum makecache yum install -y docker-ce-24.0.5 docker-ce-cli-24.0.5 containerd.io \ docker-buildx-plugin docker-compose-plugin # 4. 写 daemon.json mkdir -p /etc/docker cat /etc/docker/daemon.json EOF { exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } } EOF # 5. 启动并自启 systemctl daemon-reload systemctl enable docker systemctl start docker # 6. 验证 docker version echo Docker 24.0.5 离线安装完成逻辑说明set -e让脚本遇到错误立即退出避免装了一半还继续。SCRIPT_DIR动态获取脚本所在目录保证baseurl路径正确。daemon.json用 heredoc 写入避免手写 JSON 出错。参数说明如果目标机器磁盘布局不同可以在脚本里加DATA_ROOT变量把>makeself --gzip /opt/docker-offline docker-24.0.5-installer.run \ Docker 24.0.5 Offline Installer ./install.sh生成的.run文件拷到内网机器chmod x后直接执行全程不用联网。我一般还会在脚本最后加一个docker load循环把常用镜像也一起导入# 导入同目录下的所有镜像 tar 包 for img in $SCRIPT_DIR/images/*.tar; do [ -f $img ] docker load -i $img done从那以后我每次做离线交付都会先在准备机上跑一遍yumdownloader确认依赖列表里没有遗漏container-selinux和fuse-overlayfs再把整个目录打成自解压包。内网机器上一条命令跑完比手动装快得多也少了很多“这台能装那台报错”的玄学问题。希望帮到你。本文还有配套的精品资源点击获取
