拉取缓存的 Docker Hub 映像

Container Registry 会在 mirror.gcr.io 上缓存经常访问的公共 Docker Hub 映像。您可以配置 Docker 守护程序以使用缓存的公共映像(如果有),或者从 Docker Hub 拉取映像(如果缓存副本不可用)。

在尝试从 Docker Hub 中拉取映像之前,Cloud Build 和 Google Kubernetes Engine 等 Google Cloud 服务会自动检查是否存在缓存的映像。

mirror.gcr.io 上的缓存映像为:

  • 存储在 Google 管理的代码库中。
  • 不易受 Docker Hub 服务中断影响。
  • 与 Google Cloud 生态系统轻松集成。
  • 与 Docker Hub 保持同步。

配置 Docker 守护程序

要将 Docker 守护程序配置为从 Container Registry 缓存中拉取映像,请执行以下操作:

CLI

  1. 使用以下方法之一配置守护程序:

    • 如需在启动时自动配置 Docker 守护进程,请在 /etc/docker/daemon.json 中设置以下值

      {
        "registry-mirrors": ["https://mirror.gcr.io"]
      }
      
    • 在启动守护程序时,传入 Container Registry 主机名:

      dockerd --registry-mirror=https://mirror.gcr.io
      
    • 将以下行添加到 /etc/default/docker 文件中:

      DOCKER_OPTS="${DOCKER_OPTS} --registry-mirror=https://mirror.gcr.io"
      
  2. 重启 Docker 守护程序。

    • 在 Linux 上,运行以下任一命令:

      sudo service docker restart
      

      sudo service docker stop && sudo service docker start
      
    • 在 macOS 或 Windows 上,运行以下命令:

      docker-machine restart
      

Docker 界面

  1. 打开 Docker 的偏好设置菜单。
  2. 点击守护进程
  3. 点击高级。在 JSON 字段中,添加一个值为 https://mirror.gcr.ioregistry-mirrors 键:

    {
      "registry-mirrors" : [
        "https://mirror.gcr.io"
      ]
    }
    
  4. 点击应用并重启 (Apply & Restart)。

如需验证缓存是否已正确配置,请运行以下命令:

docker system info

输出应包含 Registry Mirrors,并且应类似如下所示:

Containers: 2
 Running: 0
 Paused: 0
 Stopped: 2
Images: 2
Server Version: 17.03.1-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
...
Registry Mirrors:
 https://mirror.gcr.io

拉取缓存的映像

Container Registry 会将经常请求的映像添加到缓存中,以供未来请求使用。它还会定期移除不再被请求的映像。

将 Docker 守护程序配置为使用 Container Registry 缓存后,当您使用 docker pull 命令拉取公共 Docker Hub 映像时,Docker 会执行以下步骤:

  1. Docker 守护程序守护进程会检查 Container Registry 缓存并提取相关映像(如果存在)。如果守护程序配置包含其他 Docker 镜像,守护程序会检查每个镜像,以便获取映像的缓存副本。
  2. 如果仍未找到该映像,Docker 守护进程将从 Docker Hub 上的规范代码库中提取该映像。

拉取缓存的映像不会计入 Docker Hub 速率限制。但是,无法保证特定映像将会长时间保持缓存状态。通过配置 Docker 守护程序,仅在 mirror.gcr.io 上获取缓存的映像。如果映像的缓存副本不存在,则直接从 mirror.gcr.io 拉取的请求将会失败。

后续步骤