docker在Windows – 证书错误

当我尝试构build或运行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上find的所有解决方法都是针对ubuntu的,但这种情况是在docker在Windows 8上运行的时候(安装了虚拟机)。

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

右键单击您的系统托盘中的Docker图标 – >设置… – >单击“Docker守护进程”选项卡 – >更改行

 "insecure-registries": [ ], 

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

这使我可以使用新的Docker for Windows再次访问我的私人registry。 可能也适用于Mac,但没有testing过。

如果您使用的是Windows版本之前的1.12 Docker版本(将VirtualBox与Boot2Docker一起使用的版本),则需要将registry证书添加到Boot2Docker虚拟机。 从Docker控制台窗口中input:

 $ 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) 

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

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

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

 #!/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