Введение
Хотя 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-образами. Это оптимальное решение для команд с высокими требованиями к безопасности.
Отзывы