默认情况下,如果我发出命令:
sudo docker pull ruby:2.2.1
它将从码头拉出。默认为IO官方站点。
Pulling repository docker.io/library/ruby
如何将其更改为私有注册表。这意味着如果我发布
它将从我自己的私有注册表中提取,输出如下:
Pulling repository my_private.registry:port/library/ruby
更新:根据您的评论,目前不可能更改默认注册表,有关更多信息,请参阅这个问题。
你应该能够做到这一点,将主机和端口替换为你自己的:
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上有一些问题。不确定这是否已被修复。
/etc/default/docker
DOCKER_OPTS
下面的行需要进入运行docker守护进程的主机上的文件/etc/default/docker。到专用注册中心的更改点安装在本地网络中。注意:你需要重新启动docker服务。
DOCKER_OPTS="--insecure-registry <priv registry hostname/ip>:<port>"
它似乎不受支持,因为它会在社区内创建碎片(即两个用户将获得不同的图像ubuntu:latest)。您只需将主机添加到映像名称前面即可。请参见github的问题加入讨论。
ubuntu:latest
(注意,这不是一个固执己见的评论,只是一个非常简短的讨论总结,可以在提到的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解析过程可以工作?
/etc/hosts
hub.docker.com
docker.io
我把盖伊给出的原始答案加起来,这个答案今天仍然有效(很快就在2020年)。
覆盖默认的docker注册表,就像你对maven所做的那样,实际上不是一个好的实践。
maven
当使用maven时,你可以通过本地存储库管理系统从Maven中央存储库中提取工件,该存储库管理系统将充当代理。这些工件是简单的、原始的库(jar),您不太可能推送具有相同名称的jar。
另一方面,docker映像是完全可操作的、可运行的环境,它完全可以从docker Hub中提取映像,修改它,并将该映像以相同的名称推送到您的本地注册表管理系统中,因为它正是它的名称所表明的,只是在您的企业上下文中。在这种情况下,两幅图像之间的唯一区别就是它的路径!!
因此需要设置如下规则:图像的前缀表示其来源;默认情况下,如果一个图像没有前缀,它将从Docker Hub中提取。
"add-registry": ["192.168.100.100:5001"], "block-registry": ["docker.io"],
之后,重启docker守护进程。 它不需要docker.io也能工作。 我希望这个人会有所帮助。
Docker的官方立场在# 11815中解释:
文档版本11815:允许指定在pull命令中使用的默认注册表 解决方法: 就像前面指出的(#11815),这将分割名称空间,并且严重损害了社区,使dockerfiles不再可移植。 [维护者]将关闭此原因。
文档版本11815:允许指定在pull命令中使用的默认注册表
解决方法:
就像前面指出的(#11815),这将分割名称空间,并且严重损害了社区,使dockerfiles不再可移植。
[维护者]将关闭此原因。
红帽有一个特定的实现允许它(见回答,但它是由Docker上游项目拒绝)。它依赖于--add-registry参数,该参数在RHEL/CentOS 7上的/etc/containers/registries.conf中设置。
--add-registry
编辑:
有一个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": []
/etc/docker/daemon.json
https://my-docker-repo.my.company.com
{ "registry-mirrors": ["https://my-docker-repo-mirror.my.company.com"] }
然后,重新启动Docker守护进程。现在,如果你执行docker pull postgres:12, Docker应该从镜像中获取映像,而不是直接从Docker Hub中获取。这比用my-docker-repo.my.company.com预先放置所有图像要好得多
docker pull postgres:12
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.json和systemctl reload docker中:
systemctl reload docker
{ "registry-mirrors": ["https://<my-docker-mirror-host>"] }
对于大多数人来说,这不是问题(对我来说,这个问题是docker引擎没有镜像非hub注册中心的选项)。映像名称在配置文件或脚本中定义,因此在该文件中键入一次映像名称非常容易。使用compose文件和Helm模板等工具,可以将注册表转换为变量,允许组织从可配置的注册表名称显式地提取部署所需的映像。
没有看到MacOS的答案,所以想在这里添加: 2方法如下: