注册表作为拉取缓存

用例

如果您的环境中运行多个 Docker 实例,例如多个物理机或虚拟机都运行 Docker,则每个守护程序都会访问互联网并从 Docker 存储库中获取本地没有的镜像。您可以运行本地注册表镜像并将所有守护程序指向该镜像,以避免这种额外的互联网流量。

注意

Docker 官方镜像是 Docker 的知识产权。

替代方案

或者,如果您使用的镜像集已明确定义,您可以简单地手动拉取它们并将它们推送到简单的本地私有注册表。

此外,如果您的所有镜像都是内部构建的,则完全不使用 Hub 并完全依赖您的本地注册表是最简单的方案。

问题

目前无法镜像其他私有注册表。只能镜像中央 Hub。

注意

Docker Hub 的镜像仍然受 Docker 的公平使用策略约束。

解决方案

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

它是如何工作的?

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

如果 Hub 上的内容发生更改怎么办?

当尝试使用标签进行拉取时,注册表会检查远程端以确保其是否拥有请求内容的最新版本。否则,它会获取并缓存最新内容。

我的磁盘呢?

在环境变化率高的环境中,缓存中可能会积压过时数据。以拉取缓存模式运行时,注册表会定期删除旧内容以节省磁盘空间。对已删除内容的后续请求会导致远程获取和本地重新缓存。

为了确保最佳性能并保证正确性,应将注册表缓存配置为使用filesystem驱动程序进行存储。

运行注册表作为拉取缓存

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

多个注册表缓存可以部署在同一个后端上。单个注册表缓存确保并发请求不会拉取重复数据,但此属性不适用于注册表缓存集群。

注意

使用 Docker Hub 时,所有付费 Docker 订阅每天限额 5000 次拉取。如果需要更高的拉取次数,您可以购买增强型服务帐户附加组件。详情请参见 服务帐户

配置缓存

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

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

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

警告

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

警告

为了让调度程序清理旧条目,必须在注册表配置中启用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

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