Docker: Task: How to Speed up Docker Pull

 7th March 2021 at 8:25pm

如果访问 Docker 官方 registry 慢,有这些办法:

  • 使用国内的 Docker Hub 镜像
  • 使 Docker daemon 走 HTTP 代理

使用国内的 Docker Hub 镜像

由于 Docker Hub 镜像服务非常烧带宽和流量(也就是非常烧钱),各厂商并不愿意免费对公众提供这类服务。很多厂商一开始提供,但是后面服务慢慢劣化或者不再对公众提供,比如 Azure 只允许自己机房的 IP 访问,Docker CN 提供的不再可用,七牛也要下架它的镜像服务。

目前推荐使用的是阿里云的服务。阿里云的镜像服务地址并不是公开的,需要用户注册成为阿里云用户,登陆到它的容器镜像服务的 控制台 去开启,然后会生成一个专属的镜像地址。我的地址放在了 Enpass 中。

不推荐使用的:

  • Azure 的源,参考 这里;已不再对公众开放
  • 中科大提供的源,参考这 两份 帮助;速度和可用性相对不稳定
  • Docker CN 提供的 ;不再提供支持

应用上国内源有几个办法:

  • 修改 Docker daemon 配置文件
  • 修改 Dockerfile / 部署配置中的镜像地址为国内源

修改 Docker daemon 配置文件

对于使用 systemd Linux 发行版,在配置文件 /etc/docker/daemon.json 中加入:

{
  "registry-mirrors": ["https://<id>.mirror.aliyuncs.com"]
}

其他 Linux 发行版及 Windows、macOS 看 USTC 维护的 文档

对于 Minikube,参考这个 issue

minikube ssh
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://<id>.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

还可以使用阿里云修改过的 minikube,会把默认的 registry 设成阿里云的镜像,参考 这个说明

修改 Dockerfile / 部署配置中的镜像地址为国内源

对于 Dockerfile,可以把:FROM python:3 改为 FROM <id>.mirror.aliyuncs.com/library/python:3

在各种部署配置中(比如 Kubernetes 的 deployment)定义的 image,也可以改成国内镜像的 image 地址。比如:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: details-v1
spec:
  template:
    metadata:
      labels:
        app: details
        version: v1
    spec:
      containers:
      - name: python
        image: python:3
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080

可以把其中的 image,从 python:3 改为 <id>.mirror.aliyuncs.com/library/python:3

使 Docker daemon 走 HTTP 代理

Docker daemon 会 respect HTTP_PROXY, HTTPS_PROXYNO_PROXY 环境变量。你需要在 daemon 启动时设置它们。对于 systemd 启动的 Docker daemon,参考 Docker 官方文档,通过 systemd 的 service 文件将环境变量设置好。

对于 minikube,启动时通过 --docker-envhttp_proxy https_proxy 环境变量进去,但是要注意网络访问的连通性,参考 这里

其他流行 registry 的国内镜像

除了 Docker Hub 之外,还有一些流行的 Docker registry 服务:

  • gcr.io:Google 的服务。Istio 框架托管在这上面;k8s 的一些组件也托管在上面
  • quay.io:未调研
  • mcr.microsoft.com:未调研

这些 registry 有些访问慢、有些被墙。日常可能会用到的是 gcr.io,中科大有提供 反代,但不一定稳定。使用方法是修改镜像地址:

原地址修改后
gcr.io/xxx/yyy:zzzgcr.mirrors.ustc.edu.cn/xxx/yyy:zzz
k8s.gcr.io/xxx:yyygcr.mirrors.ustc.edu.cn/google-containers/xxx:yyy