Docker 24.0.5 离线安装全攻略:内网环境从零部署与批量实践
简介这份资源面向需要在无外网或内网环境中部署容器运行时的运维与开发人员提供 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 离线安装内网机器上从零跑起容器的完整路径手里拿到一台不能连外网的 CentOS 7 或 Ubuntu 机器领导让你把 docker 24.0.5 装上去跑业务容器这大概是很多做交付、驻场、军工或金融内网项目的工程师都遇到过的场景。在线装 docker 一条yum install就完事可一旦断网docker-ce的依赖链、containerd.io的版本匹配、docker-compose-plugin的取舍全都会变成拦路虎。这篇笔记就围绕 docker 24.0.5 离线安装这一件事把包从哪来、怎么传、怎么装、装完怎么验证、踩过哪些坑讲透。适合手上有内网服务器、需要批量部署容器运行时、又不想每次现场联网折腾的运维和交付同学。读完你能拿到一套可复现的离线安装流程而不是只会背命令。2. 离线安装前必须搞清的包结构与版本匹配离线安装翻车八成不是命令敲错而是包本身没凑齐或者版本对不上。docker 24.0.5 这个版本号属于 Docker Engine 的 CE 分支它的安装包不是一个孤立的 rpm而是一组互相咬合的组件。先把这层关系理清后面传包才不会漏。2.1 docker 24.0.5 到底由哪几个包组成在 RHEL/CentOS 系上一次完整的 docker 24.0.5 离线安装通常涉及四个核心包docker-ce、docker-ce-cli、containerd.io、docker-buildx-plugin如果要用 compose v2 还要加docker-compose-plugin。它们的关系是docker-ce是引擎主体docker-ce-cli提供docker命令行containerd.io是底层容器运行时docker-buildx-plugin负责 buildx 构建。缺任何一个systemctl start docker都可能起不来或者起来了但docker buildx报错。在 Debian/Ubuntu 系上对应的是.deb包名字类似docker-ce_24.0.5-1~ubuntu.22.04~jammy_amd64.deb依赖关系同样存在dpkg -i时如果缺containerd.io会直接报依赖错误。提示docker 24.0.5 对containerd.io有最低版本要求一般要 1.6.18 以上。版本低于这个数装完启动会报failed to start daemon之类的错别问我是怎么知道的。2.2 为什么不能只拷一个 docker-ce 包很多人图省事只从某台能上网的机器上yumdownloader docker-ce拉一个包就走结果到内网一装报一堆Requires: containerd.io xxx。原因是docker-ce的 rpm 里写死了对containerd.io和docker-ce-cli的依赖rpm -ivh不会自动帮你解决yum localinstall虽然能读本地依赖但你得先把依赖包都放在同一个目录。正确的做法是在一台和目标准备装 docker 的机器操作系统版本、架构完全一致的联网机器上用yumdownloader或apt-get download把整条依赖链一次性拉全。这一步是整个离线安装的地基地基没打好后面全是返工。2.3 联网机器上一次性拉全依赖包的命令以 CentOS 7 x86_64 为例先装yum-utils再用yumdownloader带--resolve参数把依赖一起下载# 在联网的同版本 CentOS 7 机器上执行 yum install -y yum-utils # 添加 docker 官方仓库联网机器上临时加拉完包可删 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 创建存放离线包的目录 mkdir -p /tmp/docker-offline # 下载 docker 24.0.5 及其全部依赖--resolve 是关键 yumdownloader --resolve --destdir/tmp/docker-offline \ docker-ce-24.0.5 \ docker-ce-cli-24.0.5 \ containerd.io \ docker-buildx-plugin \ docker-compose-plugin--resolve的作用是递归解析依赖把docker-ce依赖的containerd.io、libcgroup等一并下载。--destdir指定输出目录避免污染当前目录。执行完ls /tmp/docker-offline应该能看到十几个 rpm包括container-selinux、libcgroup这类系统依赖。如果只看到三四个包说明--resolve没生效或者仓库没配对。Debian/Ubuntu 系对应命令是# Ubuntu 22.04 联网机器上执行 mkdir -p /tmp/docker-offline cd /tmp/docker-offline apt-get download docker-ce5:24.0.5-1~ubuntu.22.04~jammy \ docker-ce-cli5:24.0.5-1~ubuntu.22.04~jammy \ containerd.io docker-buildx-plugin docker-compose-plugin # 依赖包用 apt-rdepends 或 aptitude 递归下载 apt-get install -y apt-rdepends apt-rdepends docker-ce | grep -v ^ | xargs apt-get downloadapt-get download只下指定包不装apt-rdepends列出递归依赖后再批量下载。注意 Ubuntu 上 docker 包版本号带5:的 epoch 前缀写错版本号会提示找不到包。2.4 校验包完整性再往内网传包拉到本地后别急着 U 盘一拷就走。先核对文件数量和大小再用sha256sum生成校验清单传到内网后比对一遍。血泪经验U 盘或跳板机传输过程中文件截断是常事装到一半报rpm 包损坏能让你排查半天。# 生成校验清单 cd /tmp/docker-offline sha256sum *.rpm checksums.txt # 打包方便整体传输 tar czf docker-24.0.5-offline.tar.gz *.rpm checksums.txt传到内网机器后先sha256sum -c checksums.txt全部 OK 再解压安装。这一步多花两分钟能省掉后面半小时的玄学排查。3. 内网机器上执行 docker 24.0.5 离线安装的完整步骤包备齐了接下来是在目标机器上真正落地。这一章按 CentOS 7 和 Ubuntu 两条线分别给步骤因为两者的包管理器和依赖处理方式差别不小混着讲容易出错。3.1 CentOS 7 上用 yum localinstall 装 docker 24.0.5把离线包解压到目标机器某个目录比如/opt/docker-offline然后进目录执行本地安装。推荐用yum localinstall而不是rpm -ivh因为 yum 会读本地目录里的依赖关系自动按顺序装省得你手动排依赖顺序。# 解压离线包 mkdir -p /opt/docker-offline tar xzf docker-24.0.5-offline.tar.gz -C /opt/docker-offline cd /opt/docker-offline # 校验完整性 sha256sum -c checksums.txt # 用 yum 本地安装自动处理依赖顺序 yum localinstall -y *.rpmyum localinstall会扫描当前目录所有 rpm解析依赖后按正确顺序安装。如果报Error: Package xxx requires yyy说明依赖包没下全回联网机器补下。装完执行docker --version应该输出Docker version 24.0.5, build ced0996。3.2 Ubuntu 22.04 上用 dpkg 装 deb 包并补依赖Ubuntu 上dpkg -i不会自动解决依赖装完一堆包处于unpacked未配置状态。标准做法是先dpkg -i全部包再用apt-get install -f修复依赖但离线环境apt-get install -f会尝试联网所以得先把依赖包也dpkg -i进去。# 解压并进入目录 mkdir -p /opt/docker-offline tar xzf docker-24.0.5-offline.tar.gz -C /opt/docker-offline cd /opt/docker-offline # 一次性安装所有 deb 包 dpkg -i *.deb # 如果报依赖错误检查是否所有依赖包都在目录里 # 全部装完后验证 docker --version如果dpkg -i报dependency problems prevent configuration用dpkg -l | grep -v ^ii看哪些包没配置成功通常是某个依赖 deb 没下全。Ubuntu 上containerd.io和docker-ce的依赖关系比 CentOS 更敏感版本差一个小版本都可能报错。3.3 启动 docker 服务并设置开机自启包装完不等于能用还得把docker.service拉起来。docker 24.0.5 装完会自动创建 systemd unit直接systemctl操作即可。# 启动 docker 服务 systemctl start docker # 设置开机自启 systemctl enable docker # 查看服务状态确认 active (running) systemctl status docker # 验证 daemon 是否正常响应 docker infosystemctl status docker显示active (running)才算成功。如果显示failed用journalctl -u docker -n 50看最近 50 行日志常见原因是containerd没起来或者/var/lib/docker权限不对。docker info能输出 Server 段信息说明 daemon 和 cli 通信正常。3.4 装完必做的三项验证装完不验证等于没装。我一般固定做三件事跑 hello-world、看版本、测容器网络。# 1. 跑官方 hello-world 镜像离线环境需提前导入镜像 docker run --rm hello-world # 2. 确认客户端和服务端版本一致 docker version # 3. 起一个临时容器测网络和存储 docker run --rm alpine echo offline docker works离线环境里docker run hello-world会失败因为拉不到镜像。这时候要么提前在有网机器docker save镜像再docker load进来要么用本地已有的镜像测。docker version要确认 Client 和 Server 都是 24.0.5版本不一致可能是 cli 和 engine 装岔了。3.5 离线导入基础镜像让容器真正跑起来docker 装好了但没镜像等于空壳。离线场景下镜像也得手动搬。标准流程是在联网机器docker pull后docker save成 tar传到内网docker load。# 联网机器上保存镜像 docker pull alpine:3.19 docker save alpine:3.19 -o alpine-3.19.tar # 传到内网机器后导入 docker load -i alpine-3.19.tar # 确认镜像已存在 docker images | grep alpinedocker save会把镜像所有层打包成一个 tardocker load反向导入。注意save和export不是一回事export导的是容器文件系统丢了镜像元数据别用错。导入后docker images能看到alpine 3.19就说明镜像链路通了。4. docker 24.0.5 离线安装的避坑与排查清单这一章全是踩过的坑每条按现象、原因、解决三段写。离线安装的坑大多集中在依赖、权限、SELinux 和 systemd 这几块提前知道能少走弯路。4.1 现象yum localinstall 报 Requires containerd.io原因docker-ce的 rpm 元数据里写死了对containerd.io的版本依赖而离线目录里没下这个包或者下的版本低于要求。docker 24.0.5 要求containerd.io 1.6.18。解决回联网机器用yumdownloader --resolve containerd.io单独拉最新版确认版本号满足要求后重新打包。别想着用--nodeps跳过依赖跳过的后果是 daemon 起不来。4.2 现象systemctl start docker 卡住然后 failed原因多半是containerd服务没起来或者/var/lib/docker所在分区满了、权限不对。docker 24.0.5 启动时会先拉起containerdcontainerd 挂了 docker 必然挂。解决先systemctl status containerd看状态再journalctl -u containerd -n 50看日志。如果是磁盘满df -h /var/lib/docker确认如果是权限chmod 711 /var/lib/docker。SELinux 开启的机器还要确认container-selinux包装了。4.3 现象docker info 报 Cannot connect to the Docker daemon原因daemon 没启动或者当前用户不在docker组里没权限访问/var/run/docker.sock。解决先systemctl status docker确认服务在跑。服务正常但普通用户报这个错执行usermod -aG docker $USER把用户加进 docker 组然后重新登录不是source一下就行组权限要新会话才生效。懒得重登就newgrp docker临时切。4.4 现象Ubuntu 上 dpkg -i 后包处于 unpacked 状态原因dpkg不解决依赖某个依赖 deb 没装或版本不对导致后续包无法 configure。解决dpkg -l | grep -v ^ii | grep docker找出没配置成功的包检查对应依赖 deb 是否在目录里。全部dpkg -i一遍后如果还不行用apt-get install -f --no-download尝试用本地缓存修复。实在不行就回联网机器用apt-rdepends把依赖下全。4.5 现象装完 docker 但 docker compose 命令不存在原因docker 24.0.5 的 compose v2 是独立包docker-compose-plugin不装这个包就没有docker compose子命令。很多人只装了docker-ce和cli自然找不到。解决确认离线目录里有docker-compose-plugin的 rpm 或 deb补装即可。装完docker compose version应该输出Docker Compose version v2.x.x。注意是docker compose空格不是docker-compose横杠v2 改了调用方式。5. 批量离线部署与版本锁定的进阶技巧单台装完只是开始真实项目往往是几十台内网机器要统一装 docker 24.0.5。一台台拷 U 盘不现实得有一套可复制的批量方案。这一章讲两个我常用的技巧用本地 yum 仓库做批量源以及用脚本固化整个安装流程。5.1 用 createrepo 搭本地 yum 源实现批量安装把离线 rpm 放到一台内网机器上用createrepo生成仓库元数据其他机器配个 repo 文件就能yum install比逐台localinstall干净得多。# 在内网作为源的机器上执行 yum install -y createrepo mkdir -p /var/www/docker-repo cp /opt/docker-offline/*.rpm /var/www/docker-repo/ createrepo /var/www/docker-repo/ # 用 nginx 或 python 起个简单 http 服务 cd /var/www python3 -m http.server 8080 然后在其他内网机器上配 repo# 目标机器上创建 repo 文件 cat /etc/yum.repos.d/docker-offline.repo EOF [docker-offline] nameDocker Offline Repo baseurlhttp://源机器IP:8080/docker-repo enabled1 gpgcheck0 EOF # 清缓存并安装 yum clean all yum makecache yum install -y docker-ce-24.0.5 docker-ce-cli-24.0.5 containerd.iocreaterepo生成repodata目录yum 靠它解析依赖。gpgcheck0是因为离线包没签名内网可信环境可以关。这样几十台机器一条yum install搞定版本还统一。5.2 用 shell 脚本固化安装与验证流程批量场景下把安装、启动、验证写成一个脚本每台机器跑一遍减少人为漏步骤。脚本里加set -e让出错即停避免装一半继续跑。#!/bin/bash set -e # 检查是否已安装 if command -v docker /dev/null; then echo docker already installed: $(docker --version) exit 0 fi # 安装 cd /opt/docker-offline yum localinstall -y *.rpm # 启动并自启 systemctl start docker systemctl enable docker # 验证 docker version docker info /dev/null echo docker daemon OK echo docker 24.0.5 offline install doneset -e保证任何一步失败就退出不会带着错误往下跑。command -v docker做幂等判断重复执行不会重复装。docker info /dev/null只关心退出码daemon 不通就报错。这个脚本我一般放在离线包 tar 里一起传现场直接bash install.sh。5.3 版本锁定为什么建议固定 24.0.5 不随意升级内网环境最怕版本漂移。今天这台装 24.0.5明天那台装了 24.0.7容器行为不一致排查问题时根本对不上。建议在 repo 文件或脚本里写死版本号比如docker-ce-24.0.5而不是docker-ce。这样即使本地源里有新版本也不会被意外升级。另外把yum versionlock用起来锁死 docker 相关包yum install -y yum-plugin-versionlock yum versionlock docker-ce docker-ce-cli containerd.ioversionlock会在 yum 配置里加锁后续yum update不会动这几个包。内网交付项目里版本一致性比追新重要得多这是我踩过多次坑后的习惯。5.4 验证批量部署是否真的成功批量装完不能只看脚本输出得抽查。我一般随机挑三台跑同一组命令对比输出检查项命令期望结果版本一致docker version --format {{.Server.Version}}全部输出 24.0.5daemon 正常docker info --format {{.ServerVersion}}输出 24.0.5 无报错容器能跑docker run --rm alpine echo ok输出 ok开机自启systemctl is-enabled docker输出 enabled四项全过才算批量部署成功。任何一台不一致回查它的 repo 配置或安装脚本。这套验证流程看着繁琐但比上线后容器起不来再回头查强太多。希望帮到你。本文还有配套的精品资源点击获取