如何获得远程访问私人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.2和Docker 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”中的工作:
- 点击屏幕右上angular的mac托盘上的docker whale图标 。
- 点击首选项 – >守护进程 。
- 将您的IP和端口添加到不安全的registry中。
- 重新启动守护进程。
  
 
为了节省您的麻烦,为什么不使用由gitlab提供的免费私人dockerregistry服务 – 非常好用
https://about.gitlab.com/2016/05/23/gitlab-container-registry/
他们的registry是安全的,所以你不会有任何问题