我创建了两个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
现在我想将两者结合起来。每当用户拉图像时,它应首先查询私有注册表,然后查询镜像。当推送图像时,它们只应被推送到私人注册表。
我不知道如何做到这一点。任何帮助表示赞赏。
答案 0 :(得分:16)
您不能只强制所有 docker push 命令推送到您的私人注册表。一个原因是你可以拥有任意数量的寄存器。你必须首先通过标记图像来告诉docker在哪里推送(见下图)。
以下是如何设置docker主机以使用正在运行的私有注册表和本地镜像。
让我们假设您在名为 dockerstore 的(resolvable)主机上运行镜像和私有注册表。镜像端口5555,注册表5000。
然后在客户端计算机上,您应该将额外选项传递给docker守护程序启动。在你的情况下:
--registry-mirror=http://dockerstore:5555
告诉守护程序更喜欢使用本地镜像而不是dockerhub。 source --insecure-registry dockerstore:5000
以访问私有注册表而无需进一步配置。请参阅this answer 当您拉动任何图像时,第一个源将是本地镜像。您可以通过运行docker pull来确认,例如
docker pull debian
在输出中会显示图像从镜像中拉出的消息 - dockerstore:5000
首先要将推送到私人注册表,您必须标记图像以使用注册表的全名推送。确保first part of the tag中有一个点或冒号,告诉docker该图像应该被推送到私有注册表。
Docker查找“。”(域分隔符)或“:”(端口分隔符),以了解存储库名称的第一部分是位置而不是用户名。
示例:
将30d39e59ffe2图片标记为 dockerstore:5000 / myapp:stable
docker tag 30d39e59ffe2 dockerstore:5000/myapp:stable
将其推送到私人注册表
docker push dockerstore:5000/myapp:stable
然后你也可以拉
docker pull dockerstore:5000/myapp:stable
答案 1 :(得分:4)
存储库名称旨在全局,即存储库redis
始终引用Docker Hub中的官方Redis映像。如果要使用私有注册表,请在存储库名称前加上注册表的名称,例如: localhost.localdomain:5000/myimage:mytag
。
因此,当您拉或推时,它会自动转到相关的注册表。镜像应该易于设置,只需将URL传递给带有--registry-mirror=
参数的守护进程。
这对于企业用户来说并不完美,因此(closed) Docker issue。
答案 2 :(得分:1)
为了清楚起见,docker documentation确认:
目前无法镜像另一个私有注册表。只要 中央集线器可以镜像。
答案 3 :(得分:0)
如果不存在,创建文件:
sudo gedit /etc/docker/daemon.json
然后粘贴以下内容:
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
然后重启Docker守护进程和服务
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
[Source]