明朗北街七万号·数研工坊|扎根雄安新区中关村科技园,专注受限环境下软件搭建与数据平台落地
适用场景#
如果你属于以下任一种情况,这篇对你有用:
- 内网环境想用 Docker 部署组件(监控、数据库、中间件),但没有 Docker Hub
- 需要在多台服务器上快速部署同样的容器环境
- 想自建一个内部的镜像仓库,让内网机器都能拉取镜像
- 被
docker pull卡死、镜像拉不下来困扰
应用范围: 内网容器化部署的基础能力。后续的监控体系(VictoriaMetrics、Grafana)、数据库、大数据组件都可能用 Docker 部署。第 3 篇(镜像源)的 Nginx 暴露思路,在这里升级为完整的镜像仓库。
一、问题#
在内网环境想用 Docker,第一反应是:
docker pull mysql:8.0plaintext然后……卡住了。没有外网,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 --resolveplaintext把 docker-rpms 目录整体打包传到内网,然后:
# 内网机器上安装(注意用 rpm -Uvh 处理依赖顺序)
rpm -Uvh *.rpmplaintext3.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 &plaintextARM 机器把 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.tarplaintext在内网机器上导入:
docker load -i images.tar
# 验证
docker imagesplaintext这是最直接、最常用的方式。缺点:如果镜像版本更新,要重新导出导入。
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:2plaintextStep 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.0plaintextStep 3:内网其他机器配置 insecure registry 后直接 pull
编辑 /etc/docker/daemon.json:
{
"insecure-registries": ["192.168.1.100:5000"]
}plaintextsystemctl restart docker
docker pull 192.168.1.100:5000/mysql:8.0plaintext内网没有 HTTPS 证书,必须加
insecure-registries,否则 docker 拒绝用 HTTP 协议访问。
4.3 方案 C:Harbor(企业级,后续可升级)#
如果镜像数量多、需要权限管理、审计,可以上 Harbor。但 Harbor 本身安装较重,内网小规模场景 Registry 够用。先跑起来,规模大了再升级。
4.4 架构问题:x86 镜像 vs ARM 镜像#
镜像有架构之分。 在内网混部环境(x86 + ARM)经常踩坑:
| 机器架构 | 需要镜像架构 | 验证方式 |
|---|---|---|
| x86_64 | amd64 | docker image inspect xxx --format '{{.Architecture}}' |
| ARM64 | arm64 | 同上 |
镜像必须和 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 versionplaintext5.2 使用示例#
# 创建 docker-compose.yml
cat > docker-compose.yml << 'EOF'
version: '3'
services:
mysql:
image: 192.168.1.100:5000/mysql:8.0
container_name: mysql8
restart: always
environment:
MYSQL_ROOT_PASSWORD: yourpass
ports:
- "3306:3306"
volumes:
- /data/mysql:/var/lib/mysql
EOF
docker-compose up -dplaintext六、常见坑#
坑 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.json 加 insecure-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 的核心思路,一句话:
安装是小事,镜像才是大事。
| 环节 | 关键动作 | 一句话 |
|---|---|---|
| 装 Docker | rpm 包或静态二进制 | 一次装好,多机复用 |
| 搞镜像 | 外网 pull → save → 内网 load | 最直接的方式 |
| 多机共享 | 自建 Registry + insecure-registries | 一台 push,全网 pull |
| 架构 | x86/ARM 镜像必须匹配 | exec format error 就是它 |
| 编排 | docker-compose 二进制 | 部署监控/数据库必备 |
下一篇进入监控体系前,先把 Docker 用起来——后面的 VictoriaMetrics、Grafana 都会用它部署。
本文首发于掘金 · 作者:七万号 扎根雄安新区中关村科技园,专注受限环境下软件搭建与数据平台落地