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

82

Я пытаюсь настроить частный реестр докеров, используя образ, взятый из: 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флаг.

Офер Элиассаф
источник
3
многие ответы кажутся устаревшими для докера 1.12, но см. ответ vikas027, который отлично подходит для докера 1.12 (последний ATOW)
danday74
1
В Ubuntu документация Docker и этот ответ мне понравились.
Batandwa

Ответы:

73

ОК - я нашел решение этого - после дня копания.

Для докеров ниже 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-адрес).

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

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

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

Для докера 1.12.1:

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

Офер Элиассаф
источник
Мне удалось воспроизвести ваши шаги и отправить их в частный реестр на удаленном хосте. Он также показал успешный толчок. Однако как мне внести изображения в частный реестр? Я пробовал, docker -H tcp://remote-host-ip:5000 imagesно вернулся с ошибкой.
Howard Lee
Я могу убедиться, что это происходит. Это также происходит, когда вы запрашиваете <ip>: 5000 / v1 / search - вы получаете пустой ответ. Наверное, другая ошибка, которая у них есть :-(
Ofer Eliassaf
Обновление: я смог искать / извлекать изображения, хранящиеся в удаленном частном реестре. docker search remote-host-ip:5000/image-nameи docker pull remote-host-ip:5000/image-nameоба работают нормально. Теперь, как мне получить список изображений ...
Говард Ли
3
@ashleyaitken, я использовал следующую ссылку, чтобы помочь мне решить проблему с помощью Boot2Docker: github.com/boot2docker/boot2docker#insecure-registry . Надеюсь, это поможет.
Patelify
1
--insecure-registryэто обходной путь, а не исправление.
Питер - Восстановить Монику
28

Это то, что у меня сработало в CentOS 7.2 и Docker 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
vikas027
источник
1
Это решение было единственным, которое у меня сработало на Ubuntu.
JARC 05
1
Спасибо, чувак, отлично поработал - добавил основанный на этом более полный ответ для тех, кто стоит за корпоративным прокси
danday74
2
Работал для меня, но docker.service был в /lib/systemd/system/docker.serviceUbuntu 16.04.
Карим Табет
4
--insecure-registryэто обходной путь, а не исправление.
Питер - Восстановить Монику
1
Работа. Или вам придется взломать всю вашу систему (еще одна похожая «особенность» заключается в том, что «мостовая сеть» означает на самом деле сеть NAT в докере, в то время как настоящая мостовая сеть просто не существует). Эти ответы популяризируют ужасные обходные пути основных проблем, которые можно легко исправить, но почему-то это не так. Это была причина, по которой я проголосовал против всех из них - все они плохие решения.
Питер - Восстановить Монику
24

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

Судо vi / и т. д. / по умолчанию / докер

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

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

(замените 192.168.2.170 своим IP-адресом)

и перезапустите службу докеров

перезапуск докера службы sudo

Даочжао
источник
Благодаря! Как /etc/init.d/dockerни удивительно, простое редактирование не работает в Ubuntu 14.04. Но ваше исправление для /etc/default/dockerделает.
elimisteve
моя хост-система тоже Ubuntu 14.04
daozhao
1
--insecure-registryэто обходной путь, а не исправление.
Питер - Восстановить Монику
12

Я нашел следующее очень полезным, поскольку в нем обсуждается, как настроена сама служба 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 registry: 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

А внутри 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: в сообщении о состоянии, полезна для проверки того, что происходит с уже существующим демоном докеров для работы.

ПРИМЕЧАНИЕ. Также посмотрите в файле Loaded: docker.service EnvironmentFile = для дальнейших подсказок.

TJA
источник
2
--insecure-registryэто обходной путь, а не исправление.
Питер - Восстановить Монику
Привет @peterh, я понимаю, что это обходной путь, и он небезопасен. Я не сомневаюсь, что существуют производственные системы, использующие его, что действительно очень плохо.
ТС
1
@peterh, не могли бы вы указать мне на любые ссылки, которые показывают, как это сделать правильно, и я обновлю свой ответ и буду ссылаться на ссылку.
ТС
11

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

идти к /etc/sysconfig/docker

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

и беги

sudo service docker restart

Джей
источник
1
вы должны поставить '=', чтобы повлиять на значение реестра в ubuntu: «- insecure-registry = 10.0.0.26: 5000»
Romain Jouin
@ Джей, я новичок. 1.3.2 звучит как будущая версия докера. Я вижу, что текущая версия - 1.12 github.com/docker/docker/releases, если я не ошибаюсь.
ravindrab
1
@ravindrab в какой вселенной 12 меньше 3? ;)
ferrari2k 01
2
--insecure-registryэто обходной путь, а не исправление.
Питер - Восстановить Монику
9

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

boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry {YOUR_REGISTRY}\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart"
JaTo
источник
boot2dockerэто независимый набор инструментов, не имеющий отношения к контексту вопроса.
Арно Море 08
2
--insecure-registryэто обходной путь, а не исправление.
Питер - Восстановить Монику
7

отредактируйте файл docker.service, добавьте --insecure-registry xxxx после флага -d, перезапустите докер

это единственное, что у меня сработало, DOCKER_OPTS не повлиял

Диман
источник
все, что вы говорите, правда, но детали настолько скудны, что ответ почти бесполезен
danday74 06
2
--insecure-registryэто обходной путь, а не исправление.
Питер - Восстановить Монику
4

Докер 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 может использоваться как с «=» между ним и идентификатором реестра, так и без него.

занудный
источник
2
--insecure-registryэто обходной путь, а не исправление.
Питер - Восстановить Монику
2

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

Сайкришна Рао
источник
2

Двухэтапное решение (без --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

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

vp_arth
источник
1

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

Поскольку я нахожусь за прокси, мое полное решение было ...

/etc/systemd/system/docker.service.d/http-proxy.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.service

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

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

sudo systemctl daemon-reload; sudo systemctl restart docker;
danday74
источник
1
--insecure-registryэто обходной путь, а не исправление.
Питер - Восстановить Монику
0

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

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

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

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

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

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

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

4) пометьте требуемый образ, используя sudo docker tag imageid IP: port / imagename / tagname ifany

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

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

Рагха
источник
2
--insecure-registryэто обходной путь, а не исправление.
Питер - Восстановить Монику
0

Чтобы избавить вас от хлопот, почему бы вам просто не использовать БЕСПЛАТНУЮ частную службу реестра докеров, предоставляемую gitlab - отлично работает

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

Их реестр безопасен, поэтому у вас не будет никаких проблем.

danday74
источник
0

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
danday74
источник
0

В дополнение к приведенным выше ответам я добавляю то, что у меня работало в «докере для Mac»:

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

введите описание изображения здесь

Парантап Шарма
источник