利用VPS服务器自建Docker Hub镜像加速服务
利用VPS服务器自建Docker Hub镜像加速服务:稳定高效的终极方案
背景与需求
五一假期期间,笔者尝试部署Milvus向量数据库时,发现即便开启代理仍难以从Docker Hub稳定拉取镜像。近年来,由于网络环境限制,开发者常面临镜像下载失败或速度缓慢的困扰。经过多次尝试更换公共代理未果后,最终决定基于已有VPS服务器自建Docker镜像加速服务。本文将分享完整实现方案,助您突破网络瓶颈。
准备工作
1. 服务器与域名
- 服务器选择:推荐使用海外VPS(阿里云、腾讯云的海外服务器也是可以的),配置最低1核1GB即可满足需求。
- 域名解析:绑定一个子域名(如
mirror.yourdomain.com
)到VPS的公网IP,需在域名服务商处添加A记录。
2. 基础环境配置——安装Docker
# 清理旧版本(如有)
sudo apt-get remove -y docker docker-engine docker.io containerd runc
# 安装依赖工具
sudo apt-get update && sudo apt-get install -y \
ca-certificates curl gnupg lsb-release
# 添加官方GPG密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 设置稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker引擎
sudo apt-get update && sudo apt-get install -y \
docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
# 权限优化(当前用户加入docker组)
sudo usermod -aG docker $USER && newgrp docker
验证命令
docker --version
&&docker compose version
部署私有镜像仓库
1.创建个docker容器的共享网络
docker network create dockerhub_net
2. 使用Docker Registry镜像
为什么选择registry:2?
Docker官方提供的registry:2
镜像是一个开源的容器镜像存储分发工具,专为私有化部署设计。相比早期版本,registry:2
具有以下核心优势:
-
代理缓存能力:支持将远程仓库(如Docker Hub)的镜像自动缓存到本地,实现加速拉取。
-
分层存储优化:采用更高效的Blob存储机制,降低磁盘占用并提升并发性能。
-
安全增强:支持Token认证、TLS加密传输等安全特性(需配合反向代理)。
-
轻量化部署:镜像体积仅25MB左右,资源占用极低。
-
2.1 通过Docker官方提供的
registry:2
镜像搭建私有仓库代理:
docker run -d \ # 后台运行容器(detached)
--network dockerhub_net \ # 连接到 dh_net 网络
--name registry-proxy \ # 容器名称设为 registry-proxy
-p 5000:5000 \ # 把宿主机 5000 端口映射到容器 5000 端口(这里如果VPS没有其他项目,也可以直接映射到80端口,我个人服务器上项目还是比较多的,所以还是用了5000,后续用nginx做转发)
-e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io \ # 设置代理远程仓库地址(Docker Hub)
--restart unless-stopped \ # 随 Docker 启动一起启动容器,除非手动停止
registry:2 # 使用 registry:2 镜像启动
- 2.2 防火墙放行端口(如果有防火墙的话,需要注意服务器上放行,而且vps的控制台也需要放行端口, 如果已经禁止掉防火墙请忽略该操作)
# 若使用UFW(Ubuntu)
ufw allow 5000/tcp
- 2.3 API端点健康检查
本地使用cmd命令:
curl -I http://{vps_ip}:5000/v2/
预期返回:
HTTP/1.1 200 OK
Content-Length: 2
Content-Type: application/json; charset=utf-8
Docker-Distribution-Api-Version: registry/2.0
X-Content-Type-Options: nosniff
Date: Sun, 04 May 2025 18:07:18 GMT
或者直接使用浏览器访问http://{vps_ip}:5000/v2/
,能够正常访问,且页面如下即可。
- 2.4 本地docker配置(我是运行在window的wsl2上的ubuntu操作系统中)
sudo vim /etc/docker/daemon.json
添加如下操作:
{
"insecure-registries": ["VPS_IP:5000"]
}
insecure-registries 的作用是允许 Docker 客户端通过非加密的 HTTP 协议访问指定的镜像仓库。
保存后,需要重启下docker
sudo systemctl restart docker
然后拉取 hello-world进行验证
docker pull VPS_IP:5000/hello-world
如果可以正常拉取,表示目前dockerhub代理镜像已经可以。这个时候,可以往docker的daemon.json文件中配置registry-mirrors
{
"insecure-registries": ["VPS_IP:5000"],
"registry-mirrors": ["http://VPS_IP:5000"]
}
这个时候就可以不用在镜像前添加VPS_IP:5000了,即可直接进行命令
docker pull hello-world
直接运行与域名绑定的取舍
若不绑定域名,可直接通过IP+端口使用Registry服务(如http://VPS_IP:5000
),但是还是建议通过域名代理一层,省的直接暴露vps的ip。
3.通过Cloudflare托管域名并生成SSL证书
-
3.1 域名托管到Cloudflare
- 登录Cloudflare控制台,添加已经购买的域名,这里假设是abc.com。
- 根据提示修改域名DNS服务器为Cloudflare提供的地址(需在域名注册商处完成)。
- 添加DNS记录
- 添加子域名 dockerhub.abc.com
- 类型:A记录
- 名称:dockerhub.abc.com
- IPv4地址:填写VPS的公网IP
- 代理状态:✅ 启用(橙色云图标)
关于Cloudflare托管域名的截图太麻烦了,如果不是很清楚,可自行搜索下。
-
3.2 配置SSL/TLS加密模式
- 进入Cloudflare控制台 → SSL/TLS → 源服务器
- 创建证书
- 私钥类型:RSA (2048位)
- 主机名:dockerhub.abc.com
- 证书有效期:15年
- 创建,生成后,点击复制
- 源证书-单击复制,在本地新增文件origin.crt,并将内容粘贴到文件中
- 私钥-单击复制,在本地新增文件origin.key,并将内容粘贴到文件中
-
3.3 将origin.crt和origin.key文件上传到VPS服务器上,存放路径是/home/nginx/cert
这里需要创建下目录
mkdir -p /home/nginx/cert
chomd 777 -R /home/nginx/
4.配置反向代理(Nginx)
- 4.1 编写nginx.conf:
创建nginx.conf配置文件
sudo vim /home/nginx/nginx.conf
添加内容:
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name dockerhub.huangluxi.top;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name dockerhub.abc.com;
ssl_certificate /etc/ssl/certs/origin.crt;
ssl_certificate_key /etc/ssl/certs/origin.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://registry-proxy:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
- 4.2 docker运行nginx
docker run -d \
--name nginx-proxy \
--network dh_net \
-p 80:80 \
-p 443:443 \
-v /home/nginx/certs:/etc/ssl/certs \
-v /home/nginx/nginx.conf:/etc/nginx/nginx.conf \
nginx
- 4.3 验证nginx是否启动成功
docker logs -f nginx-proxy
没有出现error之类的信息就表示正常。
- 4.4 验证是否可以通过域名访问镜像代理
直接浏览器访问https://dockerhub.abc.com/v2/
,可以正常访问即可。
客户端配置
1. 修改Docker镜像源
在需要加速的机器上编辑/etc/docker/daemon.json
:
{
"insecure-registries": ["dockerhub.abc.com"],
"registry-mirrors": ["https://dockerhub.abc.com"]
}
重启Docker服务:
systemctl restart docker
验证配置是否生效:
docker info | grep "Registry Mirrors"
2. 镜像拉取测试
docker pull nginx
成功拉取后,私有仓库将缓存该镜像,后续请求将直接命中缓存加速。
优势与注意事项
核心优势
- 稳定性:自建服务避免公共镜像源不可用风险。
- 速度提升:通过缓存热门镜像减少跨国网络延迟。
- 私有化扩展:可结合私有镜像仓库存储企业内部镜像。
注意事项
- 海外服务器必要性:国内服务器可能仍受网络限制,推荐部署于海外VPS。
- 流量成本:高频率使用需关注VPS带宽费用。
- 合规性:遵守Docker Hub的服务条款,避免滥用。
总结
通过VPS自建Docker镜像加速服务,既能解决网络限制问题,又能实现高效稳定的镜像管理。本文方案结合了Docker Registry代理、反向代理工具和客户端配置,适用于个人开发者与企业级场景。未来还可扩展为多节点集群,进一步提升服务可靠性。
希望这篇指南能帮助您高效搭建专属的Docker镜像加速服务!如有疑问,欢迎在评论区留言讨论。