概述

在国内,拉取 Docker 镜像速度慢/时不时断线/无账号导致限流等,比较痛苦😣. 这里提供加速/优化的几种方法。 梳理一下,会碰到以下情况:
  1. 国内下载速度慢/时不时断线:是因为网络被限制了。
  2. 没有公共镜像库账号导致限流:是因为 Docker Hub 等主流镜像库,近年来纷纷开始对未登录的匿名用户进行限流,限制拉取的速度,以及一定时间内拉取的镜像数量。
为了解决以上问题,有这么几种方法: 针对国内下载速度慢/时不时断线, 可选方法如下:
  1. 配置国内可用/速度尚可的 Docker Registry Mirrors
  2. 自建 Docker Registry Mirror/Proxy, 并配置为 Mirror
  3. Docker Daemon 配置 proxies
针对没有公共镜像库账号导致限流, 可选方法如下:
  1. 注册各个镜像库账号并 docker login 登录
具体方案如下。

具体方案

📝Notes: 这里以 Docker 举例说明。Containerd/Podman/cri-o 等请举一反三。
  1. 配置国内可用/速度尚可的 Docker Registry Mirrors 1. 阿里云 Docker 加速:类似 xxxxxx.mirror.aliyuncs.com 的个人专属加速地址; 2. DockerProxy 代理加速:dockerproxy.com 3. 百度云 Mirror: mirror.baidubce.com 4. 4….
  2. 自建 Docker Registry Mirror/Proxy, 并配置为 Mirror 1. 这里使用 Cloudflare Worker - cloudflare-docker-proxy[1] 搭建
  3. Docker Daemon 配置 proxies, 具体包括:http-proxy https-proxy no-proxy
  4. 注册各个镜像库账号并 docker login 登录

方案实施细节

配置国内可用的 Docker Registry Mirrors

随着时间的推移,国内可用的 Docker Registry Mirrors 会持续发生变化,因此,需要实时根据可用情况调整 Docker Registry Mirrors 配置。 截止 2023/9/5, 可用 Mirrors 列表如下:
  1. 阿里云 Docker 加速:类似 xxxxxx.mirror.aliyuncs.com 的个人专属加速地址;
  2. DockerProxy 代理加速:dockerproxy.com
  3. 百度云 Mirror: mirror.baidubce.com
  4. DaoCloud: docker.m.daocloud.io
  5. 南京大学:docker.nju.edu.cn
  6. 上海交大:docker.mirrors.sjtug.sjtu.edu.cn

测试国内 Docker Registry 可用性

可以自行测试验证,手动测试方法是拉取镜像,这里以测试 dockerproxy.com 为例:
  1. docker pull dockerproxy.com/library/nginx
在国内拉取成功则证明可用。 也可以直接查看 GitHub 仓库:docker-practice/docker-registry-cn-mirror-test[2] 的 Github Action 执行结果。如最近一次的执行结果为:

[Docker] 镜像国内加速的几种方法 - 图1

阿里云 Docker 加速服务申请

阿里云加速器(点击管理控制台 -> 登录账号 -> 右侧镜像工具 -> 镜像加速器 -> 复制加速器地址)[3] 截图如下:

[Docker] 镜像国内加速的几种方法 - 图2

其他几个加速域名

1.DockerProxy 代理加速:dockerproxy.com 2.百度云 Mirror: mirror.baidubce.com 3.Daocloud: docker.m.daocloud.io 4.南京大学:docker.nju.edu.cn 5.上海交大:docker.mirrors.sjtug.sjtu.edu.cn 都是固定域名,直接配置即可。

已经不可用的 Docker 加速域名

以下 Docker 加速域名,已经因为各种原因不可用或只允许对应云供应商网络使用,包括: 163: hub-mirror.c.163.com •USTC: docker.mirrors.ustc.edu.cn •腾讯云:mirror.ccs.tencentyun.com •Azure 中国: dockerhub.azk8s.cn •七牛云:reg-mirror.qiniu.com •Docker CN: registry.docker-cn.com

Docker Registry Mirror 配置

创建或修改 /etc/docker/daemon.json:
  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-EOF
  3. {
  4. "registry-mirrors": [
  5. "https://<changme>.mirror.aliyuncs.com",
  6. "https://dockerproxy.com",
  7. "https://mirror.baidubce.com",
  8. "https://docker.m.daocloud.io",
  9. "https://docker.nju.edu.cn",
  10. "https://docker.mirrors.sjtug.sjtu.edu.cn"
  11. ]
  12. }
  13. EOF
  14. sudo systemctl daemon-reload
  15. sudo systemctl restart docker

