概述
因为某种不可抗拒的因素,Docker 在国内的大部分镜像站已经停止服务。本篇文章给大家介绍一种通过海外服务器的方式来加速镜像的下载。
一、总体架构
国内服务器 ---> 海外服务器(Registry 代理缓存) ---> DockerHub
核心思路:
- 在海外服务器部署 Docker Registry
- 使用 proxy 模式代理 DockerHub
- 国内机器只访问海外 Registry
二、海外服务器部署 DockerHub 代理
1. 安装 Docker
curl -fsSL https://get.docker.com | bash
systemctl enable docker
systemctl start docker
2. 创建 Registry 配置
mkdir -p /opt/registry
cd /opt/registry
vi config.yml
配置内容:
version: 0.1
log:
level: info
storage:
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
proxy:
remoteurl: https://registry-1.docker.io
3. 启动 Registry 代理容器
docker run -d \
--name dockerhub-proxy \
-p 5000:5000 \
-v /opt/registry/config.yml:/etc/docker/registry/config.yml \
-v /opt/registry/data:/var/lib/registry \
registry:2
验证:
curl http://localhost:5000/v2/_catalog
返回 {} 或 JSON 即正常。
三、国内服务器使用海外加速器
编辑 Docker 配置:
vi /etc/docker/daemon.json
内容:
{
"registry-mirrors": [
"http://海外服务器IP:5000"
],
"insecure-registries": [
"海外服务器IP:5000"
]
}
重启:
systemctl daemon-reload
systemctl restart docker
之后直接:
docker pull nginx
实际请求:国内 -> 海外代理 -> DockerHub
也可显式指定:
docker pull 海外服务器IP:5000/library/nginx
四、优化方案
一般来说,购买的海外服务器VPS 系统盘很小,必须严格控制体量。
原则
- 只缓存必要镜像
- 固定版本,避免乱拉 latest
- 定期清理缓存
1. 开启垃圾回收(GC)
手动执行:
docker exec dockerhub-proxy registry garbage-collect /etc/docker/registry/config.yml
设置每周自动清理:
crontab -e
0 3 * * 0 docker exec dockerhub-proxy registry garbage-collect /etc/docker/registry/config.yml >> /var/log/registry-gc.log 2>&1
2. 删除不用的镜像
查看目录:
ls -lh /opt/registry/data
删除无用仓库:
rm -rf /opt/registry/data/docker/registry/v2/repositories/镜像名
再执行 GC。
3. 控制 Docker 日志大小
编辑:
vi /etc/docker/daemon.json
加入:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "3"
}
}
重启:
systemctl restart docker
该方案适合只自用,不适合当公共镜像源。