首页 / 资讯中心 / 文章详情

Linux离线安装Docker实战:依赖包、版本对齐与镜像搬运全解析

Linux离线安装Docker实战:依赖包、版本对齐与镜像搬运全解析 ★ FEATURED ARTICLE
1. 为什么“离线装 Docker”是个值得认真对待的活儿干运维和交付这些年我越来越觉得Linux 离线安装 Docker这件事看着简单实际上是个分水岭。在线环境里一句apt install docker-ce或者yum install docker-ce就完事可一旦进了内网、生产隔离区、边缘机房或者客户现场那台连外网口都封死的服务器你手里只有一台笔记本、一个 U 盘和一堆.rpm/.deb包这时候能不能把 Docker 稳稳当当地跑起来直接决定了后面几个小时的交付节奏。我先说清楚这篇东西是给谁看的。如果你平时在联网机器上装 Docker 从没出过问题那这篇可能对你帮助有限但只要你遇到过“目标机器没有外网”“内网源里 Docker 版本太老”“装完 daemon 起不来”“镜像导进去跑不起来”这类情况那这篇就是给你准备的。它讲的是在完全断网或者半断网的 Linux 主机上把 Docker 引擎、依赖、镜像一条龙落地的完整打法涵盖依赖梳理、包的选择、安装顺序、daemon 配置、镜像离线搬运、常见报错排查。基础好的可以直接跳到实操章节抄作业刚入行的建议从头看因为离线安装的坑八成都在“依赖”和“版本对齐”这两件事上。核心关键词我先摆出来离线安装、依赖包、rpm/deb、daemon.json、镜像导入导出、版本对齐、内网源。这几个词基本覆盖了整件事的全部难点。下面我按“思路拆解—细节解析—实操落地—问题排查”的顺序往下讲中间穿插我自己踩过的坑和实测有效的做法。2. 整体思路拆解离线安装到底难在哪2.1 在线安装和离线安装的本质差异很多人把离线安装理解成“把安装包下载下来拷过去装”这个理解只对了一半。在线安装时包管理器yum / dnf / apt会自动帮你解决依赖树、自动拉取 GPG key、自动处理版本冲突而离线安装这些“自动”全部消失你得自己当那个包管理器。所以离线安装真正的难点不是“装”而是依赖闭环和版本一致性。我打个生活化的比方在线安装像是点外卖你只管下单配菜、打包、配送平台全包了离线安装像是自己买菜做饭食材安装包、调料依赖库、菜谱安装顺序都得自己备齐少一样盐这顿饭就差点意思。Docker 的依赖不算特别多但containerd.io、docker-ce-cli、docker-buildx-plugin、docker-compose-plugin这几个组件之间有明确的版本配套关系装错顺序或者版本对不上daemon 就是起不来。所以我的整体思路是四步走先在联网机器上把完整依赖集下载齐再核对目标机器的系统版本和架构然后按正确顺序离线安装最后配置 daemon 并验证。这四步里第一步和第二步决定了成败后面两步更多是执行。2.2 方案选型整包下载 vs 内网源 vs 二进制包离线安装 Docker 有三条主流路线我先把它们摆出来对比你再根据自己的场景选。方案做法优点缺点适用场景依赖包整包下载联网机用yumdownloader/apt-get download拉全依赖拷到目标机本地安装干净、可控、不依赖内网源依赖收集要仔细漏一个就卡住单机或少量机器交付搭建内网源把 Docker 仓库同步到内网目标机配本地 repo 安装多机批量部署方便后续可升级前期搭建成本高几十台以上的内网集群官方二进制包下载docker-xx.tgz静态二进制解压即用不依赖包管理器跨发行版通用需要手动配 systemd、手动管 containerd特殊发行版、容器化环境我个人的经验是单机或几台机器优先用依赖包整包下载因为最直接、最好排查超过十台的内网环境值得花半天搭个内网源后面省下的时间远超投入遇到非主流发行版或者包管理器被锁死的情况二进制包是兜底方案。这篇主要围绕第一种展开因为它是绝大多数人第一次离线装 Docker 会走的路也是坑最集中的地方。2.3 版本对齐离线安装的第一杀手我必须单独把“版本对齐”拎出来说因为这是离线安装翻车率最高的地方。Docker 官方把组件拆得很细docker-ce引擎主包、docker-ce-cli命令行、containerd.io容器运行时、docker-buildx-plugin、docker-compose-plugin。这几个包必须来自同一个仓库快照、版本相互兼容。你在联网机上用yumdownloader拉包时如果没锁定版本很可能拉到最新版而目标机器的系统库比如 glibc、libseccomp版本较老装上去直接报GLIBC_2.xx not found。我的做法是先确认目标机器的发行版和版本号再回到联网机上用相同的发行版环境去下载对应版本的包。比如目标机是 CentOS 7那联网机最好也是 CentOS 7或者用容器模拟一个 CentOS 7 环境这样拉下来的依赖才是匹配的。跨大版本下载依赖是离线安装最隐蔽的坑装的时候不报错跑起来才崩。3. 核心细节解析依赖、包格式与关键配置3.1 先搞清楚目标机器的“底细”动手之前先在目标机器上敲几条命令把底细摸清楚。这一步花两分钟能省后面两小时。# 看发行版和版本 cat /etc/os-release # 看内核版本Docker 对内核有最低要求一般 3.10 uname -r # 看 CPU 架构x86_64 / aarch64 uname -m # 看是否已装过旧版 Docker 或 podman rpm -qa | grep -i docker rpm -qa | grep -i podman重点看三个信息发行版家族RHEL 系还是 Debian 系、版本号、CPU 架构。RHEL 系CentOS、Rocky、openEuler 等用.rpm包Debian 系Ubuntu、Debian用.deb包两者不能混。架构方面现在 ARM 服务器越来越多aarch64的包和x86_64的包是分开的下错了装不上。注意如果目标机器上已经装了旧版 Docker比如docker而非docker-ce或者装了 podman建议先卸载干净再装否则容易出现命令冲突、socket 抢占。卸载前确认没有正在跑的容器别把业务干掉了。3.2 依赖包到底要下哪些以 RHEL 系为例离线安装 Docker 需要下载的包大致分三类Docker 自身组件、系统基础依赖、存储驱动相关依赖。Docker 自身组件包括docker-ce、docker-ce-cli、containerd.io、docker-buildx-plugin、docker-compose-plugin。这几个是必须的缺一个功能就不完整。系统基础依赖常见的有libseccomp、libcgroup、device-mapper-libs、iptables、libnetfilter_conntrack等具体取决于系统版本和是否已预装。存储驱动方面如果打算用overlay2推荐需要确认内核支持如果用devicemapper则需要device-mapper相关包。这里有个实操技巧不要凭记忆列依赖让工具帮你算。在联网机上执行# RHEL 系下载 docker-ce 及其全部依赖到指定目录 yumdownloader --resolve --destdir/tmp/docker-offline \ docker-ce docker-ce-cli containerd.io \ docker-buildx-plugin docker-compose-plugin--resolve这个参数是关键它会自动把依赖树一起下载下来。Debian 系对应的是# Debian 系先确保 apt 缓存干净再下载 apt-get install --download-only -o Dir::Cache::archives/tmp/docker-offline \ docker-ce docker-ce-cli containerd.io \ docker-buildx-plugin docker-compose-plugin下载完ls /tmp/docker-offline看一眼正常情况下会有十几个到几十个包。如果只有孤零零几个 Docker 包说明依赖没解析出来多半是仓库没配好或者--resolve没生效得回头检查。3.3 包格式与安装顺序的门道RPM 包安装用rpm -ivh或yum localinstallDEB 包用dpkg -i或apt install ./xxx.deb。这里有个细节用yum localinstall或apt install ./xxx.deb比裸rpm -ivh/dpkg -i更稳因为前者会在本地目录里自动解析依赖顺序后者要求你手动按依赖顺序装装错顺序就报“依赖未满足”。安装顺序上我的习惯是先装系统基础依赖再装containerd.io然后docker-ce-cli最后docker-ce和插件。原因是docker-ce依赖containerd.io和docker-ce-cli反过来装会报依赖错误。当然如果你用yum localinstall *.rpm一把梭包管理器会自己排顺序但前提是所有依赖都在同一个目录里。提示yum localinstall在较新的系统上已被yum install ./xxx.rpm取代dnf 环境下直接用dnf install ./*.rpm即可。老系统上yum localinstall依然可用。命令形式不重要重要的是让包管理器参与依赖解析。3.4 daemon.json离线环境更要配好装完包只是第一步Docker daemon 的配置才是决定它好不好用的关键。离线环境下我建议至少配三样东西数据目录、镜像加速内网 registry、日志驱动。{ data-root: /data/docker, registry-mirrors: [http://内网registry地址:5000], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, exec-opts: [native.cgroupdriversystemd] }># 添加 Docker 仓库以 CentOS 7 为例 yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repoDebian 系apt-get update apt-get install -y ca-certificates curl gnupg install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc chmod ar /etc/apt/keyrings/docker.asc echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release echo $VERSION_CODENAME) stable /etc/apt/sources.list.d/docker.list apt-get update仓库配好后先查一下有哪些可用版本别盲目拉最新版# RHEL 系 yum list docker-ce --showduplicates | sort -r # Debian 系 apt-cache madison docker-ce看到版本列表后选一个和目标机器系统库兼容的版本。我的经验是老系统CentOS 7、Ubuntu 18.04尽量选 20.10 或 24.0 这类经过长期验证的版本别追最新因为新版本对 glibc、libseccomp 的要求更高老系统容易踩兼容性坑。4.2 下载完整依赖集并打包版本定了之后开始下载。RHEL 系用yumdownloader --resolveDebian 系用apt-get install --download-only命令前面已经给过。下载完检查一下包的数量和完整性ls -lh /tmp/docker-offline/ # 统计包数量 ls /tmp/docker-offline/ | wc -l正常情况下RHEL 系会有 20 个左右的包Debian 系类似。如果数量明显偏少比如只有 5 个说明依赖没解析全得检查仓库配置或者加上--resolve参数重下。确认无误后把整个目录打包方便传输tar -czvf docker-offline.tar.gz -C /tmp docker-offline/同时把daemon.json也准备好一起打包进去。传输方式看现场条件U 盘、内网 scp、跳板机中转都行注意传输过程中别让文件损坏传完用md5sum或sha256sum校验一下。4.3 目标机上的安装执行包传到目标机后解压进入目录开始装。RHEL 系tar -xzvf docker-offline.tar.gz cd docker-offline # 用 dnf 或 yum 本地安装自动解析依赖顺序 dnf install ./*.rpm # 老系统用 # yum localinstall ./*.rpmDebian 系tar -xzvf docker-offline.tar.gz cd docker-offline dpkg -i ./*.deb # 如果报依赖错误用下面这条修复 # apt-get install -f装完验证一下docker --version containerd --version两个命令都能正常输出版本号说明包装好了。如果docker --version报“command not found”多半是 PATH 问题或者包没装全回头检查安装日志。4.4 启动 daemon 并做冒烟测试包装好不代表 daemon 能起来。先把daemon.json放到/etc/docker/下然后启动服务mkdir -p /etc/docker cp daemon.json /etc/docker/daemon.json systemctl daemon-reload systemctl enable docker systemctl start docker systemctl status dockerstatus显示active (running)才算成功。如果起不来用journalctl -u docker -n 50 --no-pager看日志报错信息通常很明确比如“failed to start daemon: error initializing graphdriver”多半是存储驱动问题“failed to listen on socket”多半是 socket 文件残留。daemon 起来后做个冒烟测试。离线环境没有公网镜像可以用本地导入的方式验证# 在联网机上导出一个小镜像比如 busybox docker pull busybox:latest docker save -o busybox.tar busybox:latest # 传到目标机后导入 docker load -i busybox.tar docker images docker run --rm busybox echo offline docker works看到offline docker works输出整条链路就通了。这一步别省它能一次性验证 daemon、存储驱动、容器运行时、网络配置是否都正常。4.5 镜像的离线搬运策略Docker 装好了接下来最实际的问题是镜像怎么进去。离线环境拉不了公网镜像来源无非两条内网 registry和docker save/docker load手动搬运。内网 registry 适合镜像多、更新频繁的场景搭一个 registry 服务联网机docker push目标机docker pull配合daemon.json里的registry-mirrors用起来很顺。手动搬运适合镜像少、一次性交付的场景docker save导出 tar拷过去docker load导入。手动搬运有个细节要注意docker save导出的是镜像层体积可能很大导出前可以先docker image prune清理无用层或者用docker save时只导必要镜像。另外多架构镜像manifest list用docker save导出再导入可能只保留当前架构跨架构搬运要留意。5. 常见问题与排查技巧实录5.1 依赖报错速查表离线安装的报错八成集中在依赖和版本上。我把踩过的典型问题整理成表遇到直接对号入座。报错信息原因解决思路GLIBC_2.xx not found下载的包版本太新目标机 glibc 太老换低版本 Docker 包或升级系统 glibc不推荐libseccomp.so.2 is needed缺 libseccomp 依赖补下 libseccomp 包一起装conflicts with file from package旧版 Docker 或 podman 残留先卸载旧包清理残留文件Failed to start docker.servicedaemon 配置错误或存储驱动不支持看 journalctl 日志检查 daemon.jsonerror initializing graphdriver存储驱动与内核不匹配换 overlay2 或确认内核模块加载docker: command not found包没装全或 PATH 问题检查安装日志确认 docker-ce-cli 已装5.2 几个我踩过的坑坑一跨版本下载依赖。有次在 Ubuntu 22.04 上下载包装到 Ubuntu 20.04 的目标机上装的时候没报错daemon 起来后跑容器直接崩日志里是 glibc 版本不匹配。后来老老实实用同版本环境重新下载才解决。这个坑的教训是下载环境必须和目标环境对齐差一个小版本都可能出问题。坑二socket 文件残留。卸载旧版 Docker 后没清理/var/run/docker.sock新版装上去 daemon 起不来报“address already in use”。删掉残留 socket 文件再启动就好了。所以卸载旧版时记得把/var/run/docker.sock、/var/lib/docker这些残留清干净。坑三磁盘空间不足。离线环境磁盘规划往往不充分/var/lib/docker默认在系统盘装几个大镜像就满了。daemon 报“no space left on device”的时候容器全挂。提前把>
阅读完成 · 觉得有帮助?
咨询建站