有时候你会觉得,离线部署是个"小众需求",但真做过几轮企业内网项目后你会发现,这才是最普遍的场景。
我去年给一个金融客户搭测试环境,机房在内网,别说访问 Docker Hub,连常规软件源都要走审批流程。机器是标准的 x86_64 架构,操作系统 CentOS 7.9,需要在上面部署 MySQL、Redis、Kafka 和 Nginx 这套常见中间件组合,而且没有外网。整个环境搭建从 Docker 引擎到各个中间件镜像,全部要走离线通道。
这篇文章就把我在这类环境下的完整操作思路和踩坑记录梳理一遍,覆盖 Docker 引擎离线安装、镜像离线搬运、中间件容器化部署(MySQL 8.0、Redis 主从、Kafka 集群、Nginx)、以及 docker compose 离线使用这几个核心环节。所有命令和配置都基于 x86 系统架构,适配常见的 CentOS / Ubuntu 等 Linux 发行版。
1. 为什么非要在离线环境里搞Docker:我的内网部署经历
1.1 离线场景不是少数,而是大多数
多数人学 Docker 都在自己笔记本上,联网、拉镜像、docker run 一把梭,觉得离线部署根本没必要。但只要你真正接触过企业内网、政务云、军工项目,就会发现"能联网"才是例外,离线才是常态。
这类环境有几个共性特点:
- 机器处于隔离网段,与外网物理隔离或仅有单向通道
- 软件包必须经过安全扫描和审批才能进入生产网
- 操作系统版本往往老旧,内核版本和 glibc 版本跨度很大
- 没有现成的 yum/apt 软件源,或者软件源同步滞后严重
在这种环境下,使用 Docker 反而更有优势。因为 Docker 镜像本身就是一种"自带运行环境和依赖"的交付物,只要引擎装好了,镜像导进去了,中间件跑起来的概率远大于直接部署二进制包。你不需要去解决 MySQL 依赖的 libaio、numactl,不需要编译 Redis,不需要处理 Kafka 需要的 Java 环境,镜像把这一切都包装好了。
我在那个项目里最大的体会是:离线环境的矛盾不在"Docker 能不能用",而在"怎么把 Docker 引擎和镜像高效地搬进内网"。把这个核心链路打通,后续所有中间件的部署节奏都和在线环境差不多。
1.2 离线安装的真实难点:不是拷贝文件,而是处理依赖链
很多人以为离线安装就是"把安装包复制过去,解压,运行",这是最大的误解。
初次尝试时,我直接在目标机器上拿了一个 docker-ce 的 rpm 包安装,系统立刻报依赖缺失:containerd.io >= 1.6.x、docker-ce-cli、docker-buildx-plugin、docker-compose-plugin。逐个下载之后再装,又报 container-selinux 缺失。这种依赖链问题在纯内网环境里会卡住不少人。
所以离线安装 Docker 的第一个核心原则是:不要试图手动逐个解决依赖,而是用包管理器的缓存机制一次性拉全所有依赖包。
具体做法我放在下一章,这里先强调一个认知:Docker 离线安装的重点不是 Docker 本身,而是"如何获取一套完整且版本匹配的安装包集合"。
1.3 开工前必须完成的物料准备
进入操作之前,先把物料清单准备好。以我常用的方案为例,你需要在联网机器上准备以下几样东西:
| 物料 | 用途 | 说明 |
|---|---|---|
| Docker 引擎安装包 | 安装 docker 服务 | 通过 yum/apt 下载全量依赖包,或使用静态二进制包 |
| 中间件镜像 tar 文件 | 离线导入 Docker 镜像 | docker save 导出,按需准备 MySQL、Redis、Kafka、Nginx 等 |
| docker compose 二进制或插件包 | 多容器编排 | 根据 compose 文件版本准备对应版本 |
| 镜像仓库镜像(可选) | 搭建内网 registry | 镜像多、环境多时强烈推荐 |
还有一件容易被忽略的事:确认目标机器的 CPU 架构。标题里提到 x86 系统架构,对应的镜像和安装包都是 x86_64 或 amd64 版本。如果你在 ARM 机器上执行同样的命令,会得到 exec format error 这类让人困惑的错误。用 uname -m 确认,输出 x86_64 代表这是 x86 架构。
另外,建议在联网机器上先建一个工作目录,比如 ~/docker-offline/,把所有下载内容集中管理,这样拷入内网时不会遗漏。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Docker引擎离线安装:从联网机器到内网机器的全链路
2.1 三步拿到Docker离线安装包
Docker 提供了多种安装方式,离线场景下我推荐两种,按系统类型选择。
第一种:基于包管理器缓存(适合 CentOS/RHEL 系列)
在联网机器上执行:
bash复制# 安装 yum 插件
yum install -y yum-plugin-downloadonly
# 创建目录,下载 Docker 及全部依赖
mkdir -p ~/docker-offline
yum install --downloadonly --downloaddir=~/docker-offline \
docker-ce docker-ce-cli containerd.io docker-compose-plugin
这会把你需要的 rpm 包和它们的所有依赖全部下载到 ~/docker-offline 目录,不会执行安装。注意 docker-compose-plugin 是 Docker Compose v2 插件,建议一并准备,后面编排多中间件时用得上。
第二种:静态二进制包(适合 Ubuntu/Debian 和特殊情况)
如果目标系统用 yum 不好处理,改用静态二进制包。Docker 官方发布页面提供 docker-{version}.tgz 的静态包,解压后直接可用,不依赖具体发行版。
bash复制# 在联网机器上下载
wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.7.tgz
tar -xzf docker-24.0.7.tgz
ls docker/
# 可以看到 containerd、containerd-shim-runc-v2、ctr、docker、dockerd、docker-init、docker-proxy、runc
这个包里的二进制文件可以直接拷入目标机器的 /usr/local/bin/ 目录。它的好处是不依赖系统包管理器,坏处是你需要手动创建 systemd service 文件来管理 dockerd 的启动。
我建议将两种方式都准备好,到了现场根据目标机器的实际情况选一种用,总比临时抓瞎强。
2.2 目标机器上的安装操作与验证
基于 rpm 包的安装流程:
把 ~/docker-offline 目录整个拷贝到目标机器(用 U 盘、内网传输工具都行),然后执行:
bash复制cd /path/to/docker-offline
# 直接安装当前目录下所有 rpm,自动顺序安装
rpm -Uvh *.rpm
# 启动 Docker 服务
systemctl enable --now docker
# 验证版本
docker --version
docker compose version
rpm -Uvh *.rpm 会自动处理当前目录下 rpm 包之间的依赖关系,只要包全,一般一步就能装上。装完用 docker info 看下基本信息,确认 Storage Driver、Cgroup Driver 都正常。
基于静态二进制的安装流程:
bash复制# 拷贝二进制到系统目录
cp docker/* /usr/local/bin/
# 创建 systemd service 文件
cat > /etc/systemd/system/docker.service <<'EOF'
[Unit]
Description=Docker Daemon
After=network-online.target
[Service]
Type=notify
ExecStart=/usr/local/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 重新加载