自建 Docker Registry Mirror/Proxy

前提

有 Cloudflare 账号 •(可选)有自定义的域名,且域名托管在 Cloudflare 上 •Cloudflare Workers 额度足够

cloudflare-docker-proxy

这里使用 Cloudflare Worker - cloudflare-docker-proxy[4] 搭建。原文 README 步骤有一些问题,可以参考这篇 README.md[5] 来实施。 这里以自定义域名配置方式举例, 步骤如下: 1.Fork Repo 2.Deploy 按钮对应 URL 调整为您自己的 repo url 3.修改 src/index.jsconst routes 块的内容

[Docker] 镜像国内加速的几种方法 - 图3

4.点击 “Deploy” 按钮部署,部署后如下:

[Docker] 镜像国内加速的几种方法 - 图4

5.在 Cloudflare 的 DNS 记录里添加 CNAME 指向部署后的 ${workername}.${username}.workers.dev 地址。如下:

[Docker] 镜像国内加速的几种方法 - 图5

6.在 Workers 的 HTTP Routes 里,添加 xxx.your-domain.com/* 路由指向 cloudflare-docker-proxy, xxx 就是 docker quay gcr 等,如下:

[Docker] 镜像国内加速的几种方法 - 图6

完成。

Docker Registry Mirror 配置

将配置后的 docker..com Mirror 添加到 /etc/docker/daemon.jsonregistry-mirrors 中并重启 Docker 生效。

Docker Daemon 配置 proxies

如果不想设置 Mirrors, 还可以配置 proxies, 实现通过 proxies 拉取 Docker Hub 镜像。

前提

有一个 Proxy, 可以稳定访问到 Docker Hub

Docker Daemon 配置

vi /etc/docker/daemon.json, 添加如下内容:
  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-EOF
  3. {
  4. "proxies": {
  5. "http-proxy": "http://<proxy-ip>:7890",
  6. "https-proxy": "http://<proxy-ip>:7890",
  7. "no-proxy": "*.cn,127.0.0.0/8,192.168.0.0/16,172.16.0.0/12,10.0.0.0/8"
  8. }
  9. }
  10. EOF
  11. sudo systemctl daemon-reload
  12. sudo systemctl restart docker
📝Notes: Docker Daemon 里的 no-proxy, 是支持 CIDR 格式的. 完成。

注册各个镜像库账号并登录

包括不限于: Docker Hub •Quay.io •GHCR.io (GitHub 的 Docker registry) •gcr.io (Google Cloud 的 Registry) •… 注册后,视情况不同,有的可以直接通过密码登录,有的需要申请 Token/Service Account 等专用密码。 注册过程略。

docker login 登录

Docker Hub 登录:
  1. echo "<password>" | docker login --username <username> --password-stdin'
其他 Docker Registry 登录:
  1. echo "<password>" | docker login quay.io --username <username> --password-stdin
  2. echo "<password>" | docker login ghcr.io --username <username> --password-stdin
  3. echo "<password>" | docker login gcr.io --username <username> --password-stdin
或者,也可以直接写入 ~/.docker/config.json 文件:
  1. {
  2. "auths": {
  3. "ghcr.io": {
  4. "auth": "<auth>"
  5. },
  6. "https://index.docker.io/v1/": {
  7. "auth": "<auth>"
  8. },
  9. "quay.io": {
  10. "auth": "<auth>"
  11. }
  12. }
  13. }
通过如下方式获得:
  1. echo -n '<username>:<password>' | base64
结束。

总结

通过以上方法,相信您能在国内使用 Docker 得心应手。

References

[1] cloudflare-docker-proxy: https://github.com/ciiiii/cloudflare-docker-proxy
[2] docker-practice/docker-registry-cn-mirror-test: https://github.com/docker-practice/docker-registry-cn-mirror-test/actions
[3] 阿里云加速器(点击管理控制台 -> 登录账号 -> 右侧镜像工具 -> 镜像加速器 -> 复制加速器地址): https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
[4] cloudflare-docker-proxy: https://github.com/ciiiii/cloudflare-docker-proxy
[5] README.md: https://github.com/east4ming/cloudflare-docker-proxy