如何从docker更改默认docker注册表。IO到我的私人注册表?

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

sudo docker pull ruby:2.2.1

它将从码头拉出。默认为IO官方站点。

Pulling repository docker.io/library/ruby

如何将其更改为私有注册表。这意味着如果我发布

sudo docker pull ruby:2.2.1

它将从我自己的私有注册表中提取,输出如下:

Pulling repository my_private.registry:port/library/ruby
246763 次浏览

更新:根据您的评论,目前不可能更改默认注册表,有关更多信息,请参阅这个问题

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

docker pull localhost:5000/registry-demo

如果服务器是远程的/有认证,你可能需要登录到服务器:

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

然后运行:

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

早些时候,可以使用/etc/default/docker配置文件中的DOCKER_OPTS来实现,该配置文件在Ubuntu 14:04上工作,在Ubuntu 15:04上有一些问题。不确定这是否已被修复。

下面的行需要进入运行docker守护进程的主机上的文件/etc/default/docker。到专用注册中心的更改点安装在本地网络中。注意:你需要重新启动docker服务。

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

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

(注意,这不是一个固执己见的评论,只是一个非常简短的讨论总结,可以在提到的github问题中进行。)

事实证明,这个实际上是可能的,但不是使用真正的Docker CE或EE版本。

你可以使用红帽的docker分支,带'——add-registry'标志,或者你可以自己用registry/config从源代码构建docker。修改为使用自己硬编码的默认注册表名称空间/索引。

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

/etc/containers/registries.conf

添加域docker.io

还没有尝试过,但也许通过在/etc/hosts中为hub.docker.com或类似的东西(docker.io?)添加一行来劫持DNS解析过程可以工作?

我把盖伊给出的原始答案加起来,这个答案今天仍然有效(很快就在2020年)。

覆盖默认的docker注册表,就像你对maven所做的那样,实际上不是一个好的实践。

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

另一方面,docker映像是完全可操作的、可运行的环境,它完全可以从docker Hub中提取映像,修改它,并将该映像以相同的名称推送到您的本地注册表管理系统中,因为它正是它的名称所表明的,只是在您的企业上下文中。在这种情况下,两幅图像之间的唯一区别就是它的路径!!

因此需要设置如下规则:图像的前缀表示其来源;默认情况下,如果一个图像没有前缀,它将从Docker Hub中提取。

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

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

之后,重启docker守护进程。 它不需要docker.io也能工作。 我希望这个人会有所帮助。

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

文档版本11815:允许指定在pull命令中使用的默认注册表

解决方法:

就像前面指出的(#11815),这将分割名称空间,并且严重损害了社区,使dockerfiles不再可移植。

[维护者]将关闭此原因。

红帽有一个特定的实现允许它(见回答,但它是由Docker上游项目拒绝)。它依赖于--add-registry参数,该参数在RHEL/CentOS 7上的/etc/containers/registries.conf中设置。

编辑:

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

有一个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预先放置所有图像要好得多

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

是的,有一些容器运行时允许您更改默认名称空间,特别是来自RedHat的名称空间。然而,红帽公司现在对这一功能表示遗憾,并不鼓励客户使用它。Docker也有拒绝支持

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

攻击者可以利用Docker Hub之外的注册中心中众所周知的映像名称,希望用户可以更改默认配置,并意外地运行他们的映像而不是Hub中的映像。创建一个像Jenkins这样的工具的分支,将映像推到其他注册中心,但是使用一些代码将加载到Jenkins中的所有凭据发送到攻击者服务器,这是很简单的。我们甚至看到这导致了其他包管理器的今年的安全漏洞报告,如PyPI, NPM和RubyGems。

相反,容器运行时(如containd)的方向是使所有映像名称完全限定,删除Docker Hub自动扩展(在containd上的工具,如Docker仍然应用默认扩展,所以我怀疑这将很快消失,如果有的话)。

Docker确实允许你在查询Hub之前先查询为Docker Hub定义注册表镜像,但这假设所有内容仍然在同一个命名空间内,镜像只是上游映像的副本,而不是映像的不同命名空间。关于如何设置它的TL;DR如下所示,分别在/etc/docker/daemon.jsonsystemctl reload docker中:

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

对于大多数人来说,这不是问题(对我来说,这个问题是docker引擎没有镜像非hub注册中心的选项)。映像名称在配置文件或脚本中定义,因此在该文件中键入一次映像名称非常容易。使用compose文件和Helm模板等工具,可以将注册表转换为变量,允许组织从可配置的注册表名称显式地提取部署所需的映像。

没有看到MacOS的答案,所以想在这里添加: 2方法如下:

选项1(通过Docker桌面GUI): 偏好→Docker Engine ->编辑文件->应用并重新启动

< p >选项2: 直接编辑文件~/.docker/daemon.json

.json