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

时间:2014-11-03 08:11:50

标签: docker remote-access docker-registry

我正在尝试使用以下图片设置私人泊坞窗注册表: 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标志。

16 个答案:

答案 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):

  1. 从您的注册表中下载公钥
  2. 将其放入/etc/docker/certs.d/$HOSTNAME/目录
  3. 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)

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

  1. 点击屏幕右上角mac托盘中的泊坞鲸图标
  2. 点击首选项 - >守护程序即可。
  3. 将您的IP和端口添加到不安全的注册表中。
  4. 重启守护进程。
  5. enter image description here