我正在尝试使用以下图片设置私人泊坞窗注册表: 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
标志。
答案 0 :(得分:71)
好的 - 经过一天的挖掘后,我找到了解决方案。
对于1.12.1以下的码头工人:
事实证明,新的客户端版本拒绝使用没有SSL的私有注册表。
要解决此问题 - 应使用不安全标志启动客户端计算机上的守护程序:
只需输入:
sudo service docker stop # to stop the service
然后
sudo docker -d --insecure-registry 10.0.0.26:5000
(用您自己的IP地址替换10.0.0.26
。)
我希望docker的人能将这个选项添加到pull / push命令行......
编辑 - altenantive - 你可以在/ etc / default / docker中添加DOCKER_OPTS
env变量的标志...
然后sudo service docker restart
再次编辑 - 似乎码头工人们正在使用它 - 很快就会出现修复: https://github.com/docker/docker/pull/8935
对于docker 1.12.1:
请按照以下vikas027的答案(对centos有效)
答案 1 :(得分:27)
这对我来说非常有用 CentOS 7.2 和 Docker 1.12.1 (最新的日期)。我的私有注册表v2正在192.168.1.88:5000
上运行,因此进行了相应更改。如果您有多个注册表,只需继续添加--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
答案 2 :(得分:24)
编辑配置文件" / etc / default / docker"
sudo vi / etc / default / docker
在文件末尾添加行
DOCKER_OPTS =" $ DOCKER_OPTS --insecure-registry = 192.168.2.170:5000"
(用您自己的IP地址替换192.168.2.170)
并重启docker service
sudo service docker restart
答案 3 :(得分:12)
确定。以下是我如何使用它。如果您在docker 1.3.2或更高版本中看到此错误,请执行此操作
转到/etc/sysconfig/docker
other_args="--insecure-registry 10.0.0.26:5000"
并运行
sudo service docker restart
答案 4 :(得分:12)
我发现以下内容非常有用,因为它讨论了如何配置Docker服务本身。 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 =以获取更多线索。
答案 5 :(得分:9)
使用以下命令将{YOUR_REGISTRY}替换为您的注册表
boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry {YOUR_REGISTRY}\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart"
答案 6 :(得分:7)
编辑docker.service文件,在-d标志后添加--insecure-registry x.x.x.x,重启docker
这是唯一对我有用的东西,DOCKER_OPTS没有任何效果
答案 7 :(得分:4)
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选项可以使用和不使用" ="它与注册表ID之间。
答案 8 :(得分:2)
我发现docker客户端版本和注册表docker版本必须匹配,否则你会遇到连接问题,尽管已经准备就绪。
答案 9 :(得分:1)
这是基于Centos 7和Docker 1.12上的vikas027的回答
由于我支持代理,我的完整解决方案是......
/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;
答案 10 :(得分:1)
两步解决方案(不含--insecure-registry
):
/etc/docker/certs.d/$HOSTNAME/
目录
mkdir -p /etc/docker/certs.d/10.0.0.26:5000
echo -n | openssl s_client -connect 10.0.0.26:5000 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/docker/certs.d/10.0.0.26:5000/registry.crt
现在您的码头工具将信任您的自签名证书。
答案 11 :(得分:0)
在docker中设置本地不安全注册表以及代理:
1)在ubuntu中添加以下标志--insecure-registry IP:文件/ etc / default / docker中DOCKER_OPTS下的端口
1.1)配置no_proxy env变量以绕过本地IP /主机名/域名...因为代理可以抛出交互式消息...就像继续 这个中间消息混淆了docker客户端,最后超时......
1.2)如果配置了域名...那么如果不使用DNS,请不要忘记更新/ etc / hosts文件。
1.3)在/ etc / default / docker中设置env变量http_proxy和https_proxy ...因为它可以从公司外部中心下载图像。 格式为http_proxy = http://username:password@proxy:port
2)重新启动docker服务...如果作为服务安装,请使用sudo service docker restart
3)重启注册表容器[sudo docker run -p 5000:5000 registry:2]
4)使用sudo docker tag imageid标记所需的图像IP:port / imagename / tagname ifany
5)推送图像... sudo docker push ip:port / imagename
6)如果你想从另一台机器拉出图像,说B没有TLS / SSL,那么 在B中应用setps 1,1.1和2。 如果机器B没有完成这些改变......拉动将失败。
答案 12 :(得分:0)
为了节省您的麻烦,为什么不使用gitlab提供的免费私人码头注册服务 - 效果很好
https://about.gitlab.com/2016/05/23/gitlab-container-registry/
他们的注册表是安全的,因此您不会有任何问题
答案 13 :(得分:0)
Ubuntu 16.04
创建(不存在)文件/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
答案 14 :(得分:0)
以下内容已经过测试:
ubuntu@ubuntu-xenial:~$ docker -v
Docker version 17.05.0-ce, build 89658be
我尝试了上面提到的所有答案,但这些都不适合我。
我正在关注these instructions以使其正常工作
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 (e.g. server FQDN or YOUR name) []:
并输入注册表的fqdn,即somehost
请务必使用名称myregistrydomain.com作为CN。
立即登录注册表
第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
答案 15 :(得分:0)