Docker 24.0.5离线安装全攻略:RPM与二进制两种方式详解

Docker 24.0.5离线安装全攻略:RPM与二进制两种方式详解 简介docker 24.0.5 离线安装包专为无法连接公网的环境设计帮助运维人员在隔离网络或离线服务器上快速完成Docker部署。资源共18个文件包含17个rpm依赖包与1个install_docker.sh安装脚本压缩后体积108.02MB一次下载即可获得全部所需组件。rpm包不仅提供docker-ce主程序与cli还集成了containerd.io运行时、docker-compose-plugin 2.20.2、buildx插件以及fuse、slirp4netns等底层依赖覆盖docker rootless模式和compose编排所需组件脚本会自动完成安装并启动服务但需注意连续执行两次以确保所有依赖注册和启用成功。安装后docker与docker compose命令可直接生效无需再联网拉取。当前已有933人学习使用适合内网部署、离线交付以及对系统环境有严格管控要求的场景可显著节省手动匹配依赖的时间降低安装失败风险。 说实话看到“docker 24.0.5 离线安装”这个需求我就知道你又遇到内网环境了。我这边也经常碰到这种场景客户那边机房物理隔离或者干脆就是涉密网络外网一个端口都不给你留但业务又必须容器化落地。这种时候你想在线执行curl -fsSL https://get.docker.com | bash那一套是根本行不通的唯一的出路就是把安装包在有网的机器上备齐再拿U盘或内网传输工具搬进去装。这篇文章我就把我在离线环境下安装 docker 24.0.5 的完整过程复盘一遍覆盖两种主流安装方式RPM包安装和二进制包安装。内容包括怎么在有网机器上把依赖准备齐全、到离线机器上具体执行哪些命令、装完之后的daemon.json怎么配、以及我实际踩过的坑和排查思路。不管你是CentOS、Ubuntu还是麒麟、欧拉这类国产系统都能在这篇文章里找到可落地的方案。1. 为什么选24.0.5以及离线装Docker前必须想清楚的事1.1 关于版本选择的一点建议24.0.x是2023年中的稳定版本线24.0.5这个补丁版本发布时修复了不少问题整体属于“稳”的阶段。我选这个版本的原因其实很简单离线环境不是拿来尝鲜的越新越容易翻车。你在有网环境装错了可以一键重来离线环境一旦装到一半发现版本bug重新传包、重新依赖折腾的时间成本非常高。另外24.0.x版本对containerd的依赖清晰systemd集成也成熟社区资料多。以后真要排查问题网上的案例一搜一大把这对离线场景来说非常重要。当然如果你所在组织的安全基线要求更高的版本思路是一样的把下面的版本号替换掉即可。1.2 离线装的本质把“在线安装会做的事”提前做完在线安装docker本质上就是四条路配置docker-ce的yum/apt软件源让包管理器自己拉取 docker-ce、docker-ce-cli、containerd.io 以及一堆依赖通过包管理器完成二进制文件、systemd服务文件、配置文件的放置启动服务并验证离线安装的难点在第2步和第3步。没有外网包管理器拉不到东西所以我们必须在有网机器上提前把依赖下载好再以本地包或二进制文件的方式搬过去。理解了这个逻辑后面整个操作其实就非常清晰了——不是在装一个多复杂的软件而是在手动补全“安装包分发”这个动作。在开始之前我建议你先确认两件事。第一目标机器的CPU架构x86_64还是aarch64这个直接决定下载哪个包搞错了装上也会报错第二目标机器的Linux发行版和版本因为下面两种安装方式适用的场景不同。你也可以直接看下面这个对比表快速判断自己该走哪条路。对比项RPM包方式二进制tar包方式适用系统CentOS / RHEL / 麒麟 / 欧拉等RPM系所有Linux发行版包括Debian、Ubuntu依赖处理需要手动收集依赖rpm包基本无依赖解压即用包体大小约300MB~500MB含依赖约80MBsystemd服务RPM包会自带service文件需要手写service文件后续卸载维护yum remove即可删文件、停服务我的经验是如果目标系统是CentOS 7/8这类成熟RPM系优先用RPM包方式省心如果目标系统比较冷门或者你不想被依赖问题折磨二进制包方式几乎是一招通吃。2. 准备工作在有网机器上把安装包“一网打尽”2.1 方式一用yumdownloader收集RPM包及全部依赖假设你手头有一台和离线机相同系统版本的联网机器这里以CentOS 7.9为例第一步先配置docker-ce的官方源。注意这里配置源只是为了下载不会真的安装docker。yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo然后创建一个目录把要装的包和依赖全部拉进去mkdir -p /opt/docker-offline cd /opt/docker-offline yumdownloader --resolve \ docker-ce-24.0.5 \ docker-ce-cli-24.0.5 \ containerd.io \ docker-compose-plugin \ docker-buildx-plugin这里要特别说一下--resolve参数的作用。它会像正常yum安装一样把 docker-ce 24.0.5 依赖的所有rpm包比如container-selinux、libseccomp、policycoreutils-python-utils、tar等全都下载到当前目录。少了这个参数你只拿到一个孤零零的docker-ce主包到了离线机器上一装就是一堆依赖报错。我实际遇到的情况是有些依赖可能来自epel源如果你的联网机器没装epelyumdownloader会提示找不到某些包这时候先yum install -y epel-release再重新下载。下完之后把整个目录打成tar包cd /opt tar -czf docker-offline-centos7.tar.gz docker-offline/拷贝到离线机器上就行。这里再补一个很多人会忽略的细节下载完看一眼目录里是不是有container-selinux这个包这个包是最容易被漏掉的而且经常在官方源里没有要从epel里才能拉下来。没有它docker-ce装不上是大概率事件。2.2 方式二直接下载静态二进制tar包一包走天下如果你不想跟依赖做斗争我强烈推荐直接用官方静态二进制包。这个包把docker运行时、dockerd、containerd等所有二进制都编译打包好了不含任何依赖适用于几乎所有Linux发行版。下载地址wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.5.tgz如果你的目标机器是ARM架构把路径里的x86_64换成aarch64wget https://download.docker.com/linux/static/stable/aarch64/docker-24.0.5.tgz如果你还想离线使用docker compose v2插件可以顺手把compose的二进制一起下下来wget https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-linux-x86_64注意compose是单独的Go二进制放到/usr/libexec/docker/cli-plugins/目录下就能被docker命令识别。别下载错了平台版本。2.3 两种情况都建议做的一件事把版本记录写清楚别笑我吃过这个亏。有次我给三台机器装了不同小版本的docker过了两个月要统一升级结果谁也想不起来当时到底装的哪个rpm包。所以我现在养成了个习惯在存放安装包的目录里放一个VERSION.txt写清楚docker版本、containerd.io版本、compose插件版本、下载日期、来源路径。这个习惯在离线环境下尤其重要因为你没法随时上外网查历史版本信息。3. 离线机器上的实际安装步骤3.1 RPM方式离线环境下最稳的三步走把之前的tar包上传到离线机器后先解压tar -xzf docker-offline-centos7.tar.gz cd docker-offline用本地rpm包安装我推荐用yum localinstall因为它在本地解析依赖时表现得比rpm更聪明能处理本地包之间的相互依赖yum localinstall -y *.rpm如果一切正常你会看到yum自动处理了本地依赖然后安装成功。这时候先别急着启动先确认一下安装结果docker --version输出类似Docker version 24.0.5, build ced0996就说明安装OK。3.2 二进制方式复制文件、写系统服务、启动二进制方式稍微多几步但完全不挑系统。先把包解压并把二进制复制到PATH目录tar -xzf docker-24.0.5.tgz cp docker/* /usr/bin/如果你需要compose插件创建插件目录并放置mkdir -p /usr/libexec/docker/cli-plugins/ cp docker-compose-linux-x86_64 /usr/libexec/docker/cli-plugins/docker-compose chmod x /usr/libexec/docker/cli-plugins/docker-compose然后需要手写systemd服务文件。创建一个/etc/systemd/system/docker.service文件内容如下[Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service containerd.service Wantsnetwork-online.target [Service] Typenotify ExecStart/usr/bin/dockerd ExecReload/bin/kill -s HUP $MAINPID LimitNOFILEinfinity LimitNPROCinfinity LimitCOREinfinity TimeoutStartSec0 Delegateyes KillModeprocess Restarton-failure StartLimitBurst3 StartLimitInterval60s [Install] WantedBymulti-user.target这个文件看起来简单但每行都有讲究。Typenotify表示dockerd启动完成后通过sd_notify通知systemd而不是简单检查进程是否拉起这样能确保Docker真正可用之后服务才算启动成功Delegateyes允许docker管理自己的cgroup、namespace等子系统KillModeprocess保证重启docker服务时不会误杀容器内的进程。写完之后重载并启动systemctl daemon-reload systemctl enable docker systemctl start docker启动后验证一下systemctl status docker docker versiondocker version要能看到Client和Server两部分如果你只看到Client而没有Server部分说明dockerd没有正常运行往下看第四节。3.3 安装完成后的基础配置提前写好daemon.json无论是RPM方式还是二进制方式我强烈建议你在启动服务后立刻配置/etc/docker/daemon.json。这里放一些常用的基础配置特别是日志限制不配的话默认的json-file日志会无限制增长最终把你的磁盘打满。{ exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, storage-driver: overlay2, iptables: true, ip-forward: true }解释一下几个关键项。native.cgroupdriversystemd是为了统一cgroup驱动如果以后要接Kubernetes这一步能避免很多驱动不匹配的问题max-size和max-file限制每个容器日志文件的大小和数量生产环境必配storage-driver指定overlay2这是现代Linux内核上性能最好的存储驱动。配置完成后重启dockersystemctl daemon-reload systemctl restart docker最后验证一次容器能正常运行docker run --rm hello-world如果离线环境连hello-world镜像都没有可以用docker pull在有网机器上拉好镜像再docker save -o hello.tar hello-world:latest带进来导入这部分属于离线镜像分发的话题我这里先按下不表。4. 常见问题与排错记录离线安装最坑的几个点4.1 依赖报错缺少container-selinux和libseccompRPM方式安装最常见的报错就是错误依赖检测失败 container-selinux 2.107 被 docker-ce-24.0.5-1.el7.x86_64 需要 libseccomp 2.3 被 docker-ce-24.0.5-1.el7.x86_64 需要遇到这个报错说明你有网机器下载依赖的时候没有收集全。解决办法就是回到有网机器上补下yum install -y container-selinux libseccomp yumdownloader --resolve container-selinux libseccomp然后把新下载的rpm也拷到离线机器上重新执行yum localinstall -y *.rpm。如果目标机器是CentOS 7libseccomp版本可能过低这时候需要手动更新libseccomp到2.4以上否则dockerd启动时会报version LIBSE CCP_2.4 not found具体解法看4.2。4.2 启动失败dockerd报错服务起不来systemctl start docker执行后过几秒报错或者一直卡住这是离线安装最常见的情况。第一件事是看日志journalctl -u docker --no-pager -n 50我遇到的典型错误有这么几类。第一类Failed to start Docker Application Container Engine日志里出现/usr/bin/dockerd: /lib64/libseccomp.so.2: version LIBSE_CCP_2.4 not found (required by /usr/bin/dockerd)这是libseccomp版本不匹配导致的。解决办法是下载新版本的libseccomp rpm包安装CentOS 7上可以这样wget http://rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/libseccomp-2.3.1-4.el7.x86_64.rpm rpm -Uvh libseccomp-2.3.1-4.el7.x86_64.rpm如果rpmfind上面的版本还是不够可以考虑从更高版本的CentOS仓库里借libseccomp但这样有风险我一般直接更新到2.4版本。第二类网络转发没有开启日志里出现WARNING: IPv4 forwarding is disabled先检查cat /proc/sys/net/ipv4/ip_forward如果输出是0临时开启echo 1 /proc/sys/net/ipv4/ip_forward永久开启需要改/etc/sysctl.conf加上net.ipv4.ip_forward 1然后sysctl -p生效。第三类overlay存储驱动挂载失败Error starting daemon: error initializing graphdriver: overlay2: unknown option这种通常是内核版本过低或必须的模块没加载。先用uname -r看内核版本CentOS 7的内核3.10虽然能用overlay2但需要确认是否加载了overlay模块执行modprobe overlay试试。如果不行老老实实改成vfs驱动或升级内核。4.3 SELinux和防火墙导致的“装成功但不可用”有时候docker启动成功了docker ps也正常但容器网络不通或者启动容器的瞬间被拒绝。如果是CentOS/RHEL系先检查SELinux状态getenforce如果输出是Enforcing而daemon.json里没做适配docker可能报SELinux is not supported with the overlay2 graph driver on this kernel 要么把SELinux关掉setenforce 0要么在daemon.json里加 selinux-enabled: false但关SELinux这事在严格安全要求的网络环境里可能过不了合规我一般建议在daemon.json里显式禁用docker自己的selinux支持保留系统层面的SELinux策略虽然保守但至少能用。防火墙这块如果你本机开了firewallddocker会尝试自动操作iptables规则。但有些安全加固过的系统docker的规则会被firewalld覆盖导致容器出不去外网。排查时可以先临时停掉firewalldsystemctl stop firewalld如果停掉之后网络恢复正常那就是firewalld和docker iptables规则冲突。一个临时解决办法是把docker0网卡加入trusted zonefirewall-cmd --permanent --zonetrusted --add-interfacedocker0 firewall-cmd --reload但要注意docker每创建一个自定义网桥都需要类似处理比较繁琐。在生产环境我更推荐直接用docker的iptables能力把firewalld对docker网段的干扰降到最低或者干脆在安全策略允许的条件下禁用firewalld。4.4 离线机器上镜像导入的一个连带问题装好docker之后你会发现在离线机器上没法直接docker pull任何镜像。这时候需要把有网机器上拉好的镜像保存成文件带进来docker save -o nginx-1.25.tar nginx:1.25到离线机器上导入docker load -i nginx-1.25.tar这里提一个细节save命令保存的是镜像本身的层数据如果你忘了打tag导入后镜像的repository和tag可能会变成none:none所以保存前最好确认一下docker images里的REPOSITORY和TAG标记完整。另外对于多架构镜像比如同时有amd64和arm64在有网机器上save时要指定平台参数否则默认只会保存当前机器的架构版本拿到离线机上可能跑不起来。5. 批量部署的扩展思路做一个本地yum源如果你的离线环境不止一两台机器而是几十台甚至上百台一台台rpm安装或解压二进制就太低效了。我建议在离线内网里找一台机器作为“软件分发节点”把之前下载的所有rpm包做成一个本地yum源然后其他机器通过内网地址直接yum安装。做法很简单。在有网机器上下载依赖时注意保留你收集的那个rpm目录。把它传到内网的一台服务器上假设IP是192.168.10.20安装createrepo并生成仓库元数据yum install -y createrepo mkdir -p /data/docker-repo cp *.rpm /data/docker-repo/ createrepo /data/docker-repo然后在那台分发节点上启动一个HTTP服务简单起见可以用nginx或者pythoncd /data/docker-repo python3 -m http.server 8080其他离线机器上配置一个本地repo文件/etc/yum.repos.d/docker-local.repo[docker-local] nameDocker Local Repo baseurlhttp://192.168.10.20:8080/ enabled1 gpgcheck0之后每台机器只需要执行yum install -y docker-ce-24.0.5依赖自动从内网源里解析效率比手动rpm安装高得多。这个方法同样适用于离线安装其他软件思路完全通用。我在实际项目里用这套方案批量部署过几十台机器基本零失败。唯一要注意的是内网分发节点的HTTP服务要设置开机自启不然节点重启之后其他机器再装软件就会发现源不可用。最后再说一个个人习惯装完所有机器后我一定会每台机器执行一次docker info重点看Server Version、Storage Driver、Cgroup Driver这几项是否一致。运维场景里环境一致性就是安全感版本参差不齐的集群后续排查问题会让你怀疑人生。本文还有配套的精品资源点击获取