ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Docker 24.0.5 内网离线安装实战:依赖对齐与避坑指南

Docker 24.0.5 内网离线安装实战:依赖对齐与避坑指南 简介本资源为 Docker 24.0.5 的离线安装包面向无法访问外网或内网环境受限的运维与开发人员帮助其在 CentOS 7 等系统上快速完成容器引擎部署。包内共 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 等运行依赖免去逐一下载的麻烦。执行脚本即可自动安装并启动 Docker同时附带 docker compose 命令需注意脚本需运行两遍以确保依赖完整。目前已有 934 人学习下载适合需要在内网、离线或隔离环境中搭建 Docker 环境的技术人员参考使用。1. 内网服务器装 Docker 24.0.5为什么离线包比在线脚本更靠谱很多做交付的工程师都遇到过这种场景客户机房完全断外网只有一台跳板机能连内网服务器是 CentOS 7 或者 Ubuntu 20.04要求在上面跑 Docker 24.0.5。你习惯性地敲curl -fsSL https://get.docker.com | sh结果卡在第一步——域名解析都出不去。这时候在线安装脚本、docker 镜像源、docker 安装教程里讲的那套全部失效唯一能走的路就是离线安装。Docker 24.0.5 是 24.x 系列里一个相对稳定的补丁版本containerd、runc、docker-ce-cli 这几个组件的版本耦合比较清晰适合做离线交付的基线。离线安装的本质是把官方仓库里的 rpm/deb 包和它依赖的包提前在能联网的机器上下载齐再整体搬到目标机用本地包管理器装。它解决的不是「怎么装得快」而是「在没有任何外网出口的环境里怎么装得可复现、可回滚」。这篇文章面向的是要在内网、隔离网、生产机房做 Docker 落地的运维和交付工程师从依赖梳理、包下载、传输、安装到验证把每一步的命令和参数都摊开讲顺带把几个我踩过的坑标出来。2. 离线安装前必须搞清的依赖关系与版本对齐2.1 Docker 24.0.5 到底由哪些包组成在线装的时候你感知不到因为脚本帮你把依赖都拉了。离线装就必须自己拆清楚。以 CentOS 7 / RHEL 7 系为例Docker 24.0.5 的完整安装通常涉及这几个包包名作用是否必须docker-ceDocker 引擎主程序dockerd必须docker-ce-clidocker 命令行客户端必须containerd.io容器运行时dockerd 依赖它必须docker-buildx-pluginbuildx 构建插件可选docker-compose-plugincompose v2 插件可选docker-ce-rootless-extrasrootless 模式支持可选关键点是 containerd.io 的版本必须和 docker-ce 24.0.5 匹配。24.0.5 一般搭配 containerd.io 1.6.x如果你随手拿了一个 1.7.x 的 containerd.io装是能装上但启动时可能出现运行时接口不兼容的报错。我一般会去 Docker 官方仓库的目录列表里找到 24.0.5 对应的那一批包按同一时间点的版本一起下。2.2 系统基础依赖不能漏除了 Docker 自己的包操作系统层面还有一批依赖。CentOS 7 上常见的是libcgroup、device-mapper-libs、iptables、libseccomp。这些包在最小化安装的系统里往往缺失而离线环境下 yum 又没法自动补。做法是先在目标机上跑一遍依赖检查# 在目标机上检查关键依赖是否已安装 rpm -q libcgroup device-mapper-libs iptables libseccomp # 如果有 not installed 的记下来一并加入离线包清单逻辑说明rpm -q只查询不安装用来摸清目标机现状。参数就是包名多个包可以一次查。输出里出现package xxx is not installed的就是你要额外补的。这一步别省我见过太多人包都传上去了装到一半报依赖缺失又得重新回联网机下载。2.3 版本对齐别让 cli 和 engine 打架docker-ce 和 docker-ce-cli 的版本号必须一致都是 24.0.5。有人图省事cli 用了系统里残留的旧版本结果docker version里 Client 和 Server 对不上某些子命令直接报错。离线安装时建议把这两个包锁定在同一版本安装命令里显式带上完整版本号而不是让包管理器自己挑。提示在联网机上准备包时用yumdownloader或apt-get download时就把版本号写死避免下到最新版。3. 在联网机上把 24.0.5 的离线包一次性下齐3.1 用 yumdownloader 抓取 rpm 包CentOS / RHEL 系联网机需要和目标是同一大版本的系统比如都是 CentOS 7否则依赖解析会错位。先装下载工具再指定版本下载# 安装下载工具 yum install -y yum-utils # 添加 Docker 官方仓库仅用于下载不安装 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 下载指定版本的包及其依赖--resolve 会自动带上依赖 yumdownloader --resolve --destdir/tmp/docker-offline \ docker-ce-24.0.5 \ docker-ce-cli-24.0.5 \ containerd.io-1.6.24 \ docker-buildx-plugin \ docker-compose-plugin逻辑说明--resolve是关键参数它会把目标包依赖的其他包一起下载到--destdir指定的目录。版本号我写的是 24.0.5 和 containerd.io 1.6.24实际以仓库里存在的为准可以用yum list available docker-ce --showduplicates先看有哪些版本。下载完/tmp/docker-offline里会是一堆 rpm 文件这就是你的离线包集合。3.2 Ubuntu / Debian 系用 apt-get downloadUbuntu 上的思路一样只是工具换成 apt。注意 apt 默认不解析依赖下载需要配合--download-only或者手动补依赖# 添加 Docker 仓库并更新索引 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - add-apt-repository deb [archamd64] https://download.docker.com/linux/ubuntu focal stable apt-get update # 只下载不安装包会落在 /var/cache/apt/archives apt-get install --download-only -y \ docker-ce5:24.0.5-1~ubuntu.20.04~focal \ docker-ce-cli5:24.0.5-1~ubuntu.20.04~focal \ containerd.io逻辑说明--download-only让 apt 把 deb 包下到缓存目录但不执行安装。版本号里的5:是 epoch~ubuntu.20.04~focal是发行版标记写错会找不到包。下载完把/var/cache/apt/archives里的 deb 拷出来即可。3.3 打包传输与校验把下载目录整体打包顺便生成校验值传到目标机后先验一遍完整性# 打包 tar czf docker-24.0.5-offline.tar.gz -C /tmp docker-offline # 生成校验值 sha256sum docker-24.0.5-offline.tar.gz docker-24.0.5-offline.sha256 # 目标机上校验传输后执行 sha256sum -c docker-24.0.5-offline.sha256逻辑说明tar czf打包压缩-C切换目录避免把绝对路径打进去。sha256sum -c会读取校验文件并比对输出 OK 说明传输没损坏。内网传输走 U 盘或 scp 都可能出问题这一步是后悔药别嫌麻烦。4. 目标机上的离线安装与启动验证4.1 CentOS 7 本地 rpm 安装把包传到目标机解压后用 yum 从本地目录安装这样依赖关系还能被 yum 处理# 解压 tar xzf docker-24.0.5-offline.tar.gz -C /opt # 从本地目录安装--nogpgcheck 跳过在线签名校验 yum localinstall -y --nogpgcheck /opt/docker-offline/*.rpm逻辑说明yum localinstall会读取本地 rpm 并尝试用本地已有的包满足依赖比直接rpm -ivh更省心。--nogpgcheck是因为离线环境没法联网校验 GPG 签名跳过它避免安装中断。装完用rpm -qa | grep docker确认包都在。4.2 Ubuntu 本地 deb 安装Ubuntu 上用 dpkg 装缺依赖时用 apt 从本地补# 安装全部 deb 包 dpkg -i /opt/docker-offline/*.deb # 如果有依赖报错用本地源修复 apt-get install -f -y逻辑说明dpkg -i直接安装遇到依赖缺失会报错但不回滚。apt-get install -f会尝试修复依赖如果本地缓存里有对应 deb 就能补上。前提是这些依赖包也在你的离线集合里。4.3 启动 dockerd 并验证安装完不代表能用必须启动服务并做一次真实拉镜像之外的验证# 启动并设置开机自启 systemctl enable --now docker # 查看服务状态 systemctl status docker --no-pager # 验证版本 docker version # 跑一个本地已有镜像或 hello-world需提前导入镜像 docker info逻辑说明systemctl enable --now一步完成开机自启和立即启动。docker version要看到 Client 和 Server 都是 24.0.5。docker info能输出存储驱动、cgroup 驱动等信息如果这里报Cannot connect to the Docker daemon说明 dockerd 没起来去看journalctl -u docker的日志。注意离线环境没有镜像仓库docker run hello-world会失败这是正常的。验证引擎是否正常看docker info能否返回即可别被拉镜像失败误导。5. 离线安装最容易翻车的几个地方5.1 现象装完启动报failed to start daemon: Devices cgroup isnt mounted原因CentOS 7 默认可能没挂载 cgroup 的 devices 子系统或者内核启动参数里禁用了 cgroup。Docker 24.0.5 对 cgroup v1 的依赖还在但系统层面没准备好。解决检查/proc/cgroups里 devices 是否为 1确认/sys/fs/cgroup/devices存在。如果缺失需要在/etc/fstab或启动参数里补上 cgroup 挂载重启后再启动 docker。5.2 现象docker info报bridge网络创建失败提示 iptables 相关错误原因目标机没装 iptables 或者 firewalld 与 docker 的规则冲突也可能是内核模块br_netfilter没加载。解决先modprobe br_netfilter再确认net.bridge.bridge-nf-call-iptables为 1。离线环境里这些内核模块通常系统自带只是没加载。写进/etc/modules-load.d/让它开机自动加载。5.3 现象containerd.io 版本不匹配dockerd 启动后立刻退出原因前面说的版本对齐问题。containerd.io 1.7.x 和 docker-ce 24.0.5 在某些接口上有差异日志里会出现failed to load containerd之类的字样。解决卸载现有 containerd.io换成 1.6.x 对应版本重装。离线包里最好只保留匹配的那一个版本避免装错。5.4 现象yum localinstall报依赖缺失但联网机上明明下过原因联网机和目标机的系统小版本不一致比如一个是 CentOS 7.6一个是 7.9某些基础库版本不同导致依赖解析失败。解决尽量让下载机和目标机系统版本一致。实在不一致就在目标机上用rpm -q把缺失的依赖列出来回联网机单独补下这几个包。5.5 现象安装后docker命令找不到原因docker-ce-cli 没装上或者 PATH 里没有/usr/bin。离线安装时如果只装了 docker-ce 主包cli 是缺失的。解决确认 docker-ce-cli 在安装清单里装完which docker看路径。如果路径不对检查是否装到了非标准位置。6. 把离线安装做成可复用脚本与镜像预导入技巧单次装完不算完交付场景里你往往要在几十台机器上重复这件事。我的习惯是把整个流程固化成一个自包含的脚本加一个包目录脚本里做三件事校验包完整性、按系统类型选安装分支、装完自动做一次docker info健康检查。这样新人拿到目录直接跑不用理解每一步。一个简化版的骨架长这样#!/bin/bash set -e PKG_DIR/opt/docker-offline OS_ID$(grep -oP (?^ID). /etc/os-release | tr -d ) # 校验 sha256sum -c ${PKG_DIR}/../docker-24.0.5-offline.sha256 # 分支安装 if [ $OS_ID centos ] || [ $OS_ID rhel ]; then yum localinstall -y --nogpgcheck ${PKG_DIR}/*.rpm elif [ $OS_ID ubuntu ] || [ $OS_ID debian ]; then dpkg -i ${PKG_DIR}/*.deb || apt-get install -f -y fi # 启动与健康检查 systemctl enable --now docker sleep 3 docker info /dev/null echo docker 24.0.5 就绪 || { echo 启动失败查 journalctl -u docker; exit 1; }逻辑说明set -e让脚本遇错即停避免半装状态。grep -oP从/etc/os-release提取系统 ID 做分支判断。最后的docker info重定向到/dev/null只取退出码成功才打印就绪。这个骨架你可以按自己环境加日志、加回滚。另一个实用技巧是镜像预导入。离线环境拉不了镜像但你可以在一台能联网的机器上docker pull好需要的镜像用docker save导出成 tar随离线包一起带过去目标机docker load导入。这样装完引擎立刻就有可用镜像不用再折腾镜像源。docker save -o nginx.tar nginx:latest导出docker load -i nginx.tar导入命令简单但省掉的是内网里最耗时的环节。我自己的教训是第一次做离线交付时只下了 docker-ce 主包忘了 cli到了现场发现docker命令都没有只能灰溜溜回去重下。从那以后我的离线目录里永远多放一份 cli 和 containerd.io 的匹配版本宁可多占几十兆也不要在客户机房干等。希望帮到你。本文还有配套的精品资源点击获取
返回列表