背景与需求

五一假期期间,笔者尝试部署Milvus向量数据库时,发现难以从Docker Hub稳定拉取镜像。近年来,由于各种环境限制,开发者常面临镜像下载失败或速度缓慢的困扰。经过多次尝试更换公共代理未果后,最终决定基于已有服务器自建Docker镜像加速服务。本文将分享完整实现方案,助力下载Docker Hub提供的镜像。


准备工作

1. 服务器与域名

  • 服务器选择:推荐使用阿里云、腾讯云的选择亚太-其他区域,配置最低1核1GB即可满足需求。
  • 域名解析:绑定一个子域名(如mirror.yourdomain.com)到云服务器的公网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。


优势与注意事项

核心优势

  • 稳定性:自建服务避免公共镜像源不可用风险。
  • 速度提升:通过缓存热门镜像减少网络延迟。
  • 私有化扩展:可结合私有镜像仓库存储企业内部镜像。

注意事项

  • 服务器区域:服务器区域,可以先采用按流量计费,在选定后,先curl,看下是否能够访问docker hub,如果不行,换个区域。
  • 流量成本:高频率使用需关注VPS带宽费用。
  • 合规性:遵守Docker Hub的服务条款,避免滥用。

总结

通过自建Docker镜像加速服务,既能解决限制问题,又能实现高效稳定的镜像管理。本文方案结合了Docker Registry代理、反向代理工具和客户端配置,适用于个人开发者与企业级场景。未来还可扩展为多节点集群,进一步提升服务可靠性。


希望这篇指南能帮助您高效搭建专属的Docker镜像加速服务!如有疑问,欢迎在评论区留言讨论。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