如何远程访问私有docker-registry?

问题描述 投票:79回答:16

我正在尝试使用以下图片设置私人码头注册表: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成功访问它

我也不明白我应该在哪里以及如何通过q​​azxswpoi旗帜。

docker remote-access docker-registry
16个回答
71
投票

好的 - 经过一天的挖掘后,我找到了解决方案。

对于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有效)


1
投票

这是基于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

1
投票

两步解决方案(没有sudo systemctl daemon-reload; sudo systemctl restart docker; ):

  1. 从注册表中下载公钥
  2. 把它放入--insecure-registry目录

/etc/docker/certs.d/$HOSTNAME/

现在您的docker将信任您的自签名证书。


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 = 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中完成...拉动将失败。


0
投票

为了节省您的麻烦,为什么不使用gitlab提供的免费私有docker注册服务 - 效果很好

http://username:password@proxy:port

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


0
投票

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

0
投票

以下内容已经过测试:

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/

0
投票

除了上面的答案,我还为我添加了“docker for mac”中的内容:

  1. 单击屏幕右上角mac托盘中的docker whale图标。
  2. 单击首选项 - >守护程序。
  3. 将您的IP和端口添加到不安全的注册表。
  4. 重启守护进程。

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


27
投票

这对CentOS 7.2和Docker 1.12.1(最新的日期)有用。我的私人注册表v2在https://github.com/docker/docker/pull/8935上运行,相应地进行更改。如果你有多个注册表,这也有效,只需继续添加192.168.1.88:5000

--insecure-registry IP:Port

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服务

sudo服务码头重启


12
投票

好。以下是我如何使用它。如果您在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"


12
投票

我发现以下内容非常有用,因为它讨论了如何配置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 =以获取更多线索。


9
投票

使用以下命令将{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

7
投票

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

这是唯一对我有用的东西,DOCKER_OPTS没有任何效果


4
投票

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之间使用和不使用“=”。


2
投票

我发现docker客户端版本和注册表docker版本必须匹配,否则你会遇到连接问题,尽管已经有了一切。

© www.soinside.com 2019 - 2024. All rights reserved.