【问题标题】:Docker on windows - certificate errorWindows上的Docker - 证书错误
【发布时间】:2016-04-11 13:51:21
【问题描述】:

当我尝试构建或运行 docker 容器时,例如:

docker build -t docker.example.com/research/example_project .

导致如下错误:

Sending build context to Docker daemon 6.513 MB
Step 1 : FROM docker.example.com/research/example_project:latest
unable to ping registry endpoint https://docker.example.com/v0/
v2 ping attempt failed with error: Get https://docker.example.com/v2/: x509: certificate signed by unknown authority
 v1 ping attempt failed with error: Get https://docker.example.com/v1/_ping: x509: certificate signed by unknown authority

我在 google 上找到的所有解决方法都适用于 ubuntu,但这种情况是 docker 在 Windows 8 上运行(安装了虚拟机)。

【问题讨论】:

  • 也许是一个愚蠢的问题,但docker.example.com/v2 注册表存在并且您能够对注册表进行身份验证?
  • 我找到了解决方案。不得不在不安全的注册表列表中添加注册表。
  • @xavi,您能否解释一下“必须在不安全的注册表列表中添加注册表”的意思?这样你就可以帮助其他人解决同样的问题。

标签: windows docker virtualbox docker-registry docker-machine


【解决方案1】:

如果您正在为 Windows 运行 Docker >= 1.12(运行本机并使用 Hyper-V 而不是 VirtualBox),您可以将注册表的主机地址作为“不安全注册表”添加到 Docker 守护程序配置中:

右键单击系统托盘中的 Docker 图标 --> 设置... --> 单击 'Docker Daemon' 选项卡 --> 更改行

"insecure-registries": [
  ],

进入

"insecure-registries": [
"your.domain.com:5000"
  ],

这让我可以使用新的 Docker for Windows 再次访问我的私有注册表。可能也适用于 Mac,但尚未测试。

【讨论】:

    【解决方案2】:

    如果您使用的是适用于 Windows 的 1.12 之前的 Docker 版本(使用 VirtualBox 和 Boot2Docker 的版本),您需要将您的注册表证书添加到 Boot2Docker 虚拟机。在 Docker 控制台窗口中,输入:

    $ docker-machine ssh default
    $ DOMAIN_NAME=<type your domain name here>:5000
    $ sudo mkdir -p /etc/docker/certs.d/$DOMAIN_NAME
    $ sudo vi /etc/docker/certs.d/$DOMAIN_NAME/ca.crt
    
    --> then copy certificate text in there and save (type :wq)
    

    下一步是创建一个脚本,将证书添加到允许的证书列表中:

    $ sudo touch /var/lib/boot2docker/bootlocal.sh && sudo chmod +x /var/lib/boot2docker/bootlocal.sh
    $ sudo vi /var/lib/boot2docker/bootlocal.sh
    

    然后填写下面的“你的域名”变量,并将这个脚本粘贴到你刚刚创建的文件中:

    #!/bin/bash
    CA_CERTS_DIR=/usr/local/share/ca-certificates
    DOCKER_CERTS_DOMAIN_DIR=/etc/docker/certs.d/<your domain name>
    CERTS_DIR=/etc/ssl/certs
    CAFILE=${CERTS_DIR}/ca-certificates.crt
    
    cp ${DOCKER_CERTS_DOMAIN_DIR}/ca.crt ${CA_CERTS_DIR}
    
    
    for cert in $(/bin/ls -1 ${DOCKER_CERTS_DOMAIN_DIR}); do
    SRC_CERT_FILE=${CA_CERTS_DIR}/${cert}
    CERT_FILE=${CERTS_DIR}/${cert}
    HASH_FILE=${CERTS_DIR}/$(/usr/local/bin/openssl x509 -noout -hash -in ${SRC_CERT_FILE} 2>/dev/null)
    
    [ ! -L ${CERT_FILE} ] && /bin/ln -fs ${SRC_CERT_FILE} ${CERT_FILE}
    
    for idx in $(/usr/bin/seq 0 9); do
    if [ -L ${HASH_FILE}.${idx} ]; then
    [ "$(/usr/bin/readlink ${HASH_FILE}.${idx})" = "${SRC_CERT_FILE}" ] && break
    else
    /bin/ln -fs ${SRC_CERT_FILE} ${HASH_FILE}.${idx}
    break
    fi
    done
    /bin/cat ${SRC_CERT_FILE} >> ${CAFILE}
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多