Registry 作为缓存提取

使用案例

如果您的环境中运行了多个 Docker 实例,例如 多个物理机或虚拟机都运行 Docker,每个守护进程都出去 到 Internet 上,并从 Docker 获取本地没有的镜像 存储 库。您可以运行本地注册表镜像并指向所有守护进程 在那里,以避免这种额外的 Internet 流量。

注意

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

选择

或者,如果您使用的镜像集已明确分隔,则可以 只需手动拉取它们并将它们推送到一个简单的本地私有注册表即可。

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

问题

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

注意

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

溶液

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

它是如何工作的?

首次从本地注册表镜像请求镜像时,它会拉取 来自公共 Docker 注册表的镜像,并在处理之前将其存储在本地 它回到你身上。在后续请求中,本地 registry 镜像能够 从其自己的存储中提供镜像。

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

当尝试使用标签进行拉取时,Registry 会将远程数据库检查为 确保它是否具有所请求内容的最新版本。否则,它会 获取并缓存最新内容。

我的磁盘呢?

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

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

将 Registry 作为拉取缓存运行

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

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

注意

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

配置缓存

要将 Registry 配置为作为 pull through cache 运行,需要在配置文件中添加一个部分。proxy

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

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

警告

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

警告

要使调度程序清理旧条目,必须在 注册表配置。delete

配置 Docker 守护程序

手动启动时传递选项, 或者编辑 /etc/docker/daemon.json 并添加键和值,以使更改持久化。--registry-mirrordockerdregistry-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

它告诉你该文件在本地缓存中尚不存在,并且是 被从上游拉出。