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

Posted

技术标签:

【中文标题】如何远程访问私有 docker-registry?【英文标题】:How to get remote access to a private docker-registry? 【发布时间】:2014-12-29 20:49:48 【问题描述】:

我正在尝试使用从以下位置获取的图像设置一个私有 docker 注册表: https://github.com/docker/docker-registry

只需运行: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 标志。

【问题讨论】:

对于 docker 1.12,许多答案似乎已经过时,但请参阅 vikas027 答案,这对 docker 1.12(最新 ATOW)非常有用 在 Ubuntu 上,Docker documentation 和 this answer 对我来说效果很好。 【参考方案1】:

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

对于 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 人员将此选项添加到 pull/push 命令行...

编辑 - 或者 - 您可以将标志添加到 /etc/default/docker 内的 DOCKER_OPTS env 变量... 然后sudo service docker restart

再次编辑 - 码头工人似乎在上面 - 很快就会有修复: https://github.com/docker/docker/pull/8935

对于 docker 1.12.1:

请按照下面vikas027的回答(对centos有效)

【讨论】:

我能够复制您的步骤并推送到远程主机上的私有注册表。它也显示了成功的推动。但是,如何在私有注册表中列出图像?我尝试了docker -H tcp://remote-host-ip:5000 images,但返回错误。 我可以验证是否发生了这种情况。当您查询 :5000/v1/search 时也会发生这种情况 - 您得到空响应。他们可能有一个不同的错误:-( 更新:我能够搜索/提取存储在远程私有注册表上的图像。 docker search remote-host-ip:5000/image-namedocker pull remote-host-ip:5000/image-name 都可以正常工作。现在,我如何让它列出图像... @ashleyaitken,我使用以下参考来帮助我解决 Boot2Docker:github.com/boot2docker/boot2docker#insecure-registry。希望对您有所帮助。 --insecure-registry 是一种解决方法,而不是修复方法。【参考方案2】:

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

转到/etc/sysconfig/docker

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

然后运行

sudo service docker restart

【讨论】:

你必须放一个'='来影响ubuntu下的注册表值:"--insecure-registry=10.0.0.26:5000" @Jay 我是个菜鸟。 1.3.2 听起来像是 docker 的未来版本。如果我没记错的话,我看到当前版本是 1.12 github.com/docker/docker/releases。 @ravindrab 在哪个宇宙中 12 小于 3? ;) --insecure-registry 是一种解决方法,而不是修复方法。【参考方案3】:

编辑配置文件“/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 重启

【讨论】:

谢谢!令人惊讶的是,在 Ubuntu 14.04 上编辑 /etc/init.d/docker 完全不起作用。但是您对/etc/default/docker 的修复可以。 我的主机系统也是 Ubuntu 14.04 --insecure-registry 是一种解决方法,而不是修复方法。【参考方案4】:

使用以下命令将 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 是与问题上下文无关的独立工具包。 --insecure-registry 是一种解决方法,而不是修复方法。【参考方案5】:

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

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

【讨论】:

你说的都是真的,但是细节太少了,答案几乎没用 --insecure-registry 是一种解决方法,而不是修复方法。【参考方案6】:

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

【讨论】:

--insecure-registry 是一种解决方法,而不是修复方法。 你好@peterh 我知道这是一种解决方法,而且不安全。我毫不怀疑有生产系统在使用它,这确实是一件非常糟糕的事情。 @peterh 能否请您指出任何显示如何正确操作的链接,我将更新我的答案并参考链接。【参考方案7】:

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

【讨论】:

【参考方案8】:

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

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

1.1) 配置 no_proxy 环境变量以绕过本地 IP/主机名/域名...因为代理可以抛出交互式消息 ...like continue 而这个中间的 msg 混淆了 docker 客户端,最后超时了......

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

1.3) 在 /etc/default/docker 中设置环境变量 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) 如果你想从另一台机器上提取图像,比如没有 TLS/SSL 的 B,那么 在 B 中应用 setps 1,1.1 和 2。 如果没有在机器 B 中完成这些更改...拉动将失败。

【讨论】:

--insecure-registry 是一种解决方法,而不是修复方法。【参考方案9】:

这对我在 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

【讨论】:

这个解决方案是唯一一个在 Ubuntu 上对我有用的解决方案。 谢谢人 - 工作得很好 - 在此基础上为公司代理背后的人添加了更完整的答案 为我工作,但 docker.service 在 Ubuntu 16.04 上位于 /lib/systemd/system/docker.service --insecure-registry 是一种解决方法,而不是修复方法。 工作。或者你必须破解你的整个系统(另一个类似的“功能”是“桥接网络”实际上意味着 Docker 中的 NAT 网络,而真正的桥接网络根本不存在)。这些答案普及了主要问题的可怕解决方法,这些问题可以很容易地解决,但不知何故它们不是。这就是为什么我对所有这些都投反对票的原因 - 所有这些都是解决方案。【参考方案10】:

这是基于 vikas027 在 Centos 7 和 Docker 1.12 上的回答

由于我使用代理,我的完整解决方案是......

/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;

【讨论】:

--insecure-registry 是一种解决方法,而不是修复方法。【参考方案11】:

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

【讨论】:

--insecure-registry 是一种解决方法,而不是修复方法。【参考方案12】:

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

https://about.gitlab.com/2016/05/23/gitlab-container-registry/

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

【讨论】:

【参考方案13】:

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】:

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

    点击屏幕右上角 mac 托盘中的 docker 鲸鱼图标。 点击首选项 -> 守护进程。 将您的 IP 和端口添加到不安全的注册表中。 重启守护进程。

【讨论】:

【参考方案15】:

两步解决方案(不带--insecure-registry):

    从您的注册表下载公钥 放入/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 将信任您的自签名证书。

【讨论】:

以上是关于如何远程访问私有 docker-registry?的主要内容,如果未能解决你的问题,请参考以下文章

docker-registry构建私有的镜像仓库

部署docker-registry私有仓库

7.docker-registry私有仓库

docker私有仓库yum安装 docker-registry

Centos版的安装docker-registry私有仓库

如何在 Apache httpd 后面公开 Docker-Registry?