如何获得远程访问私人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是安全的,所以你不会有任何问题