如何将默认的docker注册表从docker.io更改为我的私有注册表?

时间:2015-10-10 13:10:19

标签: docker docker-registry

默认情况下,如果我发出命令:

sudo docker pull ruby:2.2.1

默认情况下,它会从docker.io官方网站上撤下。

Pulling repository docker.io/library/ruby

如何将其更改为我的私人注册表。这意味着如果我发出

sudo docker pull ruby:2.2.1

它将从我自己的私人注册表中提取,输出类似于:

Pulling repository my_private.registry:port/library/ruby

11 个答案:

答案 0 :(得分:42)

更新:发表评论后,目前无法更改默认注册表,有关详细信息,请参阅this issue

您应该可以这样做,将主机和端口替换为您自己的:

docker pull localhost:5000/registry-demo

如果服务器是远程/具有身份验证,您可能需要使用以下命令登录服务器:

docker login https://<YOUR-DOMAIN>:8080

然后跑步:

docker pull <YOUR-DOMAIN>:8080/test-image

答案 1 :(得分:16)

事实证明 实际上是可行的,但没有使用正版的Docker CE或EE版本。

您可以使用Red Hat的docker dock和'--add-registry'标志,或者您可以自行构建docker来自registry / config.go,使用您自己的硬编码默认注册表命名空间/索引。

答案 2 :(得分:13)

有一个Docker Hub镜像的用例(例如Artifactory或自定义的镜像),我在这里没有提到。这是需要更改默认注册表的最有效的情况之一。

幸运的是,Docker(至少19.03.3版)允许您设置镜像(在Docker CE中测试)。我不知道这是否适用于Docker Hub上没有推送到该镜像的其他映像,但是我确实知道它将使用镜像。 Docker文档:https://docs.docker.com/registry/recipes/mirror/#configure-the-docker-daemon

基本上,您需要将"registry-mirrors": []添加到/etc/docker/daemon.json配置文件中。因此,如果您在https://my-docker-repo.my.company.com托管了一个镜像,则/etc/docker/daemon.json应该包含:

{
  "registry-mirrors": ["https://my-docker-repo-mirror.my.company.com"]
}

然后,重新启动Docker守护程序。现在,如果您执行docker pull postgres:12,则Docker应该从镜像而不是直接从Docker Hub获取图像。这比在所有图片前加上my-docker-repo.my.company.com

更好

答案 3 :(得分:6)

似乎它不会得到支持,因为它会在社区内产生碎片(即两个用户会得到不同的图像拉ubuntu:latest)。您只需在图像名称前添加主机即可。请参阅此github issue加入讨论。

(注意,这不是一个固定意见的评论,只是在上述github问题中可以遵循的讨论的简短摘要。)

答案 4 :(得分:5)

如果您使用的是fedora发行版,则可以更改文件

/etc/containers/registries.conf

添加域名docker.io

答案 5 :(得分:4)

在问题#11815中解释了Docker的正式职位:

问题11815:允许指定拉命令中使用的默认注册表

分辨率:

就像之前指出的那样(#11815),这会破坏名称空间,并严重伤害社区,使dockerfile不再可移植。

[维护者]会因为这个原因将其关闭。

Red Hat具有允许它的特定实现(请参阅anwser,但它是Docker上游projet的refused)。它依赖于--add-registry参数,该参数是在RHEL / CentOS 7上的/etc/containers/registries.conf中设置的。

编辑:

实际上,Docker支持注册表镜像(也称为“将注册表作为下拉缓存运行”)。 https://docs.docker.com/registry/recipes/mirror/#configure-the-docker-daemon

答案 6 :(得分:3)

之前可以使用DOCKER_OPTS配置文件中的/etc/default/docker来实现这一点,该文件适用于Ubuntu 14:04并且在Ubuntu 15:04上有一些issues。不确定这是否已修复。

以下行需要进入运行docker守护程序的主机上的文件/etc/default/docker。私有注册表的更改点安装在本地网络中。注意:您需要重新启动docker服务,然后进行此更改。

DOCKER_OPTS="--insecure-registry <priv registry hostname/ip>:<port>"

答案 7 :(得分:2)

我试图在/etc/docker/daemon.json中添加以下选项。 (我使用了CentOS7)

"add-registry": ["192.168.100.100:5001"],
"block-registry": ["docker.io"],

之后,重新启动docker daemon。 它可以在没有docker.io的情况下工作。 我希望这个人会有所帮助。

答案 8 :(得分:1)

对此的简短回答是你不应该,或者至少你真的不应该。

是的,有一些容器运行时允许您更改默认命名空间,特别是来自 RedHat 的命名空间。然而,RedHat now regrets this functionality and discourages customers from using it。 Docker 也有 refused to support this

之所以如此有问题,是因为这会导致图像的命名空间不明确。在两台不同机器上运行的相同命令可能会根据它们配置使用的注册表来提取不同的图像。由于 compose 文件、helm 模板和其他运行容器的方式在机器之间共享,这实际上引入了一个安全漏洞。

攻击者可以在 Docker Hub 以外的注册表中占用众所周知的镜像名称,希望用户可以更改其默认配置并意外运行他们的镜像,而不是来自 Hub 的镜像。创建一个像 Jenkins 这样的工具的分支,将映像推送到其他注册表,但使用一些代码将加载到 Jenkins 中的所有凭据发送到攻击者服务器,这将是微不足道的。我们甚至已经看到这对 PyPI、NPM 和 RubyGems 等其他包管理器造成了 security vulnerability reports this year

相反,containerd 等容器运行时的方向是让所有镜像名称完全限定,移除 Docker Hub 自动扩展(像 Docker 这样的 containerd 之上的工具仍然应用默认扩展,所以我怀疑这会在任何时候消失很快,如果有的话)。

Docker 确实允许您 define registry mirrors for Docker Hub 在查询 Hub 之前先查询,但是这假设所有内容仍然在同一个命名空间内,并且镜像只是上游图像的副本,而不是不同的图像命名空间。关于如何设置的 TL;DR 在 /etc/docker/daemon.jsonsystemctl reload docker 中如下:

{
  "registry-mirrors": ["https://<my-docker-mirror-host>"]
}

对于大多数人来说,这不是问题(对我来说这个问题是 docker 引擎 doesn't have an option to mirror non-Hub registries)。图像名称在配置文件或脚本中定义,因此在该文件中输入一次就很容易了。借助诸如撰写文件和 Helm 模板之类的工具,注册表可以变成一个变量,以允许组织从可配置的注册表名称中显式提取映像以进行部署。

答案 9 :(得分:0)

我要加上盖伊(Guy)给出的原始答案,该答案在今天(2020年很快)仍然有效。

像使用maven一样,覆盖默认的Docker注册表实际上不是一个好习惯。

使用maven时,您将通过本地存储库管理系统从Maven Central存储库中提取工件,该工件将充当代理。这些工件是原始的原始库(jar),并且您不太可能会推入具有相同名称的jar。

另一方面,docker映像是完全可操作的,可运行的环境,从Docker Hub提取映像,对其进行修改并将该映像以相同的名称推送到本地注册表管理系统中,总的意义是因为它的名称恰好在您的企业环境中。在这种情况下,两个图像之间的唯一区别就是路径!

因此,需要设置以下规则:图像的前缀指示其来源;默认情况下,如果图像没有前缀,则将其从Docker Hub中拉出。

答案 10 :(得分:-3)

尚未尝试,但可能通过在/etc/hosts中为hub.docker.com或类似内容(docker.io?)添加一行来劫持DNS解析流程?