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 守护程序启动。在你的情况下:
- 添加
--registry-mirror=http://dockerstore:5555
以告诉守护进程更喜欢使用本地镜像而不是 dockerhub。 source
- 添加
--insecure-registry dockerstore:5000
无需进一步配置即可访问私有注册表。参见 this answer
- 重新启动 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]
我创建了两个 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 守护程序启动。在你的情况下:
- 添加
--registry-mirror=http://dockerstore:5555
以告诉守护进程更喜欢使用本地镜像而不是 dockerhub。 source - 添加
--insecure-registry dockerstore:5000
无需进一步配置即可访问私有注册表。参见 this answer - 重新启动 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]