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


124

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

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

您是否能够找到一种使之工作的方法?我在寻找完全相同的东西。我正在使用nexus作为我的docker私有注册表。我不想在docker pull命令中使用域名和端口号。
Dinesh

Answers:


56

更新:根据您的评论,当前无法更改默认注册表,有关更多信息,请参见此问题

您应该能够做到这一点,将主机和端口替换为自己的主机和端口:

docker pull localhost:5000/registry-demo

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

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

然后运行:

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

14
docker pull <YOUR-DOMAIN>:8080/test-image还可以 但是我想要的是docker pull test-image,它无需美化DOMAIN和Port且无需登录。
mainframer

2
我已根据您的评论更新了答案。它目前无法设置一个默认的注册表
盖伊

也无法设置其他默认注册表,因为它破坏了大多数图像所依赖的默认名称空间
Matt

他们可以@scopes在npm中执行类似的操作,以引入新的名称空间,而不会与现有名称空间冲突。将注册表主机名包含在映像名称中会使注册表缓存/代理/锁定公司或项目内部的工作变得困难。这很好地描述了这一点:notifyit.com/articles/article.aspx?p=2464012&seqNum=3
Alexander Klimetschek

该PR似乎是该主题的最新讨论:github.com/moby/moby/pull/34319
Alexander Klimetschek,

21

原来,这实际上是可能的,但没有使用真正的泊坞CE或EE版本。

您可以将Red Hat的docker的fork与'--add-registry'标志一起使用,或者您可以通过将自己的Registry / config.go修改为使用自己的硬编码默认注册表名称空间/索引来从源代码构建docker。


3
RedHat的叉子是centos-extras中可用的叉子。感谢您帮助我了解为什么切换到docker.io版本后无法--add-registry正常工作。
chutz

2
您还可以使用该--block-registry index.docker.io选项来摆脱默认注册表。
埃文(Evan)

1
--add-registry 拉的请求不合并。最终,该功能被拒绝(#11816)。
富兰克林·皮亚特


6

由于它会在社区内创建碎片,因此似乎不受支持(例如,两个用户将获得不同的图片提取ubuntu:latest)。您只需要在映像名称前面添加主机即可。请参阅此github问题以加入讨论。

(请注意,这并不是要发表评论,只是讨论的简短摘要,可以在提到的github问题中进行。)


10
碎片是的,但是随着Linux的早期发展,Linux最终只变成了三种(源基础[arch,gentoo,slax,...],基于debian的[debian / ubuntu]和基于redhat的[企业linux,rhel,centos]。从安全的角度来看,最好能够将默认的上游注册表更改为自我管理的东西
Dwight Spencer

2
说“只有三个Linux,redhat,debian和source”就像是说“只有三个搜索提供程序:google,bing和所有其他搜索提供程序”……
克里斯·布朗

4

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

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

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


此配置特定于RedHat。该--add-registry 拉的请求不合并
富兰克林·皮亚特

2

在问题#11815中解释了Docker的官方立场:

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

解析度:

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

[维护者]会因此关闭此程序。

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


1

早些时候可以通过在Ubuntu 14:04上运行DOCKER_OPTS/etc/default/docker配置文件中实现,而在Ubuntu 15:04上存在一些问题。不确定是否已解决。

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

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

11
'--insecure-registry'标志允许docker在没有TLS身份验证的情况下从命名注册表中提取信息。未指定默认注册表时,它无济于事。
乔西亚

0

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

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

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

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

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


正是由于这个原因,默认情况下,maven存储库存储版本不允许覆盖并提供分类器。同样,码头工人使用标签。
coz

-5

还没有尝试过,但是也许通过在/etc/hostsfor中添加一行hub.docker.com或类似的内容(docker.io?)来劫持DNS解析过程?


4
这将在连接阶段爆炸。您连接的服务器没有适用于该域的TLS证书。
Michael Mol
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.