Как получить удаленный доступ к частному реестру докеров?
Я пытаюсь настроить частный реестр докеров, используя изображение, взятое из:
https://github.com/docker/docker-registry
Просто запустив:
docker run -p 5000:5000 registry
Я могу вытащить/нажать из/в этот репозиторий только с локального хоста, но если я попытаюсь получить доступ к нему с другого компьютера (используя частный адрес в той же локальной сети), он выдает сообщение об ошибке:
*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
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
.
Ответы
Ответ 1
ОК - я нашел решение этого - после дня копания.
Для докеров ниже 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...
Изменить - altenantively - вы можете добавить флаг в переменную DOCKER_OPTS
env внутри /etc/default/docker...
и затем sudo service docker restart
Изменить снова. Кажется, что ребята-докеры на нем - и скоро исправит:
https://github.com/docker/docker/pull/8935
Для докера 1.12.1:
Пожалуйста, следуйте ниже ответа vikas027 (действительный для centos)
Ответ 2
Отредактируйте файл конфигурации "/etc/default/docker"
sudo vi/etc/default/docker
добавить строку в конец файла
DOCKER_OPTS = "$ DOCKER_OPTS --insecure-registry = 192.168.2.170: 5000"
(замените 192.168.2.170 на свой собственный IP-адрес)
и перезапустите службу докеров
перезагрузка службы sudo docker
Ответ 3
Это то, что сработало для меня в 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
Ответ 4
Ok. Вот как я получил его на работу. Если вы видите эту ошибку в докере 1.3.2 или выше, сделайте это
перейти к /etc/sysconfig/docker
other_args="--insecure-registry 10.0.0.26:5000"
и запустите
sudo service docker restart
Ответ 5
Я нашел следующее очень полезным, поскольку он обсуждает, как настроена служба 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 с результирующим изображением, полученным с помощью "реестра докеры: 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 (daemon), вы получите сообщение "Пожалуйста, укажите только одну -Н".
После выполнения следующей серии команд я могу видеть мои переопределения на месте.
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 = для дальнейших подсказок.
Ответ 6
используйте следующую команду, заменяющую {YOUR_REGISTRY} в вашем реестре
boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry {YOUR_REGISTRY}\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart"
Ответ 7
изменить файл docker.service, добавить --insecure-registry x.x.x.x после -d флаг, перезагрузить docker
это единственное, что сработало для меня, DOCKER_OPTS не имеет никакого эффекта
Ответ 8
Докер 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 может использоваться как с идентификатором, так и без него и с идентификатором реестра.
Ответ 9
Я обнаружил, что версия клиентского докере и версия докеры реестра должны совпадать, иначе вы столкнулись бы с проблемами подключения, несмотря на то, что все на месте.
Ответ 10
Это основано на ответе от 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;
Ответ 11
Настройка локального небезопасного реестра в докере вместе с прокси:
1) в ubuntu добавьте следующий флаг --insecure-registry IP: порт под DOCKER_OPTS в файле /etc/default/docker
1.1) настройте переменную no_proxy env для обхода локального IP/hostname/domainname... поскольку прокси может вызывать интерактивный msg... как продолжение
и этот промежуточный msg смущает клиента докеров и, наконец, timeout...
1.2), если доменное имя настроено... тогда не забудьте обновить файл /etc/hosts, если не используете DNS.
1.3) в /etc/default/docker устанавливают переменные env http_proxy и https_proxy..., поскольку он позволяет загружать изображения из внешних концентраторов компании. format http_proxy = http://username:[email protected]:port
2) перезапустите службу докеров... если она установлена как служба, перезапустите перезагрузку службы sudo
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) Если u хочет вытащить изображение с другого компьютера, скажите B без TLS/SSL, тогда в B применяют сетки 1,1,1 и 2. Если эти изменения не выполняются в машине B... pull не удастся.
Ответ 12
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
Ответ 13
Следующее тестирование было выполнено с помощью
[email protected]:~$ 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) []:
и введите fqdn реестра, т.е. somehost
Обязательно используйте имя myregistrydomain.com как CN.
регистрация в реестре завершается успешно
Проблема 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
Ответ 14
В дополнение к приведенным выше ответам я добавляю то, что работало в "докере для mac" для меня:
- Нажмите значок значок док-кита из основного лотка в верхнем правом углу экрана.
- Нажмите Настройки → Демон.
- Добавьте IP-адрес и порт в небезопасные реестры.
- Перезапустите Daemon.
![введите описание изображения здесь]()
Ответ 15
Чтобы избавить вас от хлопот, почему бы вам просто не воспользоваться бесплатной частной службой регистрации докеров, предоставляемой gitlab - отлично работает
https://about.gitlab.com/2016/05/23/gitlab-container-registry/
Их реестр защищен, поэтому у вас не будет проблем.