Ответ 1
Отредактируйте файл докеров
sudo vim /etc/default/docker
Добавьте DOCKER_OPTS
DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=www.example.com:8080"
Перезапуск службы докеров
sudo service docker restart
Я размещаю свой собственный док-реестр в контейнере докеров. Он запускается nginx, работающим в отдельном контейнере, чтобы добавить базовый auth. Проверяя маршруты _ping, я вижу, что nginx маршрутизируется соответствующим образом. При вызове docker login
из boot2docker (на Mac OSX) я получаю эту ошибку:
FATA[0003] Error response from daemon: Invalid registry endpoint https://www.example.com:8080/v1/:
Get https://www.example.com:8080/v1/_ping: x509: certificate signed by unknown authority. If this
private registry supports only HTTP or HTTPS with an unknown CA certificate, please add
`--insecure-registry www.example.com:8080` to the daemon arguments. In the case of HTTPS,
if you have access to the registry CA certificate, no need for the flag; simply place the CA
certificate at /etc/docker/certs.d/www.example.com:8080/ca.crt
Это нечетно - потому что это действительный сертификат CA SSL. Я попытался добавить в EXTRA-ARGS -insecure-реестр в соответствии с этими инструкциями: https://github.com/boot2docker/boot2docker#insecure-registry, но изначально файл 'profile' t это его. Если я создам его и добавлю
EXTRA_ARGS="--insecure-registry www.example.com:8080"
Я не вижу улучшения. Я хотел изолировать пример и поэтому попробовал docker login
с виртуальной машины ubuntu (а не boot2docker). Теперь я получаю другую ошибку:
Error response from daemon:
Реестр докеров запускается непосредственно из общего концентратора, например.
docker run -d -p реестр 5000: 5000
(Обратите внимание, что nginx маршрутизирует от 8080 до 5000). Любая помощь и/или ресурсы, которые помогут отладить это, будут высоко оценены.
UPDATE
Я искал руководство, чтобы помочь решить эту проблему. В частности:
Я создал реестр и протестировал локально, он работает. Я получил реестр с добавлением nginx базового auth.
В настоящее время проблема заключается в использовании реестра из двух типов клиентов:
1) Клиент без boot2docker. Один из ответов ниже помог с этим. Я добавил флаг --insecure-registry в параметры /etc/default/docker, и теперь я могу поговорить с моим реестром удаленных докеров. Однако это несовместимо с auth, поскольку вход в docker получает ошибку:
2015/01/15 21:33:57 HTTP code 401, Docker will not send auth headers over HTTP.
Итак, если я хочу использовать auth, мне нужно будет использовать HTTPS. У меня уже есть этот сервер, обслуживающий HTTPS, но это не работает, если я установил --insecure-registry. Кажется, что проблема доверия сертификатов, которую я уверен, я могу решить на не-boot2docker, но..
2) Для клиента boot2docker я не могу получить --insecure-registry для работы или сертификаты, которым нужно доверять?
ОБНОВЛЕНИЕ 2
Следуя этому обмену стек, мне удалось добавить ca к моей ubuntu VM, и теперь я могу использовать его от клиента non boot2docker. Тем не менее, все еще много странного поведения.
Несмотря на то, что мой текущий пользователь является членом группы докеров (поэтому мне не нужно использовать sudo), теперь мне нужно использовать sudo или я получаю следующую ошибку при попытке войти или вытащить из своего частного реестра
[email protected]:~$ docker login example.com:8080
WARNING: open /home/parallels/.dockercfg: permission denied
[email protected]:~$ docker pull example.com:8080/hw:1
WARNING: open /home/parallels/.dockercfg: permission denied
И при запуске контейнеров, впервые извлеченных из моего личного реестра, я должен указать их по идентификатору изображения, а не по имени.
Отредактируйте файл докеров
sudo vim /etc/default/docker
Добавьте DOCKER_OPTS
DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=www.example.com:8080"
Перезапуск службы докеров
sudo service docker restart
Выполните следующую команду:
boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry <YOUR INSECURE HOST>\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart"
Версия для докеров > 1.3.1 обменивается данными по HTTPS по умолчанию при подключении к реестру докеров
Если вы используете Nginx для proxy_pass до порта 5000, где прослушивается реестр докеров, вам нужно будет отключить SSL-соединение докере клиента с реестром докеров в webserver/LB (в этом случае Nginx). Чтобы убедиться, что Nginx завершает SSL-соединение, используйте cURL https://www.example.com:8081/something, где 8081 - это еще один порт, настроенный для проверки SSL-сертификата.
Если вам все равно, подключен ли ваш docker-клиент к реестру через HTTP, а не HTTPS, добавьте
ОПЦИИ = "- insecure-registry www.example.com:8080"
в/etc/sysconfig/docker (или эквивалент в других дистрибутивах) и перезапустите службу докеров.
Надеюсь, что это поможет.
В версии Docker версии 1.3.1, если ваш реестр не поддерживает HTTPS, вы должны добавить его как небезопасный реестр. Для boot2docker это немного сложнее, чем обычно. См.: https://github.com/boot2docker/boot2docker#insecure-registry
Соответствующие команды:
$ boot2docker init
$ boot2docker up
$ boot2docker ssh
$ echo 'EXTRA_ARGS="--insecure-registry <YOUR INSECURE HOST>"' | sudo tee -a /var/lib/boot2docker/profile
$ sudo /etc/init.d/docker restart
Если вы хотите добавить сертификаты SSL в экземпляр boot2docker, это будет нечто похожее (boot2docker ssh, за которым следует sudo).
Для ubuntu, пожалуйста, измените файл /etc/default/docker
DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=10.27.19.230:5000"
Для rehl, пожалуйста, измените файл /etc/sysconfig/docker
other_args="--insecure-registry 10.27.19.230:5000"
Зарегистрируйте ключ SSL из https://letsencrypt.org/ Если вам нужно больше инструкций, обратитесь эта ссылка.
Включить SSL для nginx. Внимание к части SSL в приведенном ниже коде, после регистрации ключа SSL, у вас есть fullchain.pem
, privkey.pem
, dhparam.pem
, используя его для nginx для включения SSL.
`
server {
listen 443;
server_name docker.mydomain.com;
# SSL
ssl on;
ssl_certificate /etc/nginx/conf.d/fullchain.pem;
ssl_certificate_key /etc/nginx/conf.d/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/conf.d/dhparam.pem;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
# disable any limits to avoid HTTP 413 for large image uploads
client_max_body_size 0;
# required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)
chunked_transfer_encoding on;
location /v2/ {
# Do not allow connections from docker 1.5 and earlier
# docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents
if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
return 404;
}
# To add basic authentication to v2 use auth_basic setting plus add_header
auth_basic "registry.localhost";
auth_basic_user_file /etc/nginx/conf.d/registry.password;
add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always;
proxy_pass http://docker-registry;
proxy_set_header Host $http_host; # required for docker client sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;
}
}
Он решает мою проблему, надеется, что это поможет вам.
Попробуйте запустить демон с помощью args:
docker -d --insecure-registry="www.example.com:8080"
вместо установки EXTRA_ARGS