镜像 Docker Hub 库

用例

如果在您的环境中运行了多个 Docker 实例(例如,多台物理机或虚拟机都运行 Docker),每个守护进程都会连接到互联网并从 Docker 仓库获取本地没有的镜像。您可以运行一个本地 Registry 镜像并将所有守护进程指向那里,以避免额外的互联网流量。

注意

Docker 官方镜像属于 Docker 的知识产权。

替代方案

另一种方法是,如果您使用的镜像集界限明确,您可以简单地手动拉取它们并将其推送到一个简单的本地私有 Registry。

此外,如果您的镜像都是内部构建的,完全不使用 Hub,而完全依赖您的本地 Registry,这是最简单的场景。

注意事项

目前无法镜像另一个私有 Registry。只能镜像中心 Hub。

注意

Docker Hub 镜像仍然受 Docker 合理使用政策 的约束。

解决方案

Registry 可以配置为拉取缓存。在这种模式下,Registry 响应所有正常的 docker pull 请求,但会将所有内容存储在本地。

工作原理

您第一次从本地 Registry 镜像请求镜像时,它会从公共 Docker Registry 拉取镜像并将其存储在本地,然后返回给您。随后的请求,本地 Registry 镜像就能够从其自身存储提供镜像。

如果 Hub 上的内容发生变化怎么办?

使用标签尝试拉取时,Registry 会检查远程仓库,以确保它具有请求内容的最新版本。否则,它会获取并缓存最新内容。

我的磁盘空间怎么办?

在高流失率环境中,缓存中可能会累积陈旧数据。作为拉取缓存运行时,Registry 会定期删除旧内容以节省磁盘空间。随后对已删除内容的请求会触发远程获取并重新缓存到本地。

为了确保最佳性能和保证正确性,Registry 缓存应配置为使用 filesystem 驱动程序进行存储。

运行 Registry 作为拉取缓存

将 Registry 作为拉取缓存运行的最简单方法是运行官方 Registry 镜像。至少,您需要在 /etc/docker/registry/config.yml 中指定 proxy.remoteurl,如下一小节所述。

可以在同一个后端上部署多个 Registry 缓存。单个 Registry 缓存确保并发请求不会拉取重复数据,但对于 Registry 缓存集群而言则不适用。

配置缓存

要将 Registry 配置为拉取缓存运行,需要在配置文件中添加一个 proxy 部分。

要访问 Docker Hub 上的私有镜像,可以提供用户名和密码。

proxy:
  remoteurl: https://registry-1.docker.io
  username: [username]
  password: [password]

警告

如果您指定用户名和密码,非常重要的一点是,此用户在 Docker Hub 上有权访问的私有资源将在您的镜像上可用。如果您希望这些资源保持私有,则必须通过实现身份验证来保护您的镜像!

警告

要使调度程序清除旧条目,必须在 Registry 配置中启用 delete

配置 Docker 守护进程

在手动启动 dockerd 时传递 --registry-mirror 选项,或者编辑 /etc/docker/daemon.json 并添加 registry-mirrors 键值对,使更改持久生效。

{
  "registry-mirrors": ["https://<my-docker-mirror-host>"]
}

保存文件并重新加载 Docker 以使更改生效。

注意

某些看起来像错误的日志消息实际上是信息性消息。

检查 level 字段以确定消息是警告您错误还是提供信息。例如,此日志消息是信息性的

time="2017-06-02T15:47:37Z" level=info msg="error statting local store, serving from upstream: unknown blob" go.version=go1.7.4

它告诉您该文件在本地缓存中尚不存在,正在从上游拉取。

页面选项