如何获得远程访问一个私人码头注册表?

我正在尝试设置一个私人码头注册表使用的图像来自: Https://github.com/docker/docker-registry

仅仅通过跑步:
docker run -p 5000:5000 registry

我只能从 localhost 将/push 从/推到这个存储库,但是如果我试图从另一台机器(使用同一个 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标志。

102020 次浏览

好吧,经过一天的挖掘,我找到了解决办法。

1.12.1以下码头:

事实证明,新的客户端版本拒绝在没有 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

对于码头1.12.1:

以下是 vikas027的回答(只适用于中位数)

好的。我是这样让它起作用的。如果在 docker 1.3.2或更高版本中看到此错误,请执行以下操作

转到 /etc/sysconfig/docker

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

然后逃跑

sudo service docker restart

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

Sudo vi/etc/default/docker

添加文件末尾的行

DOCKER _ OPTS = “ $DOCKER _ OPTS —— security-Registry = 192.168.2.170:5000”

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

重启码头服务

Sudo 服务码头重新启动

使用下面的命令用注册表替换{ YORBISTRY }

boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry {YOUR_REGISTRY}\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart"

编辑 docker.service 文件,添加—— security-registryx.x.x.x after-d 标志,重新启动 docker

这是唯一对我有效的方法,DOCKER _ OPTS 没有任何效果

在讨论如何配置 Docker 服务本身时,我发现以下内容非常有用

与本文一起介绍 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

注意: 状态消息中的 Loded: 和 Drop-In: 行提供的信息对于检查预先存在的 docker 守护进程的工作情况非常有用。

注意: 还可以查看 Loade: docker.service 文件中的 Environment File = 以获得更多线索。

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

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

1)在 ubuntu 中添加下面的标志:/etc/default/DOCKER 文件中 DOCKER _ OPTS 下的端口

1.1)配置 no _ agent env 变量以绕过本地 IP/hostname/domainname... 因为代理可以抛出交互式 msg... 比如继续 这种中间味道混淆了码头客户端,最后超时..。

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

1.3)在/etc/default/docker 中设置 env 变量 http _ xy 和 https _ xy... ,因为它可以从外部公司中心下载图像。 格式 http _ xy = < a href = “ http://username: password@xy: port”rel = “ nofollow”> http://username:password@proxy:port

2)重新启动 docker 服务... 如果作为服务安装,使用 sudo service docker 重新启动

3)重新启动注册表容器[ sudo docker run-p 5000:5000 Registry: 2]

4)使用 sudo docker 标签 imageid IP: port/imagename/tagname ifany 标记所需的图像

5)推送图像... sudo docker 推送 ip: port/imagename

6)如果你想从另一台机器上提取图像,比如说 B,没有 TLS/SSL,那么 在 B 中应用设置1.1.1和2。 如果这些变化没有在机器 B 中完成... 拉将失败。

这是什么为我工作的 CentOS 7.2码头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

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

因为我是代理人,我的解决方案是..。

/etc/systemd/system/docker.service.d/http-xy. 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.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

似乎可以同时使用—— security-Registry 选项和注册表 ID 之间的“ =”,也可以不使用“ =”。

为了省去你的麻烦,你为什么不使用 gitlab 提供的免费私人码头注册服务呢

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

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

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

除了上面的答案,我还加入了在“ docker for mac”中对我有效的方法:

  1. 在屏幕右上角的 Mac 托盘上单击 码头鲸的标志
  2. 点击 偏好-> 守护进程
  3. 将您的 IP 和端口添加到不安全的注册中心。
  4. 重启守护神。

enter image description here

两步解决方案(没有 --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

现在您的码头工人将信任您的自签名证书。