Как получить удаленный доступ к частному 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 ответов:
ОК-я нашел решение этой проблемы-после дня копания.
для докера ниже 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
двухэтапное решение (без
--insecure-registry
):
- скачать открытый ключ из реестра
- положите его в
/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
Теперь ваш докер будет доверять вашему самозаверяющему сертификату.