作为拉取缓存的镜像仓库
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它正在提示您,该文件尚不存在于本地缓存中,正在从上游拉取。