简介这份资源面向需要在Linux环境下部署容器化应用的开发与运维人员提供Docker与Docker Compose的离线安装包解决内网或受限网络下无法直接拉取安装文件的问题。压缩包共4个文件包含tgz安装包、service系统服务文件、sh安装脚本以及docker-compose配置文件整体约84.53MB覆盖从引擎安装到服务注册、再到多容器编排的完整链路。其中安装脚本可简化部署流程service文件便于将Docker注册为系统服务docker-compose配置则用于定义和运行多容器应用。资源已有266人学习下载适合刚接触容器技术、需要快速搭建本地或测试环境的初中级开发者参考也可作为运维人员批量部署时的基础素材帮助减少手动配置环节提升环境搭建效率。1. 离线环境里docker和docker-compose安装包到底该怎么备很多团队第一次在内网或隔离网段部署服务时都会卡在同一个地方机器上没有任何外网出口yum install docker-ce或apt-get install docker-compose-plugin全部超时而项目又要求用容器跑起来。这时候真正需要的不是一条安装命令而是一套完整的 docker 和 docker-compose 安装包组合Docker Engine 的静态二进制或离线 rpm/deb 包、containerd、runc、docker-compose 的可执行文件以及 systemd 服务单元。这套东西准备对了十分钟能装完准备错了会在依赖、版本、架构上反复翻车。这篇笔记面向需要在离线或半离线环境落地容器的运维和开发把选包、装包、验证、排错整条链路讲清楚让你照着就能复现。2. 先分清三种安装包形态静态二进制、rpm/deb、compose 单文件2.1 静态二进制包跨发行版最省心的选择Docker 官方提供了一组静态编译的二进制压缩包命名形如docker-version.tgz解压后得到docker、dockerd、containerd、containerd-shim-runc-v2、ctr、runc、docker-proxy等可执行文件。它的最大好处是不依赖发行版的包管理系统CentOS、Ubuntu、Debian、openEuler 都能用同一套包只要内核版本够一般要求 3.10 以上推荐 4.x 以上并且 cgroup、overlay2 这些内核特性可用。我一般会这样组织离线目录# 离线包目录结构示例 docker-offline/ ├── docker-27.3.1.tgz # Docker Engine 静态二进制包 ├── docker-compose-linux-x86_64 # compose 单文件可执行程序 ├── containerd.service # 可选独立 containerd 的 systemd 单元 ├── docker.service # dockerd 的 systemd 单元 └── install.sh # 一键安装脚本解压和安装的核心动作只有几步# 1. 解压静态包 tar -xzvf docker-27.3.1.tgz # 2. 把二进制文件复制到系统路径 sudo cp docker/* /usr/bin/ # 3. 复制 systemd 服务单元 sudo cp docker.service /etc/systemd/system/ sudo cp containerd.service /etc/systemd/system/ 2/dev/null || true # 4. 重载并启动 sudo systemctl daemon-reload sudo systemctl enable --now docker逻辑说明静态包解压出来的docker/*里既有客户端也有服务端全部丢进/usr/bin/是最省事的做法。docker.service里默认的ExecStart指向/usr/bin/dockerd所以路径必须对得上。参数上--now等价于enable加start省一步操作。如果目标机器用的是 cgroup v2docker.service里可能需要显式加--exec-opt native.cgroupdriversystemd否则 kubelet 对接时会报驱动不一致。2.2 rpm/deb 包适合有本地源的环境如果内网已经有一套 yum 或 apt 的本地仓库用 rpm/deb 包会更规范升级和卸载都能走包管理器。需要准备的包不止一个常见依赖链是包名作用是否必须containerd.io容器运行时必须docker-ceDocker 引擎主体必须docker-ce-cli命令行客户端必须docker-buildx-plugin构建扩展按需docker-compose-plugincompose v2 插件按需离线下载时用yumdownloader --resolve或apt-get install --download-only把依赖一并拉下来否则装到一半会提示缺libcgroup、container-selinux之类。装的时候用rpm -ivh *.rpm或dpkg -i *.deb如果顺序不对导致依赖报错再补yum localinstall或apt-get -f install收尾。2.3 docker-compose 单文件别和 compose plugin 搞混docker-compose 有两个世代v1 是 Python 写的docker-compose单文件v2 是 Go 写的既可以作为docker compose插件也可以单独下载docker-compose-linux-x86_64当独立命令用。离线环境里最稳的是直接放一个 v2 单文件# 放到 PATH 并赋可执行权限 sudo cp docker-compose-linux-x86_64 /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose # 验证 docker-compose version参数说明文件名里的x86_64是架构标识ARM 机器要换成aarch64版本拿错了会直接报cannot execute binary file。如果你希望用docker compose这种子命令形式就把文件放到/usr/libexec/docker/cli-plugins/docker-compose或~/.docker/cli-plugins/docker-composeDocker CLI 会自动识别。两种方式不冲突但别只放一半否则会出现docker-compose: command not found而docker compose又能用的迷惑现象。3. 用脚本把安装包串起来一份可复现的离线安装流程3.1 安装前的环境自检在动手之前先确认内核和存储驱动这一步能省掉后面一半的排错时间# 查看内核版本 uname -r # 查看 cgroup 版本 stat -fc %T /sys/fs/cgroup/ # 查看是否已加载 overlay 模块 lsmod | grep overlay # 查看 SELinux 状态 getenforce逻辑说明stat -fc %T /sys/fs/cgroup/返回cgroup2fs说明是 cgroup v2返回tmpfs说明是 v1。overlay2 存储驱动依赖overlay内核模块没加载就modprobe overlay。SELinux 如果是 Enforcingrpm 安装时可能因为container-selinux缺失而失败离线环境要么提前装好这个包要么临时设为 Permissive 验证。3.2 一键安装脚本的写法把前面的步骤收进一个脚本方便在多台机器上重复执行#!/bin/bash set -euo pipefail PKG_DIR/opt/docker-offline DOCKER_TGZdocker-27.3.1.tgz COMPOSE_BINdocker-compose-linux-x86_64 # 1. 解压 Docker 静态包 tar -xzf ${PKG_DIR}/${DOCKER_TGZ} -C ${PKG_DIR} # 2. 安装二进制 install -m 0755 ${PKG_DIR}/docker/* /usr/bin/ # 3. 安装 compose install -m 0755 ${PKG_DIR}/${COMPOSE_BIN} /usr/local/bin/docker-compose # 4. 安装 systemd 单元 install -m 0644 ${PKG_DIR}/docker.service /etc/systemd/system/docker.service # 5. 启动 systemctl daemon-reload systemctl enable --now docker # 6. 验证 docker version docker-compose version逻辑说明set -euo pipefail让脚本在任何一步失败时立即退出避免半装状态。install -m 0755比cp更明确地设置权限省掉单独的chmod。docker.service的权限用 0644systemd 单元不需要可执行位。最后两步验证必须保留装完不验证等于没装。3.3 验证安装是否真的可用装完不代表能用跑一个最小容器才算数# 拉取镜像在离线环境会失败改用本地导入 docker load -i /opt/docker-offline/images/busybox.tar # 运行测试容器 docker run --rm busybox echo docker ok # 测试 compose cat /tmp/docker-compose-test.yml EOF services: demo: image: busybox command: echo compose ok EOF docker-compose -f /tmp/docker-compose-test.yml up参数说明离线环境没有 registry镜像必须提前docker save成 tar 再docker load。--rm让容器退出后自动清理避免留下垃圾容器。compose 文件里用services顶层键是 v2 语法v1 用的是version加services写错了会提示格式不兼容。4. 避坑与排查离线装 Docker 最容易翻车的五个点4.1 现象dockerd 启动失败日志报failed to start daemon: error initializing graphdriver原因存储驱动不匹配。目标机器可能用的是 devicemapper 或 btrfs而默认配置期望 overlay2。解决编辑/etc/docker/daemon.json显式指定{storage-driver: overlay2}确认overlay模块已加载后重启。如果文件系统本身不支持 overlay2比如某些老内核的 ext4 未开d_type只能退回vfs但性能会明显下降。4.2 现象docker-compose执行报Permission denied或cannot execute binary file原因前者是没加可执行权限后者是架构拿错了。解决chmod x解决权限uname -m确认架构x86_64 对应x86_64包ARM64 对应aarch64包。别用file docker-compose看到ELF 64-bit就以为对了还要看后面的x86-64还是ARM aarch64。4.3 现象容器内 DNS 解析失败ping域名不通原因离线环境没有外部 DNS容器默认继承宿主机的/etc/resolv.conf如果宿主机配的是不可达的 DNS容器里就解析不了。解决在daemon.json里加{dns: [10.0.0.2]}指向内网 DNS或者启动容器时用--dns指定。compose 里则在 service 下加dns字段。4.4 现象docker load导入镜像后docker images看不到原因导入的 tar 包可能是docker save时只保存了某一层或者 tar 包本身损坏。解决用docker load -i xxx.tar时观察输出正常会打印Loaded image: xxx:tag。如果只打印Loaded image ID说明镜像没有 tag需要手动docker tag。另外确认 tar 包是用docker save而不是docker export生成的后者导出的文件系统不能直接 load。4.5 现象systemd 启动 docker 超时Job for docker.service timed out原因dockerd 启动时卡在某个环节常见的是 iptables 规则初始化慢或 containerd 没起来。解决先systemctl status docker看详细日志再journalctl -u docker -n 100翻最近记录。如果是 containerd 问题确认/var/run/containerd/containerd.sock存在如果是 iptables检查iptables -L是否能正常执行必要时在daemon.json里加{iptables: false}临时绕过但会失去端口映射能力仅用于排查。5. 把安装包做成可复用资产版本锁定与校验5.1 版本锁定别让「最新版」坑了你离线安装包最忌讳的就是每次去下最新版。Docker 的版本迭代快不同版本对内核、cgroup、存储驱动的要求不一样今天能装的包明天可能就报新错。我的习惯是锁定一个经过验证的版本组合比如 Docker Engine 27.x 配 compose v2.29.x把版本号写进脚本变量所有机器统一用同一套包。升级时先在测试机验证再整体替换。# 版本锁定示例 DOCKER_VERSION27.3.1 COMPOSE_VERSIONv2.29.7 DOCKER_TGZdocker-${DOCKER_VERSION}.tgz COMPOSE_BINdocker-compose-linux-x86_64参数说明把版本号抽成变量脚本里所有引用都走变量替换时只改一处。compose 的版本号带v前缀下载文件名里通常也带注意别漏。5.2 校验sha256 是离线包的后悔药离线包在拷贝、传输过程中可能损坏装到一半报gzip: stdin: unexpected end of file就是典型症状。提前算好 sha256 并随包分发# 生成校验文件 sha256sum docker-27.3.1.tgz docker-compose-linux-x86_64 SHA256SUMS # 安装前校验 sha256sum -c SHA256SUMS逻辑说明sha256sum -c会逐行比对全部 OK 才继续。这一步在跨网段拷贝后尤其重要U 盘、scp、内网文件服务器都可能引入损坏。校验失败就重新拷贝别硬装。5.3 一个我踩过的坑compose 文件里的version字段compose v2 已经废弃了顶层version字段但很多老教程还在写version: 3.8。写了不会报错但会打印一条 warning而且在某些严格模式下会被忽略。我现在的习惯是直接不写version从services开始。另外docker-compose和docker compose对同一个文件的解析行为基本一致但插件形式对name字段支持更好独立二进制在某些老版本上会忽略项目名导致容器名前缀不对。离线环境里如果同时装了两种建议统一用其中一种别混着调。希望帮到你。本文还有配套的精品资源点击获取 SEO 优化官网定制响应式建站教育培训建站