【问题标题】:docker --insecure-registry flag not working as expecteddocker --insecure-registry 标志未按预期工作
【发布时间】:2015-06-06 19:30:14
【问题描述】:

登录时使用自签名证书的私有注册表说明:

FATA[0005] 来自守护程序的错误响应:v1 ping 尝试失败 错误:获取https://registry:8443/v1/_ping:x509:证书签名者 未知的权威。如果此私有注册表仅支持 HTTP 或 带有未知 CA 证书的 HTTPS,请将 --insecure-registry registry:8443 添加到守护程序的参数中。在 HTTPS 的情况下,如果您 可以访问注册中心的 CA 证书,不需要标志; 只需将 CA 证书放在 /etc/docker/certs.d/registry:8443/ca.crt

我试过了,但又遇到了另一个错误,即 IP 不在主题中。所以我修复了这个错误,现在得到:

FATA[0006] 来自守护程序的错误响应:服务器错误:发布 https://registry:8443/v1/users/: x509: 证书由未知签名 权威

其中registry是注册中心的IP。

然后我将“--insecure-registry registry:8443”放入 /etc/default/docker 并重新启动守护进程

我已验证它已采用该设置。

根 6865 1 0 12:47 ? 00:00:00 /usr/bin/docker -d --insecure-registry registry:8443

但是 docker login 仍然会产生这个错误:

FATA[0006] 来自守护程序的错误响应:服务器错误:发布 https://registry:8443/v1/users/: x509: 证书由未知签名 权威

insecure-registry 的工作方式是否与我想象的不同,我该如何解决?

是的,我需要 HTTPS。它是一个私有注册表,但在公共 IP 上。使用真实证书创建正确的 DNS 条目是唯一的方法吗?

【问题讨论】:

  • 这个问题+1。目前我不需要 HTTPS(--insecure-registry 效果很好),但我必须尽早启用此功能。
  • 最后我无法按照描述解决它。相反,我添加了一个 DNS 条目和一个真正的证书,并为我修复了它。不过,我仍然想知道您如何部署自签名。
  • 如果 guide 对我没有帮助,我想我将不得不部署自己的证书颁发机构并配置我的环境以信任它们(可能会为此目的使用 FreeIPA)

标签: docker


【解决方案1】:

推荐方式 Docker 17.xx +

有多种方法可以为 Docker 守护程序配置守护程序标志和环境变量。 recommended way是使用平台无关的daemon.json文件,在Linux上默认位于/etc/docker/

因此,要配置不安全的注册表,请执行以下操作:

  1. daemon.json 文件中设置以下标志:

    {
        "insecure-registries": ["registry:8443"]
    }
    
  2. 重启 Docker

     $ sudo systemctl restart docker
    

就是这样!

【讨论】:

    【解决方案2】:

    是的!我找到了问题!

    您需要修复/etc/systemd/system/multi-user.target.wants/docker.service。目前在启动 docker 时不考虑 $OPTIONS。所以我的现在看起来像这样:

    [Unit]
    Description=Docker Application Container Engine
    Documentation=http://docs.docker.com
    After=network.target docker.socket
    Requires=docker.socket
    
    [Service]
    #The line below was missing $OPTIONS at the end!!!
    ExecStart=/usr/bin/docker -d -H fd:// $OPTIONS
    MountFlags=slave
    LimitNOFILE=1048576
    LimitNPROC=1048576
    LimitCORE=infinity
    
    [Install]
    WantedBy=multi-user.target
    

    然后照常做:

    $ sudo systemctl daemon-reload 
    $ sudo systemctl restart docker
    

    现在一切正常。

    【讨论】:

      【解决方案3】:

      因为我几个月前已经对这个问题投了赞成票,因为我遇到了同样的问题,现在 - 希望 - 有一个解决方案,我想与你分享我为我们的私人 wiki 写的以下段落...

      设置私有注册表(使用自签名证书)

      为了将docker login 发送到私有注册表,您必须将上面生成的证书分发到 Docker 节点。

      从 haxx.se 下载 *.example.com 通配符证书和自签名证书的中间证书并重新启动 Docker 守护进程。

      curl -k https://git.example.com/herzog/pub/raw/master/ssh/example.com.crt > /usr/local/share/ca-certificates/registry.example.com-ca.crt
      curl http://curl.haxx.se/ca/cacert.pem > /usr/local/share/ca-certificates/cacert.pem
      sudo update-ca-certificates
      sudo service docker restart
      

      CA 更新的输出示例

      root@test1:~# sudo update-ca-certificates
      Updating certificates in /etc/ssl/certs... 2 added, 0 removed; done.
      Running hooks in /etc/ca-certificates/update.d....done.
      

      登录私有注册表

      docker login --username registry --email reg@example.com https://registry.example.com/v1
      

      注意!使用https://.../v1 指定的注册表主机应该适用于dockerdocker-compose

      然后拉出一张图片

      docker pull registry.example.com/namespace/image:1.0.0
      

      【讨论】:

      • 看来解决方案是将您的客户端证书放在系统上并使用 update-ca-certificates 进行注册。感谢您的信息。
      【解决方案4】:

      最好也是最独立于平台的方法是使用/etc/docker/daemon.jsonconfiguration file

      看:

      cat > /etc/docker/daemon.json <<DOCKERCONFIG
      {
        "insecure-registries": ["registry:8443"]
      }
      DOCKERCONFIG
      

      【讨论】:

        【解决方案5】:

        我的解决方案是:

        1. 如前所述修改/etc/docker/daemon.json

        2. 修改权限为: /etc/docker/daemon.json

          sudo chmod -R 777 /etc/docker/daemon.json

        【讨论】:

        • 为所有用户设置 RWX 不是一个好主意。
        猜你喜欢
        • 2018-08-15
        • 2021-11-28
        • 2021-06-13
        • 1970-01-01
        • 2021-03-22
        • 2018-11-04
        • 1970-01-01
        • 1970-01-01
        • 2018-05-24
        相关资源
        最近更新 更多