Docker Swarm和自签名Docker Registry

时间:2016-06-21 11:57:07

标签: docker docker-registry

Docker Swarm是否支持Docker Registry使用自签名证书?

我根据官方Docker documentation中的步骤创建了我的群集,它使用在容器内运行的swarm主/节点。

效果很好,但是一旦我尝试登录我的Docker Registry,我就会收到错误消息:

$ docker -H :4000 login https://...:443
...
Error response from daemon: Get https://.../v1/users/: x509: certificate signed by unknown authority

是否需要设置其他选项,例如--insecure-registry?或者我是否需要以某种方式更新Docker Swarm容器?

3 个答案:

答案 0 :(得分:3)

您需要将自签名证书或个人CA添加到主机上的受信任证书列表中。出于某种原因,docker不会使用守护程序上的证书进行此身份验证。以下是debian主机的命令:

sudo mkdir -p /usr/local/share/ca-certificates
sudo cp ca.pem /usr/local/share/ca-certificates/ca-local.crt
sudo update-ca-certificates
sudo systemctl restart docker

守护程序需要重新启动docker才能重新加载操作系统证书。

正如luka5z在latest documentation中看到的那样,您还可以通过将证书复制到/etc/docker/certs.d/myregistrydomain.com:5000/ca.crt来直接将证书添加到每个docker引擎。这样可以避免在整个操作系统上信任自签名CA.

答案 1 :(得分:2)

  

有没有办法可以用所需的证书更新它?

Docker 17.06将带来命令docker swarm ca(PR 48) 意味着docker swarm ca --rotate就够了。

root@ubuntu:~# docker swarm ca --help

Usage:  docker swarm ca [OPTIONS]

Manage root CA

Options:
      --ca-cert pem-file          Path to the PEM-formatted root CA certificate to use for the new cluster
      --ca-key pem-file           Path to the PEM-formatted root CA key to use for the new cluster
      --cert-expiry duration      Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)
  -d, --detach                    Exit immediately instead of waiting for the root rotation to converge
      --external-ca external-ca   Specifications of one or more certificate signing endpoints
      --help                      Print usage
  -q, --quiet                     Suppress progress output
      --rotate                    Rotate the swarm CA - if no certificate or key are provided, new ones will be generated

Here is a demo

答案 2 :(得分:0)

我也遇到了你的问题。

我无法确定这个的根本原因,或者是什么设置了这个限制。

但我设法解决了这个问题:

如果不安全,请确保在每个主机上相应地启动每个docker守护程序。

您可以找到有关如何更改守护程序选项的信息:​​https://docs.docker.com/engine/admin/systemd/

例如:来自我的conf。之后--insecure-registry <private registry>

systemctl daemon-reload
systemctl restart docker
docker login <private registry>
在每个泊坞主机上

并拉出所需的图像。

之后你拥有了所有的图像,它们不再试图拉它们了。

我知道这不是最好的解决方案:(

PS:我还必须将这些参数添加到每个docker守护程序:

--cluster-advertise=<host:ip> --cluster-store=consul://<consul ip:consul port>

没有这些我无法在不同的主机上运行容器。他们都在随机选择的一个主机上运行。