如何获得对私有docker-registry的远程访问?


82

我正在尝试使用从https://github.com/docker/docker-registry拍摄的图像来设置私有Docker注册表

只需运行:
docker run -p 5000:5000 registry

我只能从本地主机从该存储库拉入/推送到该存储库,但是如果我尝试从另一台计算机(使用同一LAN上的私有地址)访问它,则会失败并显示错误消息:

*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国旗。


3
Docker 1.12的许多答案似乎已经过时,但请参见vikas027答案,这对于Docker 1.12(最新的ATOW)非常有用
danday74 '16

1
在Ubuntu上,Docker文档此答案对我来说效果很好。
Batandwa

Answers:


73

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

对于1.12.1以下的docker:

事实证明,新的客户端版本拒绝使用没有SSL的私有注册表。

要解决此问题,客户端计算机上的守护程序应使用不安全标志启动:

只需输入:

sudo service docker stop # to stop the service

然后

sudo docker -d --insecure-registry 10.0.0.26:5000

(将替换为10.0.0.26您自己的IP地址)。

我希望码头工人将这个选项添加到拉/推命令行...

编辑-经常进行-您可以将标志添加到DOCKER_OPTS/ etc / default / docker ...中的env变量,然后sudo service docker restart

再次编辑-似乎是docker家伙在上面-很快就会有一个修复程序:https : //github.com/docker/docker/pull/8935

对于docker 1.12.1:

请遵循下面的vikas027答案(适用于centos)


我能够复制您的步骤,并将其推送到远程主机上的私有注册表。它也显示出成功的推动力。但是,如何在专用注册表上列出图像?我尝试过docker -H tcp://remote-host-ip:5000 images但返回错误。
Howard Lee

我可以验证这种情况。当您查询<ip>:5000 / v1 / search时也会发生-得到空响应。他们可能有一个不同的错误:-(
Ofer Eliassaf

更新:我能够搜索/拉出存储在远程私人注册表中的图像。docker search remote-host-ip:5000/image-name而且docker pull remote-host-ip:5000/image-name两个功能都很好。现在,我该如何列出图像...
Howard Lee

3
@ashleyaitken,我使用以下参考信息来帮助我解决Boot2Docker:github.com/boot2docker/boot2docker#insecure-registry。希望能有所帮助。
Patelify 2015年

1
--insecure-registry是一种解决方法,而不是解决方法。
彼得-恢复莫妮卡

28

这就是我在CentOS 7.2Docker 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

1
该解决方案是唯一在Ubuntu上对我有用的解决方案。
JARC

1
谢谢您
做得

2
为我工作,但docker.service在/lib/systemd/system/docker.serviceUbuntu 16.04上。
卡里姆·泰伯

4
--insecure-registry是一种解决方法,而不是解决方法。
彼得-恢复莫妮卡

1
工作。或者,您必须破解整个系统(另一个类似的“功能”是“桥接网络”实际上是指docker中的NAT网络,而真正的桥接网络根本不存在)。这些答案将可怕的解决方法推广到了重大问题上,这些问题很容易解决,但实际上并没有解决。这就是为什么我拒绝所有这些的理由-所有这些都是不好的解决方案。
peterh-恢复莫妮卡

24

编辑配置文件“ / etc / default / docker”

须藤vi / etc / default / docker

在文件末尾添加行

DOCKER_OPTS =“ $ DOCKER_OPTS --insecure-registry = 192.168.2.170:5000”

(用您自己的IP地址替换192.168.2.170)

然后重启docker服务

sudo服务docker重新启动


谢谢!/etc/init.d/docker令人惊讶的是,仅进行全面编辑无法在Ubuntu 14.04上运行。但是您的解决方案/etc/default/docker确实可以。
elimisteve 2015年

我的主机系统也是Ubuntu 14.04,也是
daozhao 2015年

1
--insecure-registry是一种解决方法,而不是解决方法。
彼得-恢复莫妮卡

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(daemon)选项,则会出现“请仅指定一个-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 =以获得更多线索。


2
--insecure-registry是一种解决方法,而不是解决方法。
彼得-恢复莫妮卡

您好@peterh我知道这是一种解决方法,并且是一种不安全的方法。我毫不怀疑有使用它的生产系统,这确实是一件非常糟糕的事情。
TJA

1
@peterh,能否请您指向任何显示如何正确执行操作的链接,我将更新我的答案并引用该链接。
TJA

11

好。这就是我如何使它工作。如果您在Docker 1.3.2或更高版本中看到此错误,请执行此操作

/etc/sysconfig/docker

other_args="--insecure-registry 10.0.0.26:5000"

并运行

sudo service docker restart


1
您必须放置一个'='来影响ubuntu下的注册表值:“-insecure-registry = 10.0.0.26:5000”
Romain Jouin 2015年

@周杰伦,我是菜鸟。1.3.2听起来像是docker的未来版本。如果我在这里没有记错的话,我看到当前的版本是1.12 github.com/docker/docker/releases
ravindrab

1
@ravindrab在哪个宇宙中12比3小?;)
ferrari2k

2
--insecure-registry是一种解决方法,而不是解决方法。
彼得-恢复莫妮卡

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"

boot2docker是与问题上下文无关的独立工具包。
Arnaud Meuret,2015年

2
--insecure-registry是一种解决方法,而不是解决方法。
彼得-恢复莫妮卡

7

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

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


您说的一切都是真实的,但细节
太少

2
--insecure-registry是一种解决方法,而不是解决方法。
peterh-恢复莫妮卡

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


2
--insecure-registry是一种解决方法,而不是解决方法。
peterh-恢复莫妮卡

2

我发现docker客户端版本和注册表docker版本必须匹配,否则,尽管一切就绪,您仍会遇到连接问题。


2

两步法(无--insecure-registry):

  1. 从注册表中下载公钥
  2. 放入/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

现在,您的泊坞窗将信任您的自签名证书。


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;

1
--insecure-registry是一种解决方法,而不是解决方法。
peterh-恢复莫妮卡

0

在docker中设置本地不安全注册表以及代理:

1)在ubuntu中在文件/ etc / default / docker的DOCKER_OPTS下添加以下标志--insecure-registry IP:port

1.1)配置no_proxy env变量以绕过本地IP /主机名/域名...因为代理可以抛出交互式msg ...像继续,而这个中间msg混淆了docker客户端,最终超时...

1.2)如果配置了域名...那么如果不使用DNS,请不要忘记更新/ etc / hosts文件。

1.3)在/ etc / default / docker中设置环境变量http_proxy和https_proxy ...,因为它可以从外部公司中心下载映像。格式http_proxy = http://用户名:密码@proxy:端口

2)重新启动docker服务...如果作为服务安装,请使用sudo服务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)如果您想从没有TLS / SSL的另一台计算机上说图像B,则在B中应用setps 1,1.1和2。如果未在计算机B中进行这些更改,则...将失败。


2
--insecure-registry是一种解决方法,而不是解决方法。
peterh-恢复莫妮卡


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

0

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

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

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.