注册表作为拉取缓存

用例

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

笔记

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

备择方案

或者,如果您使用的图像集被很好地界定,您可以简单地手动提取它们并将它们推送到简单的本地私有注册表。

此外,如果您的映像都是内部构建的,则根本不使用 Hub 并完全依赖本地注册表是最简单的情况。

陷阱

目前无法镜像另一个私有注册表。只有中央集线器可以被镜像。

笔记

Docker Hub 的镜像仍然遵守 Docker 的 公平使用政策

解决方案

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

它是如何工作的?

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

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

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

我的磁盘呢?

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

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

将注册表作为拉取缓存运行

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

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

笔记

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

配置缓存

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

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

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

警告

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

警告

对于清理旧条目的调度程序,delete必须在注册表配置中启用。

配置 Docker 守护进程

--registry-mirror手动启动时传递选项dockerd,或编辑 /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

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