Docker镜像加速方案:通过海外服务器代理加速

11 阅读1分钟

概述

因为某种不可抗拒的因素,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

该方案适合只自用,不适合当公共镜像源。