Как получить удаленный доступ к частному docker-реестру?


Я пытаюсь настроить частный реестр докеров, используя образ, взятый из: https://github.com/docker/docker-registry

просто работает:
docker run -p 5000:5000 registry

Я могу тянуть/толкать из / в этот репозиторий только с localhost, но если я попытаюсь получить к нему доступ с другой машины (используя частный адрес в той же локальной сети), он завершится с сообщением об ошибке:

*2014/11/03 09:49:04 Error: Invalid registry endpoint https ://10.0.0.26:5000/v1/': 
Get https:// 10.0.0.26:5000/v1/_ping: Forbidden. If this private 
registry supports only HTTP or HTTPS with an unknown CA certificate,
please add `--insecure-registry 10.0.0.26:5000` to the daemon's 
arguments. In the case of HTTPS, if you have access to the registry's
CA certificate, no need for the flag; simply place the CA certificate 
at /etc/docker/certs.d/10.0.0.26:5000/ca.crt*

что сводит меня с ума, так это то, что я могу успешно получить к нему доступ с помощью: curl 10.0.0.26:5000 и/или curl 10.0.0.26:5000/v1/search

Я также не понимаю, где и как я должен пройти --insecure-registry флаг.

16 78

16 ответов:

ОК-я нашел решение этой проблемы-после дня копания.

для докера ниже 1.12.1:

получается, что новая версия клиента отказывается работать с приватным реестром без SSL.

чтобы исправить это-демон на клиентской машине должен быть запущен с небезопасным флагом:

просто типа:

sudo service docker stop # to stop the service

а то

sudo docker -d --insecure-registry 10.0.0.26:5000

(заменить 10.0.0.26 С вашим собственным ip адрес.)

Я ожидал бы, что ребята из docker добавят эту опцию в командную строку pull/push...

Edit-altenantively-вы можете добавить флаг в DOCKER_OPTS env переменная внутри /etc/default / docker... а потом sudo service docker restart

редактировать снова-кажется, что докер ребята на нем - и исправление придет в ближайшее время: https://github.com/docker/docker/pull/8935

для настройки 1.12.1:

пожалуйста, следуйте ниже ответ vikas027 (действителен для centos)

Это то, что сработало для меня на CentOS 7.2 и настройки 1.12.1 (последний на дату). Мой личный реестр v2 работал на 192.168.1.88:5000 измените его соответствующим образом. Это также работает, если у вас есть несколько реестров, просто продолжайте добавлять --insecure-registry IP:Port

$ sudo vim /usr/lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd 
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.88:5000
$
$ sudo systemctl stop docker
$ sudo systemctl daemon-reload
$ systemctl start docker

редактировать конфигурационный файл "/etc / default/docker"

sudo vi / etc / default / docker

добавить строку в конец файла

DOCKER_OPTS= "$DOCKER_OPTS --insecure-registry=192.168.2.170: 5000"

(замените 192.168.2.170 на свой собственный ip-адрес)

настройки и перезапустить службу!--1-->

sudo service docker restart

ОК. Вот как я заставил его работать. Если вы видите эту ошибку в docker 1.3.2 или выше, сделайте это

на /etc/sysconfig/docker

other_args="--insecure-registry 10.0.0.26:5000"

и работать

sudo service docker restart

Я нашел следующее очень полезным, поскольку он обсуждает, как настроен сам сервис Docker. https://docs.docker.com/articles/systemd/

вместе с этой статьей о команде systemctl https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units

я использовал следующую серию команд в контейнере на основе Centos 7 с изображением реестра, полученным с помощью " docker pull реестра:2.1.1"

sudo mkdir -p /etc/systemd/system/docker.service.d
cd /etc/systemd/system/docker.service.d
sudo touch override.conf
sudo nano override.conf

и внутри переопределить.конф добавил следующее.

[Service]
ExecStart=
ExecStart=/usr/bin/docker -d -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry 10.2.3.4:5000

обратите внимание, что первый, пустой, ExecStart= очищает все, что уже есть, поэтому не забудьте добавить что-нибудь из /usr/lib/systemd/system/docker.service ExecStart= оператор, который вы хотите сохранить.

Если вы не укажете опцию-D(демон), вы получите ошибку "укажите только один-H".

после выполнения следующей серии команд я могу смотрите мои переопределения на месте.

sudo systemctl stop docker
sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl status docker

docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
  Drop-In: /etc/systemd/system/docker.service.d
           └─override.conf
   Active: active (running) since Thu 2015-09-17 13:37:34 AEST; 7s ago
     Docs: https://docs.docker.com
 Main PID: 5697 (docker)
   CGroup: /system.slice/docker.service
           └─5697 /usr/bin/docker -d -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry 10.2.3.4:5000

Примечание: информация, предоставленная Loaded: и Drop-In: строки в сообщении о состоянии, полезны для проверки того, что происходит с уже существующим демоном docker для работы.

Примечание: Также посмотрите в Loaded: docker.служебный файл для EnvironmentFile= для дальнейших подсказок.

используйте следующую команду, заменив {YOUR_REGISTRY} вашим реестром

boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry {YOUR_REGISTRY}\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart"

изменить настройки.служебный Файл, Добавить --insecure-registry x.x.x. x после-D флаг, перезапустить docker

Это единственное, что сработало для меня, DOCKER_OPTS не имел никакого эффекта

настройки 1.12.1

на CentOS 7.2

/usr/lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd
ExecStart=/usr/bin/dockerd --insecure-registry my-docker-registry.com:5000

на ubuntu 16.04

/lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd -H fd://
ExecStart=/usr/bin/dockerd --insecure-registry my-docker-registry.com:5000 -H fd://

sudo systemctl stop docker
sudo systemctl daemon-reload
sudo systemctl start docker

