镜像 Docker Hub 库

用例

如果您的环境中运行着多个 Docker 实例,例如多台物理机或虚拟机都运行着 Docker,那么每个守护程序都会连接到互联网,从 Docker 仓库中获取本地没有的镜像。您可以运行一个本地注册表镜像,并将所有守护程序指向它,以避免这种额外的互联网流量。

注意

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

替代方案

另外,如果您使用的镜像集是明确限定的,您可以简单地手动拉取它们,然后将它们推送到一个简单的本地私有注册表。

此外,如果您的镜像都是内部构建的,完全不使用 Hub,而完全依赖于您的本地注册表,这是最简单的场景。

注意事项

目前无法镜像其他私有注册表。只能镜像中央 Hub。

注意

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

解决方案

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

使用注册表访问管理 (RAM) 和注册表镜像

如果 Docker Hub 访问通过您的注册表访问管理 (RAM) 配置受到限制,即使镜像在您的注册表镜像中可用,您也无法拉取源自 Docker Hub 的镜像。

您将遇到以下错误

Error response from daemon: Access to docker.io has been restricted by your administrators.

如果您无法允许访问 Docker Hub,您可以手动从您的注册表镜像拉取,并可选择重新标记镜像。例如

docker pull <your-registry-mirror>[:<port>]/library/busybox
docker tag <your-registry-mirror>[:<port>]/library/busybox:latest busybox:latest

它是如何工作的?

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

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

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

我的磁盘会怎么样?

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

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

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

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

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

配置缓存

要将注册表配置为拉取式缓存,需要在配置文件中添加一个 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

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

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.