作为拉取缓存的镜像仓库

Use-case

如果您在环境中运行了多个 Docker 实例,例如多台物理机或虚拟机均运行 Docker, 每个守护进程都会自行连接到互联网,从 Docker 仓库中获取本地不存在的镜像。 您可部署本地 registry 镜像,并将所有守护进程指向该镜像,从而避免产生额外的互联网流量。

注意

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

其他选择

或者,如果您使用的镜像集是明确界定的,您可以手动拉取这些镜像,并将其推送到一个简单、本地的私有镜像仓库。

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

Gotcha

目前无法镜像其他私有镜像仓库。仅支持镜像中央 Hub。

注意

Docker Hub 的镜像站点仍受 Docker 的 公平使用政策 约束。

解决方案

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

它是如何工作的?

您首次从本地镜像仓库代理请求镜像时,它会从公共 Docker 镜像仓库拉取该镜像,并将其存储在本地,然后再返回给您。后续请求中,本地镜像仓库代理即可直接从其自身存储中提供该镜像。

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

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

我的磁盘空间如何?

在高变更率(churn rate)的环境中,缓存中可能会累积过期数据。 当作为拉取缓存(pull through cache)运行时,镜像仓库(Registry)会定期移除旧内容以节省磁盘空间。 后续对已移除内容的请求将触发远程获取并重新进行本地缓存。

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

将 Registry 用作拉取缓存

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

可以在同一后端部署多个镜像仓库缓存。单个镜像仓库缓存可确保并发请求不会重复拉取相同的数据,但该特性在镜像仓库缓存集群中无法保证。

注意

使用 Docker Hub 时,所有付费的 Docker 订阅每日拉取次数上限为 5000 次。若您需要更高的拉取次数,可购买增强型服务账户附加组件。详情请参阅 服务账户

配置缓存

要将 Registry 配置为拉取缓存(pull through cache),需要在配置文件中添加一个 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

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