Кажется, параметр --insecure-registry может использоваться как с"=", так и без него и идентификатором реестра.

Я обнаружил, что версия клиента docker и версия реестра docker должны совпадать, иначе вы столкнетесь с проблемами подключения, несмотря на то, что все на месте.

это основано на ответе от vikas027 на Centos 7 и Docker 1.12

Так как я нахожусь за прокси-мое полное решение ...

/ etc/systemd/system / docker.услуга.d / http-прокси.conf

[Service]

Environment="FTP_PROXY={{MY_PROXY}}"
Environment="ftp_proxy={{MY_PROXY}}"

Environment="HTTPS_PROXY={{MY_PROXY}}"
Environment="https_proxy={{MY_PROXY}}"

Environment="HTTP_PROXY={{MY_PROXY}}"
Environment="http_proxy={{MY_PROXY}}"

Environment="NO_PROXY=localhost,127.0.0.1,{{MY_INSECURE_REGISTRY_IP}}"
Environment="no_proxy=localhost,127.0.0.1,{{MY_INSECURE_REGISTRY_IP}}"

/usr/lib/systemd/system / docker.сервис

ExecStart=/usr/bin/dockerd --insecure-registry {{MY_INSECURE_REGISTRY_IP}}:5000

и не забудьте перезагрузить :)

sudo systemctl daemon-reload; sudo systemctl restart docker;

установка локального небезопасного реестра в docker вместе с прокси:

1) в ubuntu добавьте следующий флаг --insecure-registry IP:порт под DOCKER_OPTS в файле /etc/default/docker

1.1) настройте переменную no_proxy env для обхода локального IP / hostname / domainname...как прокси может бросить интерактивный msg ...как продолжить и это промежуточное сообщение смущает клиента docker и, наконец, тайм-аут...

1.2) если домен настроен...тогда не забудьте обновите файл/etc / hosts, если не используете DNS.

1.3) в /etc / default / docker установите переменные env http_proxy и https_proxy...as это позволяет загружать изображения из внешних центров компании. формат при=http://username:password@proxy:port

2) перезапустите службу docker...если он установлен как служба, используйте sudo service docker restart

3) перезапустите контейнер реестра [sudo docker run-p 5000: 5000 registry:2]

4) тег необходимое изображение с помощью тега sudo docker imageid IP: port / imagename/tagname ifany

5) нажмите на изображение ...sudo docker push ip: port / imagename

6) Если вы хотите вытащить изображение с другой машины,скажем B без TLS/SSL, то в Б применяются setps 1,1.1 и 2. Если эти изменения не сделали в машине Б...тянуть не получится.

чтобы сэкономить вам хлопот, почему бы вам просто не использовать бесплатный частный docker registry service, предоставляемый gitlab-отлично работает

https://about.gitlab.com/2016/05/23/gitlab-container-registry/

их реестра является безопасным, так что вы не будете иметь никаких проблем

Ubuntu 16.04

создать (не существует) файл /etc/systemd/system/docker.service.d/registry.conf содержание:

[Service]
#You need the below or you 'ExecStart=' or you will get and error 'Service has more than one ExecStart= setting, which is only allowed'
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 10.20.30.40:5000

затем

sudo systemctl stop docker
sudo systemctl daemon-reload
sudo systemctl start docker

было протестировано следующее:

ubuntu@ubuntu-xenial:~$ docker -v
Docker version 17.05.0-ce, build 89658be

я попробовал все вышеупомянутые ответы, но ни один из них не работал для меня.

я эти инструкции чтобы заставить его работать

openssl req \
  -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
  -x509 -days 365 -out certs/domain.crt

и

Linux: Copy the domain.crt file to
/etc/docker/certs.d/myregistrydomain.com:5000/ca.crt on every Docker
host. You do not need to restart Docker.

и другие проблемы, которые были решены следующим образом:

вопрос 1

Error response from daemon: Get https://10.20.30.40:8001/v1/users/: x509: cannot validate certificate for 10.20.30.40 because it doesn't contain any IP SANs

решение

отображение хоста в /etc/hosts на:

10.20.30.40 somehost

Вопрос 2

Error response from daemon: Get https://somehost:8001/v1/users/: x509: certificate is valid for , not somehost

решение

повторите команду openssl

$ openssl req \
  -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
  -x509 -days 365 -out certs/domain.crt

нажмите enter на каждом шаге, кроме:

Common Name (e.g. server FQDN or YOUR name) []:

и введите полное доменное имя в реестре, т. е. somehost

будьте уверены, чтобы использовать myregistrydomain.com имя как Спицы.

вход в реестр завершен успешно

Вопрос 3

ответ на ошибку от демона: Get https://somehost:8001/v1/users/: x509: сертификат, подписанный неизвестным органом

решение

sudo mkdir -p /etc/docker/certs.d/somehost:8001/
sudo cp certs/domain.crt /etc/docker/certs.d/somehost:8001/ca.crt

в дополнение к приведенным выше ответам, я добавляю то, что работало в "docker для mac" для меня:

  1. нажмите на кнопку настройки кит значок из лотка mac в правом верхнем углу экрана.
  2. нажать на кнопку Настройки -> Демон.
  3. добавьте свой IP и порт в небезопасные реестры.
  4. перезапуск демона.

enter image description here

двухэтапное решение (без --insecure-registry):

  1. скачать открытый ключ из реестра
  2. положите его в /etc/docker/certs.d/$HOSTNAME/ каталог

mkdir -p /etc/docker/certs.d/10.0.0.26:5000
echo -n | openssl s_client -connect 10.0.0.26:5000 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/docker/certs.d/10.0.0.26:5000/registry.crt

Теперь ваш докер будет доверять вашему самозаверяющему сертификату.