Docker 带有镜像的私有注册表

Docker private registry with mirror

我创建了两个 Docker 容器。第一个提供私有 Docker 注册表,第二个是官方 Docker 注册表的镜像:

docker run -d --name registry -v /local/path/to/registry:/registry -e SETTINGS_FLAVOR=local -e STORAGE_PATH=/registry -p 5000:5000 registry

docker run -d --name mirror -v /local/path/to/mirror:/registry -e STORAGE_PATH=/registry -e STANDALONE=false -e MIRROR_SOURCE=https:/registry-1.docker.io -e MIRROR_SOURCE_INDEX=https://index.docker.io -p 5555:5000 registry

现在我想把两者结合起来。每当用户 拉取 图像时,它应该首先查询私有注册表,然后查询镜像。当图像被推送时,它们应该只被推送到私有注册表。

我不知道如何做到这一点。感谢任何帮助。

存储库名称旨在 全局 ,即存储库 redis 始终引用来自 Docker 集线器的官方 Redis 映像。如果要使用私有注册表,请在存储库名称前加上注册表名称,例如localhost.localdomain:5000/myimage:mytag.

所以当你pull或者push的时候,它会自动去到相关的registry。镜像应该很容易设置,你只需将 URL 传递给带有 --registry-mirror= 参数的守护进程。

这对企业用户来说并不完美,因此(closed) Docker issue

您不能强制所有 docker push 命令推送到您的私有注册表。原因之一是您可以拥有任意数量的这些寄存器。您必须首先告诉 docker 通过标记图像(见下图)推送到哪里。

以下是如何设置 docker 主机以使用 运行 私有注册表和本地镜像。

客户端设置

假设您是 运行 在名为 dockerstore 的(可解析)主机上的镜像和私有注册表。在端口 5555 上镜像,在 5000 上注册。

然后在 客户端 机器上,你应该将额外的选项传递给 docker 守护程序启动。在你的情况下:

  1. 添加 --registry-mirror=http://dockerstore:5555 以告诉守护进程更喜欢使用本地镜像而不是 dockerhub。 source
  2. 添加 --insecure-registry dockerstore:5000 无需进一步配置即可访问私有注册表。参见 this answer
  3. 重新启动 docker 守护进程

使用镜像

当你拉取任何镜像时,第一个源将是本地镜像。您可以通过 运行 确认一个 docker 拉,例如

docker pull debian

在输出中会有一条消息表明正在从您的镜像中拉取图像 - dockerstore:5000

使用本地注册表

为了首先将 推送到私有注册表,您必须标记图像 以使用注册表的全名推送。确保 first part of the tag 中有一个点或冒号,以告诉 docker 应该将映像推送到私有注册表。

Docker looks for either a “.” (domain separator) or “:” (port separator) to learn that the first part of the repository name is a location and not a user name.

示例:

将 30d39e59ffe2 图像标记为 dockerstore:5000/myapp:stable

docker tag 30d39e59ffe2 dockerstore:5000/myapp:stable

将其推送到私有注册表

docker push dockerstore:5000/myapp:stable

那你也可以拉

docker pull dockerstore:5000/myapp:stable

为了清楚起见,docker documentation 确认:

It’s currently not possible to mirror another private registry. Only the central Hub can be mirrored.

如果不存在,创建文件:

sudo nano /etc/docker/daemon.json

然后粘贴以下内容:

{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}

然后重新启动 Docker 守护程序

$ sudo systemctl restart docker

[Source]