简介:这份资源面向需要在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 v2,docker.service里可能需要显式加--exec-opt native.cgroupdriver=systemd,否则 kubelet 对接时会报驱动不一致。
2.2 rpm/deb 包:适合有本地源的环境
如果内网已经有一套 yum 或 apt 的本地仓库,用 rpm/deb 包会更规范,升级和卸载都能走包管理器。需要准备的包不止一个,常见依赖链是:
| 包名 | 作用 | 是否必须 |
|---|---|---|
| containerd.io | 容器运行时 | 必须 |
| docker-ce | Docker 引擎主体 | 必须 |
| docker-ce-cli | 命令行客户端 | 必须 |
| docker-buildx-plugin | 构建扩展 | 按需 |
| docker-compose-plugin | compose 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-compose,Docker 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 如果是 Enforcing,rpm 安装时可能因为container-selinux缺失而失败,离线环境要么提前装好这个包,要么临时设为 Permissive 验证。
3.2 一键安装脚本的写法
把前面的步骤收进一个脚本,方便在多台机器上重复执行:
#!/bin/bash set -euo pipefail PKG_DIR="/opt/docker-offline" DOCKER_TGZ="docker-27.3.1.tgz" COMPOSE_BIN="docker-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的权限用 0644,systemd 单元不需要可执行位。最后两步验证必须保留,装完不验证等于没装。
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_VERSION="27.3.1" COMPOSE_VERSION="v2.29.7" DOCKER_TGZ="docker-${DOCKER_VERSION}.tgz" COMPOSE_BIN="docker-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字段支持更好,独立二进制在某些老版本上会忽略项目名,导致容器名前缀不对。离线环境里如果同时装了两种,建议统一用其中一种,别混着调。
希望帮到你。
本文还有配套的精品资源,点击获取