如何远程访问私有Docker仓库?

84

我正在尝试使用从https://github.com/docker/docker-registry获取的镜像建立一个私有Docker注册表。

只需运行以下命令:
docker run -p 5000:5000 registry

我只能在本地主机上从该存储库中拉取/推送,但如果我尝试从另一台机器(使用同一局域网下的私有地址)访问它,则会出现错误信息。

*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非常有用(截至最新版本)。 - danday74
1
在Ubuntu上,Docker文档这个答案对我很有帮助。 - Batandwa
15个回答

73

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

对于1.12.1以下版本的docker:

事实证明,新的客户端版本拒绝在没有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的开发人员将此选项添加到拉取/推送命令行中...

编辑 - 或者 - 您可以将标志添加到/ etc / default / docker内部的DOCKER_OPTS环境变量中... 然后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
3
@ashleyaitken,我使用以下参考资料帮助我解决了Boot2Docker的问题:https://github.com/boot2docker/boot2docker#insecure-registry。希望这有所帮助。 - Patelify
10.0.0.26 是你的注册表吗?(例如像Artifactory这样的)为什么端口是5000而不是8081?有没有办法将Docker镜像推送到Artifactory? - Adrian
1
“--insecure-registry” 是一种解决方法而不是修复方法。 - peterh
显示剩余5条评论

29

这是适用于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
谢谢,伙计 - 很好用 - 基于此添加了更完整的答案,以供那些在公司代理后面的人使用。 - danday74
2
对我来说可行,但在Ubuntu 16.04上,docker.service位于/lib/systemd/system/docker.service - Karim Tabet
4
--insecure-registry是一种解决方法,而不是一种修复方法。 - peterh
1
工作。或者你必须黑掉整个系统(另一个类似的“特性”是,“桥接网络”实际上意味着在docker中进行NAT网络,而真正的桥接网络根本不存在)。这些答案推广可怕的解决方案来解决重大问题,这些问题本应该很容易解决,但不知何故却没有解决。这就是我为什么对它们进行了负投票的原因 - 它们所有的解决方案都是糟糕的解决方案。 - peterh
显示剩余7条评论

24

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

sudo vi /etc/default/docker

在文件末尾添加以下行:

DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=192.168.2.170:5000"

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

然后重新启动docker服务。

sudo service docker restart


谢谢!令人惊讶的是,在Ubuntu 14.04上编辑/etc/init.d/docker根本不起作用。但是你对/etc/default/docker的修复有效。 - elimisteve
我的主机系统也是Ubuntu 14.04。 - daozhao
1
“--insecure-registry” 是一种解决方法而不是修复方法。 - peterh

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=以获取更多线索。


3
“--insecure-registry” 是一种解决方法而不是修复方法。 - peterh
你好 @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
@Jay 我是个新手。1.3.2听起来像是docker的未来版本。如果我没记错的话,当前版本是1.12 https://github.com/docker/docker/releases。 - ravindrab
1
@ravindrab 在哪个宇宙中,12比3小? ;) - ferrari2k
2
“--insecure-registry” 是一种解决方法而不是修复方法。 - peterh

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
2
“--insecure-registry” 是一种解决方法而不是修复方法。 - peterh

7

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

这是我唯一有效的方法,DOCKER_OPTS没有任何影响。


你说的一切都是正确的,但细节太少了,以至于答案几乎没有什么用处。 - danday74
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

两步解决方案(不需要--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

现在你的Docker将信任你自签名的证书。

2

我发现Docker客户端版本和Docker注册表版本必须匹配,否则即使所有准备工作都已就绪,你也会遇到连接问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接