注册表作为拉取缓存
用例
如果您的环境中运行多个 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
它告诉您该文件尚不存在于本地缓存中,并且正在从上游拉取。