利用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镜像加速服务!如有疑问,欢迎在评论区留言讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值