如何获得远程访问私人dockerregistry?

我试图设置一个私人dockerregistry使用从以下图像: https : //github.com/docker/docker-registry

只要运行:
docker run -p 5000:5000 registry

我只能从localhost从/向/从这个仓库中推送/推送,但是如果我尝试从另一台计算机(在同一个局域网上使用一个专用地址)访问它,它会失败并显示一条错误消息:

 *2014/11/03 09:49:04 Error: Invalid registry endpoint https ://10.0.0.26:5000/v1/': Get https:// 10.0.0.26:5000/v1/_ping: Forbidden. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry 10.0.0.26:5000` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/10.0.0.26:5000/ca.crt* 

让我疯狂的是我可以成功访问它: curl 10.0.0.26:5000和/或curl 10.0.0.26:5000/v1/search

我也不明白在哪里以及如何通过--insecure-registry标志。

好的 – 经过一天的挖掘,我find了解决办法。

对于低于1.12.1的docker工人:

事实certificate,新的客户端版本拒绝使用没有SSL的私人registry。

要解决这个问题 – 客户端机器上的守护进程应该使用不安全的标志启动:

只需input:

 sudo service docker stop # to stop the service 

接着

 sudo docker -d --insecure-registry 10.0.0.26:5000 

(用你自己的IP地址replace10.0.0.26 )。

我期望docker工人将这个选项添加到拉/推命令行…

编辑 – altenantively – 您可以将标志添加到/ etc / default / DOCKER_OPTS envvariables…然后sudo service docker restart

再次编辑 – 看起来docker工人就在这上面 – 而且一个修补程序即将到来: https : //github.com/docker/docker/pull/8935

对于docker工1.12.1:

请按照下面的答案vikas027(有效的centos)

编辑configuration文件“/ etc / default / docker”

sudo vi / etc / default / docker

在文件末尾添加行

DOCKER_OPTS =“$ DOCKER_OPTS –insecure-registry = 192.168.2.170:5000”

(用你自己的IP地址replace192.168.2.170)

并重新启动docker服务

sudo服务docker重启

这是在CentOS 7.2Docker 1.12.1 (最新的)上为我工作的。 我的私人registryv2运行在192.168.1.88:5000 ,相应地改变它。 这也适用于如果你有多个registry,只要继续添加--insecure-registry IP:Port

 $ sudo vim /usr/lib/systemd/system/docker.service #ExecStart=/usr/bin/dockerd ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.88:5000 $ $ sudo systemctl stop docker $ sudo systemctl daemon-reload $ systemctl start docker 

好。 这是我如何工作。 如果您在docker 1.3.2或更高版本中看到此错误,请执行此操作

/etc/sysconfig/docker

 other_args="--insecure-registry 10.0.0.26:5000" 

并运行

sudo service docker restart

我发现以下内容非常有用,因为它讨论了如何configurationDocker服务本身。 https://docs.docker.com/articles/systemd/

随着这篇文章在systemctl命令https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units

我在一个基于Centos 7的容器中使用了以下一系列命令,通过“docker pull registry:2.1.1”

 sudo mkdir -p /etc/systemd/system/docker.service.d cd /etc/systemd/system/docker.service.d sudo touch override.conf sudo nano override.conf 

并在override.conf里添加了以下内容。

 [Service] ExecStart= ExecStart=/usr/bin/docker -d -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry 10.2.3.4:5000 

注意第一个空白的ExecStart =清除已经存在的任何东西,所以一定要添加你希望保留的/usr/lib/systemd/system/docker.service ExecStart =语句中的任何内容。

如果你没有指定-d(守护进程)选项,你会得到一个“请只指定一个-H”的错误。

在发布以下一系列命令之后,我可以看到我的覆盖。

 sudo systemctl stop docker sudo systemctl daemon-reload sudo systemctl start docker sudo systemctl status docker docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled) Drop-In: /etc/systemd/system/docker.service.d └─override.conf Active: active (running) since Thu 2015-09-17 13:37:34 AEST; 7s ago Docs: https://docs.docker.com Main PID: 5697 (docker) CGroup: /system.slice/docker.service └─5697 /usr/bin/docker -d -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry 10.2.3.4:5000 

注意:由状态消息中的Loaded:和Drop-In:行提供的信息对于检查预先存在的docker守护进程的工作情况非常有用。

注意:也可以在Loaded:docker.service文件中查找EnvironmentFile =以获取更多线索。

使用以下命令将{YOUR_REGISTRY}replace为您的registry

 boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry {YOUR_REGISTRY}\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart" 

编辑docker.service文件,在-d标志后添加–insecure-registry xxxx,重新启动docker

这是我唯一的工作,DOCKER_OPTS没有任何效果

Docker 1.12.1

对于CentOS 7.2

 /usr/lib/systemd/system/docker.service #ExecStart=/usr/bin/dockerd ExecStart=/usr/bin/dockerd --insecure-registry my-docker-registry.com:5000 

