Docker私有仓库内网加速拉取
问题场景:为什么要搭建私有仓库
团队内有多个服务器都需要同一个 Docker 镜像,每次从外网拉取既慢又占用带宽。
如果在内网部署一个私有仓库,其他机器就能直接从本地仓库拉取,速度大幅提升。
本文适合零基础用户,只需要一台装有 Docker 的 Linux 服务器和一个用于仓库的内网 IP(或域名)即可开始。
前置准备:环境与端口检查
- 一台 Ubuntu / CentOS / Debian 服务器,Docker 已安装并正常运行。
- 确定一个内网 IP(例如
192.168.1.100)或内网域名,保证集群内所有机器都能访问它。 - 确保防火墙 / 安全组放行 5000 端口(仓库默认端口)。
# 以 firewalld 为例
firewall-cmd --add-port=5000/tcp --permanent && firewall-cmd --reload
- 如果使用云服务器,需在控制台安全组中添加入方向规则。
分步搭建:从 registry 容器到客户端配置
1. 拉取并运行 registry 镜像
docker run -d --restart=always --name registry \
-p 5000:5000 \
-v /data/registry:/var/lib/registry \
registry:2
-v挂载本地目录用于持久化存储镜像数据。- 运行后可通过
docker ps确认容器状态。
2. 将一台机器上的镜像推送至私有仓库
假设你已有镜像 nginx:latest,先按内网地址重打标签:
docker tag nginx:latest 192.168.1.100:5000/nginx:latest
然后推送:
docker push 192.168.1.100:5000/nginx:latest
注意:如果推送失败报 http: server gave HTTP response to HTTPS client,说明仓库使用了 HTTP 协议,客户端默认要求 HTTPS。
下一节解决。
3. 修改 Docker 客户端配置,允许 HTTP 连接
在所有需要从该仓库拉取的服务器上,编辑 /etc/docker/daemon.json(无则新建),写入:
{
"insecure-registries": ["192.168.1.100:5000"]
}
重启 Docker 使配置生效:
systemctl restart docker
然后再次推送或拉取即可成功。
4. 测试拉取加速效果
在另一台内网机器上(同样已配置 insecure-registries),执行:
docker pull 192.168.1.100:5000/nginx:latest
观察下载速度,通常远快于从 Docker Hub 拉取。
也可用 docker images 确认镜像已被拉取到本地。
避坑指南:常见问题与解决办法
- 端口被占用:如果 5000 已被其他服务使用,运行容器时改为
-p 5001:5000,后面所有配置里端口号同步修改。 - 存储目录容量不足:默认挂载到
/data/registry,请确保该分区有足够空间,否则镜像推送会失败。 - 集群节点镜像版本不一致:建议规范镜像标签,避免混用
latest造成困惑。 - TLS 证书非必须:内网环境通常不需要 HTTPS,用
insecure-registries即可;若担心安全,可用自签证书并分发到各机器。
效果验证:确认镜像分发正常
- 登录仓库所在服务器,查看存储目录:
du -sh /data/registry/docker/registry/v2/repositories/会列出已存储的镜像仓库。 - 用 API 检查:
curl -X GET http://192.168.1.100:5000/v2/_catalog返回{"repositories":["nginx"]}表示仓库正常工作。 - 拉取后运行容器验证:
docker run -d -p 8080:80 192.168.1.100:5000/nginx:latest浏览器访问能打开 nginx 默认页即成功。
总结
通过以上步骤,你已拥有一个内网 Docker 私有仓库,后续只需将常用镜像推入一次,集群内所有机器即可高速拉取,极大提高部署效率。
如果遇到其他异常,优先回顾 insecure-registries 配置和防火墙规则。