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

mai*_*mer 104 docker docker-registry

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

sudo docker pull ruby:2.2.1
Run Code Online (Sandbox Code Playgroud)

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

Pulling repository docker.io/library/ruby
Run Code Online (Sandbox Code Playgroud)

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

sudo docker pull ruby:2.2.1
Run Code Online (Sandbox Code Playgroud)

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

Pulling repository my_private.registry:port/library/ruby
Run Code Online (Sandbox Code Playgroud)

Guy*_*Guy 50

更新:在您的评论之后,目前无法更改默认注册表,请参阅此问题以获取更多信息.

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

docker pull localhost:5000/registry-demo
Run Code Online (Sandbox Code Playgroud)

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

docker login https://<YOUR-DOMAIN>:8080
Run Code Online (Sandbox Code Playgroud)

然后运行:

docker pull <YOUR-DOMAIN>:8080/test-image
Run Code Online (Sandbox Code Playgroud)

  • `docker pull <YOUR-DOMAIN>:8080/test-image`没问题.但我想要的是"docker pull test-image",它没有指定DOMAIN和Port而没有登录. (11认同)
  • 我已根据您的评论更新了我的答案.目前无法设置默认注册表 (2认同)

小智 26

有一个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"]
}
Run Code Online (Sandbox Code Playgroud)

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

  • @SamThomas 使用 DNS 重定向 docker.io 将要求新端点具有 docker.io 的有效 TLS 证书。可能,但证书需要来自客户端配置为信任的内部证书颁发机构。 (3认同)
  • 上述的一个重要警告是您不能使用私有注册表作为镜像。[此处](https://docs.docker.com/registry/recipes/mirror/#gotcha) 文档对此进行了介绍。具体来说:“目前无法镜像另一个私有注册表。只有中央集线器可以被镜像。 (3认同)
  • 是否可以让公司的网络 dns 将请求重定向到镜像,而不是要求客户设置此配置? (2认同)

Jos*_*iah 17

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

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

  • RedHat 的 fork 是 centos-extras 中可用的那个。感谢您帮助我理解为什么切换到 docker.io 版本 `--add-registry` 后停止工作。 (6认同)
  • `--add-registry` [拉取请求](https://github.com/moby/moby/pull/10411) **未合并**。此功能最终被拒绝([#11816](https://github.com/moby/moby/issues/11816))。 (4认同)
  • 您还可以使用 `--block-registry index.docker.io` 选项来摆脱默认注册表。 (2认同)

BMi*_*tch 17

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

是的,有些容器运行时允许您更改默认命名空间,特别是来自 RedHat 的容器运行时。然而,RedHat 现在对这个功能感到遗憾并劝阻客户使用它。Docker 也拒绝支持这一点

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

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

相反,像containerd这样的容器运行时的方向是使所有图像名称完全限定,删除Docker Hub自动扩展(像Docker这样的containerd之上的工具仍然应用默认扩展,所以我怀疑这种情况很快就会消失,如果曾经)。

Docker 确实允许您为 Docker Hub 定义注册表镜像,它将在查询 Hub 之前首先查询,但这假设所有内容仍在同一命名空间内,并且镜像只是上游镜像的副本,而不是镜像的不同命名空间。关于如何进行设置的 TL;DR/etc/docker/daemon.json如下systemctl reload docker

{
  "registry-mirrors": ["https://<my-docker-mirror-host>"]
}
Run Code Online (Sandbox Code Playgroud)

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

  • “大多数人一生都不会遇到系统病毒”,你这个假设的依据是什么?“从技术上讲,什么应该是免费的” 到底什么应该是免费的?Docker 这个软件?它已经免费且开源。托管在 Docker Hub 上?为什么它应该是免费的?如果它应该免费,为什么 AWS ECR 不应该也是免费的?当我们这样做的时候,让每个云提供商都是免费的 (2认同)

小智 8

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

/etc/containers/registries.conf
Run Code Online (Sandbox Code Playgroud)

添加域docker.io


Fra*_*iat 8

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

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

解析度:

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

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

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

编辑:

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


dat*_*arl 6

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

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

  • 碎片是的,但只是在linux的早期,最终只有三个(源基[arch,gentoo,slax,...],基于debian的[debian/ubuntu],以及基于redhat的[enterprise linux,rhel,centos].从安全角度来看,能够将默认上游注册表更改为自我管理的内容会更好. (9认同)
  • 说“只有三个Linux,redhat,debian和source”,就像说“只有三个搜索提供程序:google,bing和所有其他搜索提供程序” ... (2认同)