七万号·数据平台实战手记

Back

明朗北街七万号·数研工坊|扎根雄安新区中关村科技园,专注受限环境下软件搭建与数据平台落地


适用场景#

如果你属于以下任一种情况,这篇对你有用:

  • 内网环境想用 Docker 部署组件(监控、数据库、中间件),但没有 Docker Hub
  • 需要在多台服务器上快速部署同样的容器环境
  • 想自建一个内部的镜像仓库,让内网机器都能拉取镜像
  • docker pull 卡死、镜像拉不下来困扰

应用范围: 内网容器化部署的基础能力。后续的监控体系(VictoriaMetrics、Grafana)、数据库、大数据组件都可能用 Docker 部署。第 3 篇(镜像源)的 Nginx 暴露思路,在这里升级为完整的镜像仓库。


一、问题#

在内网环境想用 Docker,第一反应是:

docker pull mysql:8.0
plaintext

然后……卡住了。没有外网,Docker Hub 根本连不上。

即便你通过某种方式拿到了 docker 安装包,装完之后 docker pull 依然是废的。没有镜像,Docker 就是空壳。

所以内网环境的容器化,核心不是「装 Docker」,而是「搞到镜像」。

二、约束#

  • 无公网,无法 docker pull
  • 多台服务器需要相同的容器镜像
  • 部分机器 ARM 架构(鲲鹏、飞腾),需要对应架构的镜像
  • 镜像文件通常较大(几百 MB 到几个 GB),传输和存储都要规划

三、第一步:离线安装 Docker#

3.1 方案 A:rpm 包安装(推荐)#

在有外网的机器上,用 yumdownloader 把 docker 相关的 rpm 包全部拉下来:

# 在有外网的 CentOS/openEuler 机器上
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 创建下载目录
mkdir -p docker-rpms && cd docker-rpms

# 下载 docker 及依赖(不带 --resolve 会漏依赖,带的话会拉全)
yumdownloader docker-ce docker-ce-cli containerd.io docker-compose-plugin --resolve
plaintext

docker-rpms 目录整体打包传到内网,然后:

# 内网机器上安装(注意用 rpm -Uvh 处理依赖顺序)
rpm -Uvh *.rpm
plaintext

3.2 方案 B:静态二进制(无依赖安装)#

Docker 官方提供静态二进制包,解压即用,不依赖 rpm:

# 外网下载
wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.7.tgz

# 内网解压
tar xzf docker-24.0.7.tgz
cp docker/* /usr/bin/

# 启动
dockerd &
plaintext

ARM 机器把 URL 中的 x86_64 换成 aarch64

3.3 验证#

docker version
docker run hello-world   # 如果能跑,说明 daemon 正常(本地有镜像才行)
plaintext

四、第二步:搞到镜像(核心!)#

装好 Docker 之后的重头戏:怎么把镜像搞到内网。

4.1 方案 A:在有外网的机器上 pull 再导出#

在有外网的机器上:

# pull 需要的镜像
docker pull mysql:8.0
docker pull grafana/grafana:latest
docker pull victoriametrics/victoria-metrics:latest

# 导出为 tar 文件
docker save -o images.tar mysql:8.0 grafana/grafana victoriametrics/victoria-metrics
# 或者导出单个
docker save mysql:8.0 -o mysql-8.0.tar
plaintext

在内网机器上导入:

docker load -i images.tar
# 验证
docker images
plaintext

这是最直接、最常用的方式。缺点:如果镜像版本更新,要重新导出导入。

4.2 方案 B:自建内部 Registry(多机共享)#

如果多台服务器都要用同一批镜像,每台都 load 一遍 tar 包很蠢。自建 Registry:

Step 1:在一台机器上跑 Registry

docker run -d --name registry -p 5000:5000 -v /data/registry:/var/lib/registry registry:2
plaintext

Step 2:有外网机器拉镜像 → tag 成内部仓库地址 → push

docker pull mysql:8.0
docker tag mysql:8.0 192.168.1.100:5000/mysql:8.0
docker push 192.168.1.100:5000/mysql:8.0
plaintext

Step 3:内网其他机器配置 insecure registry 后直接 pull

编辑 /etc/docker/daemon.json

{
  "insecure-registries": ["192.168.1.100:5000"]
}
plaintext
systemctl restart docker
docker pull 192.168.1.100:5000/mysql:8.0
plaintext

内网没有 HTTPS 证书,必须加 insecure-registries,否则 docker 拒绝用 HTTP 协议访问。

4.3 方案 C:Harbor(企业级,后续可升级)#

如果镜像数量多、需要权限管理、审计,可以上 Harbor。但 Harbor 本身安装较重,内网小规模场景 Registry 够用。先跑起来,规模大了再升级。

4.4 架构问题:x86 镜像 vs ARM 镜像#

镜像有架构之分。 在内网混部环境(x86 + ARM)经常踩坑:

机器架构需要镜像架构验证方式
x86_64amd64docker image inspect xxx --format '{{.Architecture}}'
ARM64arm64同上

镜像必须和 CPU 架构匹配。ARM 机器上跑 x86 镜像会直接报 exec format error。 有外网机器上导出镜像时,要在同架构的机器上 pull(或者用 docker pull --platform arm64 指定)。

五、docker-compose 离线部署#

内网环境强烈建议装 docker-compose(现在叫 docker compose plugin),后面部署监控、数据库都会用到。

5.1 安装#

# 外网下载二进制(注意架构)
wget https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-linux-x86_64

# 内网安装
mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version
plaintext

5.2 使用示例#

六、常见坑#

坑 1:docker pull 卡死/超时

内网没配镜像源,直接默认连 Docker Hub。解决:走 4.2 的自建 Registry 方案,或配置代理(如果有)。

坑 2:exec format error

架构不匹配。ARM 机器用了 x86 镜像。用 4.4 的方式确认架构,重新拉取正确架构镜像。

坑 3:Error response from daemon: Get https://...: http: server gave HTTP response to HTTPS client

Registry 用的是 HTTP 没配 HTTPS。解决:/etc/docker/daemon.jsoninsecure-registries

坑 4:Cannot connect to the Docker daemon

daemon 没启动。systemctl status docker 检查,或 dockerd & 手动启动。也可能是 socket 权限问题:把用户加入 docker 组 usermod -aG docker youruser

坑 5:磁盘空间不够

镜像很占空间。Docker 默认数据目录在 /var/lib/docker。如果系统盘小,把数据目录挪到大盘:

# /etc/docker/daemon.json
{
  "data-root": "/data/docker"
}
plaintext

七、总结#

内网 Docker 的核心思路,一句话:

安装是小事,镜像才是大事。

环节关键动作一句话
装 Dockerrpm 包或静态二进制一次装好,多机复用
搞镜像外网 pull → save → 内网 load最直接的方式
多机共享自建 Registry + insecure-registries一台 push,全网 pull
架构x86/ARM 镜像必须匹配exec format error 就是它
编排docker-compose 二进制部署监控/数据库必备

下一篇进入监控体系前,先把 Docker 用起来——后面的 VictoriaMetrics、Grafana 都会用它部署。


本文首发于掘金 · 作者:七万号 扎根雄安新区中关村科技园,专注受限环境下软件搭建与数据平台落地

离线部署 Docker 并导入镜像——资源受限环境的容器化实践
https://realcpf.tech/blog/airgapped-docker-offline
Author 刘佳成
Published at 2026年8月1日