对于Ubuntu 16.04

 /lib/systemd/system/docker.service #ExecStart=/usr/bin/dockerd -H fd:// ExecStart=/usr/bin/dockerd --insecure-registry my-docker-registry.com:5000 -H fd:// sudo systemctl stop docker sudo systemctl daemon-reload sudo systemctl start docker 

看起来,–insecure-registry选项既可以使用,也可以不使用它和registryID之间的“=”。

我发现,docker客户端版本和registrydocker版本必须匹配,否则,即使拥有一切,您也会遇到连接问题。

这是基于CentOS 7和Docker 1.12上vikas027的答案

由于我在代理的背后,我的完整解决scheme是…

/etc/systemd/system/docker.service.d/http-proxy.conf

 [Service] Environment="FTP_PROXY={{MY_PROXY}}" Environment="ftp_proxy={{MY_PROXY}}" Environment="HTTPS_PROXY={{MY_PROXY}}" Environment="https_proxy={{MY_PROXY}}" Environment="HTTP_PROXY={{MY_PROXY}}" Environment="http_proxy={{MY_PROXY}}" Environment="NO_PROXY=localhost,127.0.0.1,{{MY_INSECURE_REGISTRY_IP}}" Environment="no_proxy=localhost,127.0.0.1,{{MY_INSECURE_REGISTRY_IP}}" 

/usr/lib/systemd/system/docker.service

 ExecStart=/usr/bin/dockerd --insecure-registry {{MY_INSECURE_REGISTRY_IP}}:5000 

不要忘记重新开始:)

 sudo systemctl daemon-reload; sudo systemctl restart docker; 

在docker中设置本地不安全的registry以及代理:

1)在Ubuntu中添加以下标志–insecure-registry IP:port在DOCKER_OPTS下的文件/ etc / default / docker

1.1)configurationno_proxy envvariables绕过本地IP /主机名/域名…因为代理可以抛出一个交互式味精…像继续和这个中间味精混淆docker客户端,最后超时…

1.2)如果configuration了域名,那么如果不使用DNS,不要忘记更新/ etc / hosts文件。

1.3)在/ etc / default / docker中设置了envvariableshttp_proxy和https_proxy …因为它允许从公司集线器外部下载图像。 格式http_proxy = http://用户名:密码@ proxy:port

2)重新启动docker服务…如果作为服务安装,使用sudo服务docker重启

3)重新启动registry容器[sudodocker运行-p 5000:5000registry:2]

4)使用sudo docker标记imageid标记所需的图像IP:port / imagename / tagname ifany

5)推图像… sudodocker推ip:端口/ imagename

6)如果你想拉另一台机器的图像说B没有TLS / SSL,然后在B申请设置1,1.1和2.如果这些更改不是在机器B …拉将失败。

Ubuntu 16.04

创build(不存在)文件/etc/systemd/system/docker.service.d/registry.conf与内容:

 [Service] #You need the below or you 'ExecStart=' or you will get and error 'Service has more than one ExecStart= setting, which is only allowed' ExecStart= ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 10.20.30.40:5000 

然后

 sudo systemctl stop docker sudo systemctl daemon-reload sudo systemctl start docker 

以下已经过testing:

 ubuntu@ubuntu-xenial:~$ docker -v Docker version 17.05.0-ce, build 89658be 

我尝试了所有上述答案,但没有一个为我工作。

我正在按照这些说明 ,以使其工作

 openssl req \ -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \ -x509 -days 365 -out certs/domain.crt 

 Linux: Copy the domain.crt file to /etc/docker/certs.d/myregistrydomain.com:5000/ca.crt on every Docker host. You do not need to restart Docker. 

发生的其他问题如下解决:

问题1

 Error response from daemon: Get https://10.20.30.40:8001/v1/users/: x509: cannot validate certificate for 10.20.30.40 because it doesn't contain any IP SANs 

/ etc / hosts中的主机映射:

 10.20.30.40 somehost 

问题2

 Error response from daemon: Get https://somehost:8001/v1/users/: x509: certificate is valid for , not somehost 

重新运行openssl命令

 $ openssl req \ -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \ -x509 -days 365 -out certs/domain.crt 

每一步都要按Enter键,除了:

 Common Name (eg server FQDN or YOUR name) []: 

并inputregistry的fqdn,即somehost

请务必将名称myregistrydomain.com用作CN。

现在login到registry成功

问题3

来自守护进程的错误响应:获取https:// somehost:8001 / v1 / users / :x509:由未知权威签名的证书

 sudo mkdir -p /etc/docker/certs.d/somehost:8001/ sudo cp certs/domain.crt /etc/docker/certs.d/somehost:8001/ca.crt 

除了上面的答案之外,我还join了“docker for mac”中的工作:

  1. 点击屏幕右上angular的mac托盘上的docker whale图标
  2. 点击首选项 – >守护进程
  3. 将您的IP和端口添加到不安全的registry中。
  4. 重新启动守护进程。

在这里输入图像说明

为了节省您的麻烦,为什么不使用由gitlab提供的免费私人dockerregistry服务 – 非常好用

https://about.gitlab.com/2016/05/23/gitlab-container-registry/

他们的registry是安全的,所以你不会有任何问题