我正在尝试将图像foo/bar
从我的本地Docker注册表推送到在OpenShift 3.11(实际上是Minishift v1.33.0 + ba29431)上运行的注册表。
注册表位于192.168.64.3:2376
,并且需要HTTPS连接。它使用自签名证书。
首先,我复制新图像的标签:
docker tag foo/bar 192.168.64.3:2376/app/foo/bar
成功。然后我尝试推动:
$ docker push 192.168.64.3:2376/app/foo/bar
The push refers to repository [192.168.64.3:2376/app/foo/bar]
Get https://192.168.64.3:2376/v2/: x509: certificate signed by unknown authority
或者,当Docker配置为允许使用192.168.64.0/24
中的不安全注册表时,它会与服务器进行HTTP对话,而不是禁用证书验证:
$ docker push 192.168.64.3:2376/app/foo/bar
The push refers to repository [192.168.64.3:2376/app/foo/bar]
Get http://192.168.64.3:2376/v2/: EOF
文档说,对于不安全的注册表,它应该“首先,尝试使用HTTPS。如果HTTPS可用,但是证书无效,则忽略有关证书的错误。如果HTTPS不可用,则退回到HTTP。”因此,我不希望看到EOF错误。
我也不能尝试告诉Docker使用Minishift证书,因为它突然失去了与本地Docker守护进程通信的能力(它应该使用Unix域套接字,而不是tcp:// localhost:2376):>
$ export DOCKER_TLS_VERIFY="1"
$ export DOCKER_CERT_PATH="/Users/rzg/.minishift/certs"
$ docker push 192.168.64.3:2376/app/foo/bar
Cannot connect to the Docker daemon at tcp://localhost:2376. Is the docker daemon running?
这是我使用的Docker版本:
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:39 2019
OS/Arch: darwin/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:13:06 2019
OS/Arch: linux/amd64
Experimental: false
答案 0 :(得分:1)
您提到的这两个环境变量是docker
命令行工具与Docker守护进程对话的对象。您通常不需要设置它们。 (还请注意,端口2376是Docker API HTTP-over-TLS的常规端口,尽管没有什么阻止您将其用于注册表。)
您正在尝试配置Docker守护程序以与您信任的远程注册表通信。 The dockerd
reference says about secure registries:
安全注册表使用TLS,并将其CA证书的副本放置在
/etc/docker/certs.d/myregistry:5000/ca.crt
的Docker主机上。
因此,在设置中,您需要为您的注册表找到CA证书,并将其放入/etc/docker/certs.d/192.168.64.3:2376/ca.crt
,然后重新启动Docker守护程序。
OpenShift OKD文档在Securing and Exposing the Registry下也对此进行了描述(请参阅“手动保护注册表”,尤其是其步骤12和13)。
答案 1 :(得分:1)
根据文档:
您可以放入客户端证书并键入
~/.docker/certs.d/<MyRegistry>:<Port>/client.cert
和
~/.docker/certs.d/<MyRegistry>:<Port>/client.key
https://docs.docker.com/docker-for-mac/faqs/#how-do-i-add-custom-ca-certificates
或者,您配置凭据存储并在其中加载证书,然后在〜/ .docker / config json中配置存储
此处的文档:https://docs.docker.com/engine/reference/commandline/login/
答案 2 :(得分:0)
需要将Docker客户端配置为(i)接受由CA证书签名的私有注册表的证书,以及(ii)提交授权的客户端证书。
Minishift将其所有证书文件放在〜/ .minishift / certs中。其中包括CA证书(ca.pem),客户端证书(cert.pem)和客户端私钥(key.pem)。
此示例查询证明所有三种成分均导致成功连接:
curl \
--cacert ~/.minishift/certs/ca.pem \
--cert ~/.minishift/certs/cert.pem \
--key ~/.minishift/certs/key.pem \
https://$(minishift ip):2376/v2/info
在macOS上,我们需要遵循https://youtu.be/-xU95CUTvHghttps://youtu.be/-xU95CUTvHg并将CA证书安装到钥匙串:
security add-trusted-cert -d -r trustRoot -k ~/Library/Keychains/login.keychain ~/.minishift/certs/ca.pem
还要链接到客户端证书和密钥:
mkdir -p ~/.docker/certs.d/$(minishift ip):2376/
ln -s ~/.minishift/certs/cert.pem ~/.docker/certs.d/$(minishift ip):2376/client.cert
ln -s ~/.minishift/certs/key.pem ~/.docker/certs.d/$(minishift ip):2376/client.key
最后,重新启动Mac版Docker,然后推送。