Перенос локального образа Docker в частный репозиторий с самозаверяющим сертификатом - PullRequest
0 голосов
/ 01 июня 2019

Я пытаюсь отправить изображение, скажем 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 ]

1 голос
/ 02 июня 2019

Согласно документации:

Вы можете поместить свои клиентские сертификаты и ключ в

~/.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/

1 голос
/ 01 июня 2019

Эти две переменные среды, о которых вы упомянули, предназначены для инструмента командной строки docker, чтобы общаться с демоном Docker. Вам обычно не нужно устанавливать их. (Также обратите внимание, что порт 2376 является обычным портом для HTTP-over-TLS API Docker, хотя ничто не мешает использовать его вместо реестра.)

Вы пытаетесь настроить демон Docker для взаимодействия с удаленным реестром, которому вы доверяете. Ссылка dockerd говорит о безопасных реестрах :

Безопасный реестр использует TLS, а копия его сертификата CA помещается на хост Docker по адресу /etc/docker/certs.d/myregistry:5000/ca.crt.

Итак, в вашей настройке вам нужно найти сертификат CA для вашего реестра и поместить его в /etc/docker/certs.d/192.168.64.3:2376/ca.crt, а затем перезапустить демон Docker.

Это также описано в документации OpenShift OKD в разделе Защита и раскрытие реестра (см. «Защита реестра вручную» и, в частности, его действиях 12 и 13).

0 голосов
/ 02 июня 2019

Клиент 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 нам необходимо выполнить эту часть документации Docker и установить сертификат 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

Наконец, перезапустите Docker для Mac, а затем нажмите.

...