Belov Solutions

Распространение образов с ограничением доступа: настройка частного реестра Docker

Введение

Хотя Docker Hub остается популярным решением для хранения и распространения Docker-образов, он имеет ограничения, особенно в контексте ограниченного доступа. Альтернативой являются ручные методы — экспорт/импорт образов или сборка из файлов Dockerfile на каждом хосте. Однако эти подходы имеют существенные недостатки: повторная сборка замедляет процесс, а различия между хостами могут привести к несоответствиям. Кроме того, экспорт и импорт подвержены ошибкам. Наилучшим решением является настройка собственного частного реестра, управляемого автором или независимым провайдером. В этой статье мы подробно разберем процесс создания и конфигурации частного реестра, а также рассмотрим коммерческие альтернативы.

Организация собственного реестра

Частный реестр Docker значительно отличается от Docker Hub. Оба используют API для выгрузки, загрузки и поиска образов, но Docker Hub — это облачный сервис с закрытым исходным кодом, предоставляющий учетные записи, статистику и веб-интерфейс. Частный реестр, напротив, представляет собой локальное приложение с открытым исходным кодом, лишенное этих функций, что требует самостоятельной настройки.

Настоящее руководство сосредоточено на версии 2 реестра, которая является стабильной и совместима с Docker-демоном версии 1.6 и выше. Версия 2 обеспечивает улучшенную безопасность, надежность и эффективность по сравнению с версией 1, поэтому переход на нее рекомендуется. Для поддержки устаревших версий Docker можно временно использовать обе версии параллельно.

Самый простой способ запустить реестр — использование официального образа:

$ docker run -d -p 5000:5000 registry:2

После запуска можно тегировать и выгружать образы, например:

$ docker tag test/identidock:0.1 localhost:5000/identidock:0.1
$ docker push localhost:5000/identidock:0.1

Для проверки извлечения удалите локальный образ и загрузите его обратно:

$ docker rmi localhost:5000/identidock:0.1
$ docker pull localhost:5000/identidock:0.1

Реестр также генерирует дайджест (уникальный хэш), который гарантирует целостность образа при загрузке, например:

$ docker pull localhost:5000/identidock@sha256:d20affe522a3c6ef1f8293de69fea5a8621d695619955262f3fc28852e173108

Централизованное хранение особенно полезно для команд разработчиков, но требует обеспечения удаленного доступа.

Проблемы доступа и их решение

Попытка доступа к локальному реестру с внешнего хоста без TLS-сертификата вызывает ошибку, например:

$ docker pull 192.180.10.101:5000/identidock:0.1
Error response from daemon: unable to ping registry endpoint
tls: oversized record received with length 20527

Это связано с тем, что Docker требует TLS для удаленных подключений, за исключением localhost. Возможные решения включают:

  • Небезопасный режим: Перезапуск демона с --insecure-registry 192.180.10.101:5000. Этот метод прост, но небезопасен.
  • Подписанный сертификат: Получение сертификата от аккредитованного центра (например, Let’s Encrypt) обеспечивает максимальную безопасность, но требует оплаты.
  • Самоподписанный сертификат: Бесплатный метод с использованием OpenSSL. Создайте сертификат на сервере реестра:
root@ivan:~# mkdir registry_certs
root@ivan:~# openssl req -newkey rsa:4096 -nodes -sha256 \
    -keyout registry_certs/domain.key -x509 -days 365 \
    -out registry_certs/domain.crt

Введите данные (Common Name должно соответствовать имени сервера, например, ivan) и скопируйте domain.crt в /etc/docker/certs.d/ivan:5000/ca.crt на всех хостах. Перезапустите Docker:

root@ivan:~# sudo service docker restart

Запустите реестр с сертификатами:

root@ivan:~# docker run -d -p 5000:5000 \
        -v $(pwd)/registry_certs:/certs \
        -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
        -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
        --restart=always --name registry registry:2

Протестируйте, загрузив образ debian:wheezy и вернув его в реестр.

Расширенная конфигурация реестра

Хранилище

По умолчанию реестр использует файловую систему для хранения данных. Настройте том, например:

storage:
    filesystem:
        rootdirectory: /var/lib/registry

Для облачных решений доступны драйверы Amazon S3 и Microsoft Azure, а также Ceph и Redis для кэширования.

Аутентификация

Без аутентификации доступ открыт для всех. Для ограничения используйте:

  • Прокси-сервер: Настройте nginx с базовой аутентификацией и используйте docker login.
  • Токены: JSON Web Tokens с сервером аутентификации для сложных сценариев.

HTTP и дополнительные параметры

Настройте HTTP в файле конфигурации:

http:
    addr: ivan:5000
    secret: DD100CC4-1248-1109-A736-33C19330F812
    tls:
        certificate: /certs/domain.crt
        key: /certs/domain.key

Дополнительные параметры (уведомления, логи) доступны в github.com/docker/distribution.

Коммерческие реестры

Для удобства доступны Docker Trusted Registry и CoreOS Enterprise Registry. Они предлагают веб-интерфейс, управление доступом и интеграцию с корпоративными сетями.

Преимущества и ограничения

Частный реестр обеспечивает контроль и безопасность, но требует ручной настройки. Коммерческие решения упрощают администрирование, но стоят дороже.

Заключение

Настройка частного реестра — мощный инструмент для управления Docker-образами. Это оптимальное решение для команд с высокими требованиями к безопасности.

Отзывы

Оставить отзыв

Ваша эл. почта не будет опубликована