Docker私有注册表与镜像

时间:2015-02-17 08:12:23

标签: docker docker-registry

我创建了两个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

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

我不知道如何做到这一点。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:16)

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

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

客户端设置

让我们假设您在名为 dockerstore 的(resolvable)主机上运行镜像和私有注册表。镜像端口5555,注册表5000。

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

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

    当您拉动任何图像时,第一个源将是本地镜像。您可以通过运行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]