84

我正在尝试使用从以下位置获取的图像设置私有 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旗帜。

4

15 回答 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

10.0.0.26用您自己的IP地址替换)。

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

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

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

对于 docker 1.12.1:

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

于 2014-11-03T11:29:28.893 回答
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
于 2016-10-05T06:28:33.437 回答
24

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

须藤 vi /etc/default/docker

在文件末尾添加行

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

(把192.168.2.170换成自己的ip地址)

并重新启动 docker 服务

须藤服务码头重新启动

于 2014-12-17T09:39:36.507 回答
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 daemon 的工作情况很有用。

注意:还可以查看 Loaded: docker.service 文件中的 EnvironmentFile= 以获取更多线索。

于 2015-09-17T03:47:21.207 回答
11

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

/etc/sysconfig/docker

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

并运行

sudo service docker restart

于 2014-12-16T22:48:11.207 回答
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"
于 2015-06-10T21:36:58.367 回答
7

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

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

于 2015-08-04T15:53:59.217 回答
4

码头工人 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 之间有或没有“=”的情况下使用。

于 2016-11-16T13:16:08.527 回答
2

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

于 2016-03-15T00:33:34.363 回答
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 将信任您的自签名证书。

于 2018-03-05T19:55:44.263 回答
1

这是基于 vikas027 on 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;
于 2016-10-06T08:03:39.287 回答
0

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

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

在此处输入图像描述

于 2017-11-06T20:50:34.663 回答
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
于 2017-03-24T11:50:12.237 回答
0

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

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

1.1) 配置 no_proxy 环境变量以绕过本地 IP/主机名/域名...因为代理可以抛出一个交互式消息 ...就像 continue 并且这个中间消息混淆 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 中完成......拉取将失败。

于 2016-05-31T10:35:45.030 回答
0

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

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

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

于 2017-02-10T04:23:43.567 回答