Использование частного реестра, размещенного на докере

Я размещаю свой собственный докер-реестр в докер-контейнере. На него работает nginx, работающий в отдельном контейнере, чтобы добавить базовую аутентификацию. Проверяя маршруты _ping, я вижу, что nginx правильно выполняет маршрутизацию. При вызове docker login из boot2docker (в Mac OSX) я получаю такую ​​ошибку:

FATA [0003] Ошибка, ответ от демона: недопустимая конечная точка реестра https://www.example.com:8080/v1/: получить https://www.example.com:8080/v1/_ping: x509: сертификат, подписанный неизвестным органом. Если этот частный реестр поддерживает только HTTP или HTTPS с неизвестным сертификатом CA, добавьте --insecure-registry www.example.com:8080 к аргументам демона. В случае HTTPS, если у вас есть доступ к сертификату CA реестра, флаг не нужен; просто поместите сертификат CA по адресу /etc/docker/certs.d/www.example.com:8080/ca.crt

Что странно, потому что это действующий сертификат CA SSL. Я пробовал добавить --insecure-registry в EXTRA-ARGS согласно этим инструкциям: https://github.com/boot2docker/boot2docker#insecure-registry, но изначально файл «профиля» не существует. Если я его создам и добавлю

EXTRA_ARGS="--insecure-registry www.example.com:8080"

Я не вижу улучшений. Я хотел изолировать пример и поэтому попробовал docker login с виртуальной машины ubuntu (не boot2docker). Теперь у меня другая ошибка:

Error response from daemon: 

Реестр докеров запускается непосредственно из общедоступного хаба, например

docker run -d -p 5000:5000 registry

(Обратите внимание, что nginx маршрутизирует с 8080 на 5000). Любая помощь и / или ресурсы, помогающие отладить это, были бы очень признательны.

ОБНОВЛЕНИЕ

Я искал руководство, которое поможет комплексно решить эту проблему. Конкретно:

  • Создать частный реестр
  • Защитите реестр с помощью базовой аутентификации
  • Используйте реестр из boot2docker

Я создал реестр и протестировал локально, он работает. Я защитил реестр с помощью nginx, добавив базовую аутентификацию.

Проблема в том, что теперь реестр используется двумя типами клиентов:

1) Клиент, отличный от boot2docker. Один из ответов ниже помог в этом. Я добавил флаг --insecure-registry к параметрам в / etc / default / docker, и теперь я могу разговаривать с моим удаленным реестром докеров. Однако это несовместимо с аутентификацией, поскольку при входе в докер возникает ошибка:

2015/01/15 21:33:57 HTTP code 401, Docker will not send auth headers over HTTP.

Итак, если я хочу использовать аутентификацию, мне нужно будет использовать HTTPS. У меня уже есть этот сервер, обслуживающий HTTPS, но это не сработает, если я установлю --insecure-registry. Похоже, есть проблема с доверием к сертификату, которую я уверен, что смогу решить на не-boot2docker, но ...

2) Для клиента boot2docker я не могу заставить работать --insecure-registry или доверять сертификатам?

ОБНОВЛЕНИЕ 2

После этого вопроса обмена стеками I удалось добавить CA в мою виртуальную машину ubuntu, и теперь я могу использовать его из клиента, отличного от boot2docker. Тем не менее, есть еще много странного поведения.

Несмотря на то, что мой текущий пользователь является членом группы докеров (поэтому мне не нужно использовать sudo), мне теперь нужно использовать sudo, иначе я получаю следующую ошибку при попытке войти или вытащить из моего личного реестра

user@ubuntu:~$ docker login example.com:8080
WARNING: open /home/parallels/.dockercfg: permission denied

parallels@ubuntu:~$ docker pull example.com:8080/hw:1
WARNING: open /home/parallels/.dockercfg: permission denied

И при первом запуске контейнеров, извлеченных из моего личного реестра, я должен указывать их по идентификатору изображения, а не по имени.


person ConfusedNoob    schedule 06.01.2015    source источник
comment
вы перезапустили демон докера? вы можете попробовать github.com/larrycai/nginx-registry. может показывать больше логов из boot2docker /var/lib/boot2docker/docker.log   -  person Larry Cai    schedule 08.01.2015
comment
Да, перезапускался много раз. Пробовал на разных системах, много. В логах ничего интересного. Обратите внимание, что это не работает и с экземпляром, отличным от boot2docker.   -  person ConfusedNoob    schedule 09.01.2015
comment
Необходимо проверить 3 лога (docker daemon / nginx / docker registry). используйте команду curl для отладки, чтобы сначала пропустить демон Docker, эта информация все еще ограничена, чтобы другие могли помочь.   -  person Larry Cai    schedule 10.01.2015
comment
Я бы рекомендовал попробовать новую версию реестра: docker run -d -p 5000:5000 registry:2. Однако это немного другое, поэтому стоит посмотреть документы docs.docker.com/registry/deploying и вам нужно будет использовать клиентов v1.6.   -  person Adrian Mouat    schedule 10.06.2015


Ответы (7)


Отредактируйте файл докера

sudo vim /etc/default/docker

Добавьте DOCKER_OPTS

DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=www.example.com:8080"

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

sudo service docker restart
person anish    schedule 16.01.2015
comment
Где этот файл при использовании boot2docker в Mac OS X? - person ConfusedNoob; 16.01.2015

Выполните следующую команду:

boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry <YOUR INSECURE HOST>\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart"
person JaTo    schedule 10.06.2015

Версия Docker> 1.3.1 по умолчанию обменивается данными через HTTPS при подключении к реестру докеров

Если вы используете Nginx для proxy_pass на порт 5000, на котором работает реестр докеров, вам необходимо прервать SSL-соединение клиента докера с реестром докеров на веб-сервере / LB (в данном случае - Nginx). Чтобы проверить, завершает ли Nginx соединение SSL, используйте cURL https://www.example.com:8081/something где 8081 - другой порт, настроенный для тестирования сертификата SSL.

Если вам все равно, подключается ли ваш докер-клиент к реестру через HTTP, а не HTTPS, добавьте

OPTIONS = "- insecure-registry www.example.com:8080"

в / etc / sysconfig / docker (или эквивалент в других дистрибутивах) и перезапустите службу docker.

Надеюсь, это поможет.

person farshidlk    schedule 16.01.2015

Начиная с версии 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).

person scjody    schedule 13.02.2015

Для 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"
person Xiaokun    schedule 27.05.2015

  1. Зарегистрируйте ключ SSL на странице https://letsencrypt.org/. Если вам нужны дополнительные инструкции, см. эта ссылка.

  2. Включите 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's sake
        proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP
        proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto $scheme;
        proxy_read_timeout                  900;
    }
}

Это решает мою проблему, надеюсь, это поможет вам.

person Finn    schedule 21.05.2016
comment
Это идеальное решение. - person peterh; 13.12.2016

Попробуйте запустить демон с аргументами:

docker -d --insecure-registry="www.example.com:8080"

вместо установки EXTRA_ARGS

person Miguel Marques    schedule 13.01.2015
comment
Как это сделать для boot2docker? - person ConfusedNoob; 16.01.2015