简介:这份资源面向需要在无外网或内网环境中部署容器运行时的运维与开发人员,提供 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.x,API 跳到 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] name=Docker 24.0.5 Local Repository baseurl=file:///opt/docker-offline/packages enabled=1 gpgcheck=0 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-plugingpgcheck=0是因为离线包没有导入 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 v2,tmpfs 表示 cgroup v1 # 查看 Docker 当前使用的 cgroup 驱动 docker info | grep -i cgroupCentOS 7 默认是 cgroup v1,Docker 24.0.5 默认用cgroupfs驱动,一般能直接跑。但如果系统启用了 systemd 的cgroup管理,建议把 Docker 也切成systemd驱动,避免资源限制不生效。
# 编辑 Docker 守护进程配置 mkdir -p /etc/docker cat > /etc/docker/daemon.json <<'EOF' { "exec-opts": ["native.cgroupdriver=systemd"], "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.cgroupdriver=systemd让 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把镜像的层和元数据打包成 tar,docker load反向恢复。这种方式保留完整的镜像 ID 和标签,比export/import更可靠,后者会丢失层历史和元数据。
参数说明:-o指定输出文件,-i指定输入文件。如果 tar 包很大,可以用gzip压缩后再拷,docker load支持直接读 gzip 流:docker load -i images.tar.gz。
3.3 存储驱动选 overlay2 还是 devicemapper
CentOS 7 内核 3.10 默认支持overlay2,但需要xfs文件系统且ftype=1。如果/var/lib/docker所在分区是ext4,overlay2也能跑,但性能不如xfs。
# 查看当前存储驱动 docker info | grep "Storage Driver" # 查看文件系统类型 df -T /var/lib/docker如果输出是overlay2,基本不用动。如果是devicemapper,说明内核或文件系统不满足条件,需要检查:
# 检查 xfs 是否支持 ftype xfs_info /var/lib/docker | grep ftype # 输出 ftype=1 才支持 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。内网机器上对比 md5:md5sum 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] name=Docker 24.0.5 Local Repository baseurl=file://$PACKAGE_DIR enabled=1 gpgcheck=0 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.cgroupdriver=systemd"], "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,再把整个目录打成自解压包。内网机器上一条命令跑完,比手动装快得多,也少了很多“这台能装那台报错”的玄学问题。希望帮到你。
本文还有配套的精品资源,点击获取