Як отримати віддалений доступ до приватного докер-реєстру?


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
багато відповідей застаріли для docker 1.12, але див. відповідь vikas027, яка чудово підходить для docker 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 (дійсно для центів)


Я зміг відтворити ваші кроки та перемістився до приватного реєстру на віддаленому хості. Це також показало успішний поштовх. Однак як я можу перерахувати зображення в приватному реєстрі? Я спробував, docker -H tcp://remote-host-ip:5000 imagesале повернувся з помилкою.
Говард Лі

Я можу перевірити, що це відбувається. Це також трапляється, коли ви quey <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 . Сподіваюся, що це допомагає.
Пателіфікувати

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

1
Це рішення було єдиним, яке працювало для мене в Ubuntu.
JARC

1
Дякую, чудово - працював чудово - додав повнішу відповідь на основі цього для тих, хто стоїть за корпоративним проксі
danday74

2
Працював у мене, але docker.service працював /lib/systemd/system/docker.serviceна Ubuntu 16.04.
Карім Табет

4
--insecure-registryце обхідний шлях, а не виправлення.
Петер

1
робота. Або вам доведеться зламати всю вашу систему (ще одна подібна "особливість" полягає в тому, що "мостова мережа" означає насправді мережу NAT в Docker, тоді як реальна мостова мережа просто не існує). Ці відповіді популяризують жахливі способи вирішення основних проблем, які легко можна виправити, але якимось чином це не так. Це було причиною, чому я підтримав усіх - усі вони є поганими рішеннями.
Петер

24

Відредагуйте конфігураційний файл "/ 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 service docker перезапустити


Дякую! /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 = для подальших підказок.


2
--insecure-registryце обхідний шлях, а не виправлення.
Петер

Привіт @peterh Я розумію, що це обхідний шлях, і небезпечний. Я не сумніваюся, що там існують виробничі системи, які використовують це, що насправді дуже погано.
TJA

1
@peterh, будь ласка, вкажіть мені будь-які посилання, які показують, як це правильно робити, і я оновлю відповідь та посилаюся на посилання.
TJA

11

Гаразд. Ось як я змусив це працювати. Якщо ви бачите цю помилку в docker 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"
Ромен Жуен,

@Jay, я нуб. 1.3.2 звучить як майбутня версія docker. Я бачу, що поточна версія - 1.12 github.com/docker/docker/releases, якщо я тут не помиляюся.
ravindrab

1
@ravindrab в якому Всесвіті на 12 менше 3? ;)
ferrari2k

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"

boot2docker- це незалежний набір інструментів, який не відповідає контексту питання.
Arnaud Meuret

2
--insecure-registryце обхідний шлях, а не виправлення.
Петер

7

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

це єдине, що у мене спрацювало, DOCKER_OPTS не дало жодного ефекту


все, що ви говорите, є правдою, але деталі настільки мізерні, що відповідь майже марна
danday74

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

Я виявив, що версія клієнта docker та версія docker реєстру повинні збігатися, інакше ви зіткнетеся з проблемами підключення, незважаючи на те, що все на місці.


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

Тепер ваш докер буде довіряти вашому самопідписаному сертифікату.


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;

1
--insecure-registryце обхідний шлях, а не виправлення.
Петер

0

Встановлення локального незахищеного реєстру в Docker разом із проксі:

1) в ubuntu додайте такий прапор - IP-адрес захищеного реєстру: порт під DOCKER_OPTS у файлі / etc / default / docker

1.1) налаштуйте no_proxy env змінну, щоб обійти локальний IP / ім'я хосту / ім'я домену ... оскільки проксі-сервер може викидати інтерактивну повідомку ... типу continue, а ця проміжна повідомлення заплутує клієнта докера і врешті-решт тайм-аут ...

1.2) якщо ім'я домену налаштовано ... то не забудьте оновити файл / etc / hosts, якщо не використовуєте DNS.

1.3) у / etc / default / docker встановлює змінні env http_proxy та https_proxy ..., оскільки це дозволяє завантажувати зображення із зовнішніх центрів компанії. формат http_proxy = http: // ім'я користувача: пароль @ proxy: порт

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

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

4) позначте потрібне зображення за допомогою тегу sudo docker imageid IP: порт / ім'я зображення / ім'я тегу ifany

5) натисніть зображення ... sudo docker push ip: порт / ім'я зображення

6) Якщо ви хочете витягнути зображення з іншої машини, скажіть B без TLS / SSL, тоді в B застосуйте налаштування 1,1.1 і 2. Якщо ці зміни не зроблені в машині B ... тягнути не вдасться.


2
--insecure-registryце обхідний шлях, а не виправлення.
Петер


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

0

На додаток до наведених вище відповідей, я додаю те, що для мене працювало в "docker for mac":

  1. Клацніть на піктограму докера з лотка Mac у верхньому правому куті екрана.
  2. Натисніть Налаштування -> Демон .
  3. Додайте свій IP і порт до незахищених реєстрів.
  4. Перезапустіть Daemon.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.