如何远程访问私有 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
,但返回错误。
我可以验证是否发生了这种情况。当您查询 docker search remote-host-ip:5000/image-name
和 docker 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.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
【讨论】:
这个解决方案是唯一一个在 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?的主要内容,如果未能解决你的问题,请参考以下文章