使用自签名证书将本地Docker映像推送到私有存储库

时间:2019-06-01 20:14:00

标签: docker docker-registry openshift-origin

我正在尝试将图像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

3 个答案:

答案 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,然后推送。