我正在尝试使用以下图片设置私人码头注册表: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
成功访问它
我也不明白我应该在哪里以及如何通过qazxswpoi旗帜。
好的 - 经过一天的挖掘后,我找到了解决方案。
对于1.12.1以下的码头:
事实证明,新的客户端版本拒绝使用没有SSL的私有注册表。
要解决此问题 - 应使用不安全标志启动客户端计算机上的守护程序:
只需输入:
--insecure-registry
然后
sudo service docker stop # to stop the service
(用你自己的ip地址替换sudo docker -d --insecure-registry 10.0.0.26:5000
)。
我希望docker的人能把这个选项添加到pull / push命令行......
编辑 - altenantively - 您可以将标志添加到/ etc / default / docker中的10.0.0.26
env变量...然后DOCKER_OPTS
再次编辑 - 似乎停泊者家伙正在上面 - 很快就会有一个修复:sudo service docker restart
对于docker 1.12.1:
请按照以下vikas027的答案(对centos有效)
这是基于Centos 7和Docker 1.12上的vikas027的答案
由于我支持代理,我的完整解决方案是......
/etc/system的/system/docker.service.的/HTTP-proxy.conf
/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
/US人/礼拜/system的/system/docker.service
[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}}"
别忘了重启:)
ExecStart=/usr/bin/dockerd --insecure-registry {{MY_INSECURE_REGISTRY_IP}}:5000
两步解决方案(没有sudo systemctl daemon-reload; sudo systemctl restart docker;
):
--insecure-registry
目录/etc/docker/certs.d/$HOSTNAME/
现在您的docker将信任您的自签名证书。
在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 = 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
2)重启docker服务...如果安装为服务,请使用sudo service docker restart
3)重启注册表容器[sudo docker run -p 5000:5000注册表:2]
4)使用sudo docker tag image id标记所需的图像IP:port / image name / tag name(如果有)
5)推送图像... sudo docker push ip:port / imagename
6)如果你想从另一台机器拉出图像说B没有TLS / SSL,那么在B中应用setps 1,1.1和2.如果这些改变没有在机器B中完成...拉动将失败。
为了节省您的麻烦,为什么不使用gitlab提供的免费私有docker注册服务 - 效果很好
http://username:password@proxy:port
他们的注册表是安全的,所以你不会有任何问题
Ubuntu 16.04
使用内容创建(不存在)文件https://about.gitlab.com/2016/05/23/gitlab-container-registry/:
/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
我尝试了上面提到的所有答案,但这些都不适合我。
我正在关注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
发生的其他问题解决如下:
问题1
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.
解
/ etc / hosts中的主机映射:
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
问题2
10.20.30.40 somehost
解
重新运行openssl命令
Error response from daemon: Get https://somehost:8001/v1/users/: x509: certificate is valid for , not somehost
除了在:
$ openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
-x509 -days 365 -out certs/domain.crt
并键入注册表的fqdn,即Common Name (e.g. server FQDN or YOUR name) []:
请务必使用名称myregistrydomain.com作为CN。
现在登录到注册表成功
问题3
来自守护程序的错误响应:获取somehost
:x509:由未知权限签名的证书
解
https://somehost:8001/v1/users/
除了上面的答案,我还为我添加了“docker for mac”中的内容:
sudo mkdir -p /etc/docker/certs.d/somehost:8001/
sudo cp certs/domain.crt /etc/docker/certs.d/somehost:8001/ca.crt
这对CentOS 7.2和Docker 1.12.1(最新的日期)有用。我的私人注册表v2在https://github.com/docker/docker/pull/8935上运行,相应地进行更改。如果你有多个注册表,这也有效,只需继续添加192.168.1.88:5000
--insecure-registry IP:Port
编辑配置文件“/ 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服务
sudo服务码头重启
好。以下是我如何使用它。如果您在docker 1.3.2或更高版本中看到此错误,请执行此操作
去$ 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
/etc/sysconfig/docker
并运行
other_args="--insecure-registry 10.0.0.26:5000"
我发现以下内容非常有用,因为它讨论了如何配置Docker服务本身。 sudo service docker restart
随着systemctl命令https://docs.docker.com/articles/systemd/上的这篇文章
我在基于Centos 7的容器中使用了以下一系列命令,其中注册表图像由“docker pull registry:2.1.1”获得
https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units
在override.conf里面添加了以下内容。
sudo mkdir -p /etc/systemd/system/docker.service.d
cd /etc/systemd/system/docker.service.d
sudo touch override.conf
sudo nano override.conf
注意第一个,空白,ExecStart =清除已经存在的任何内容,因此请务必添加您希望保留的/usr/lib/systemd/system/docker.service ExecStart =语句中的任何内容。
如果未指定-d(守护程序)选项,则会出现“请仅指定一个-H”错误。
发出以下一系列命令后,我可以看到我的覆盖。
[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
注意:状态消息中的Loaded:和Drop-In:行提供的信息对于检查预先存在的docker守护程序发生的情况非常有用。
注意:还可以在Loaded:docker.service文件中查看EnvironmentFile =以获取更多线索。
使用以下命令将{YOUR_REGISTRY}替换为您的注册表
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
编辑docker.service文件,在-d标志后添加--insecure-registry x.x.x.x,重启docker
这是唯一对我有用的东西,DOCKER_OPTS没有任何效果
Docker 1.12.1
对于CentOS 7.2
boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry {YOUR_REGISTRY}\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart"
对于ubuntu 16.04
/usr/lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd
ExecStart=/usr/bin/dockerd --insecure-registry my-docker-registry.com:5000
似乎--insecure-registry选项可以在它和注册表ID之间使用和不使用“=”。
我发现docker客户端版本和注册表docker版本必须匹配,否则你会遇到连接问题,尽管已经有了一切。