Частный Docker Registry на Ubuntu 18.04 с Nginx и базовой аутентификацией

Docker Registry — это open source серверное приложение, которое хранит и распространяет Docker-образы. За Docker Hub также стоял Registry как серверная часть. Частный (private) Registry удобен для CI/CD, централизует кастомные образы и ускоряет цикл разработки и доставки.
В этом руководстве показано, как установить и настроить приватный Docker Registry на Ubuntu 18.04 с использованием Nginx и защиты по имени пользователя/паролю (basic auth).
Кому это полезно
- DevOps и инженерам, которые хотят локальный реестр образов
- Командам, требующим контроль доступа и собственный SSL
- Проектам с требованиями offline / private registry
Предварительные требования
- Сервер с Ubuntu 18.04
- Права root или sudo
- Домен, указывающий на сервер (в примерах registry.hakase-labs.io)
- SSL-сертификат для домена (fullchain.pem и privkey.pem) или возможность использовать собственный CA
Что будем делать
- Установим зависимости
- Установим Docker и Docker Compose
- Настроим приватный Docker Registry (docker-compose, Nginx, SSL, htpasswd)
- Протестируем push/pull образов и добавим Root CA в систему
Шаг 1 — Установка зависимостей
Установим вспомогательные пакеты, которые понадобятся для генерации пароля и тестирования.
Выполните:
sudo apt install -y gnupg2 pass apache2-utils httpieКоротко о пакетах:
- gnupg2 и pass — можно использовать для безопасного хранения секретов;
- apache2-utils — содержит htpasswd для генерации файла с паролями;
- httpie — удобный HTTP-клиент для тестирования API Registry.
Важно: htpasswd сохраняет пароли в формате, который Registry поддерживает (htpasswd / htpasswd-файл).
Шаг 2 — Установка Docker и Docker Compose
Установим docker и docker-compose из репозиториев Ubuntu:
sudo apt install -y docker.io docker-compose -yЗапустите и добавьте Docker в автозагрузку:
sudo systemctl start docker
sudo systemctl enable dockerПроверьте версии:
docker version
docker-compose version
Если команды возвращают версии — Docker и Compose установлены успешно.
Шаг 3 — Настройка приватного Docker Registry
В этом разделе создаём структуру каталогов, конфигурацию docker-compose, виртуальный хост для Nginx, SSL и файл с паролями.
Создание директорий проекта
Создадим каталог проекта registry и внутренние папки nginx и auth:
mkdir -p registry/{nginx,auth}Перейдём в каталог и создадим дополнительные папки для конфигов и ssl:
cd registry/
mkdir -p nginx/{conf.d/,ssl}Команда tree покажет структуру.

Создание docker-compose.yml
Перейдите в каталог registry и создайте файл docker-compose.yml:
cd registry/
vim docker-compose.ymlНиже — конфигурация, в которой определены сервисы registry и nginx, сеть mynet и том registrydata. Сервис registry использует образ registry:2 и подключает htpasswd-файл из ./auth/registry.passwd.
Содержимое docker-compose.yml:
version: '3'
services:
#Registry
registry:
image: registry:2
restart: always
ports:
- "5000:5000"
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry-Realm
REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwd
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
volumes:
- registrydata:/data
- ./auth:/auth
networks:
- mynet
#Nginx Service
nginx:
image: nginx:alpine
container_name: nginx
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d/:/etc/nginx/conf.d/
- ./nginx/ssl/:/etc/nginx/ssl/
networks:
- mynet
#Docker Networks
networks:
mynet:
driver: bridge
#Volumes
volumes:
registrydata:
driver: localСохраните файл.
Примечание: если вы планируете хранить большие образы, проверьте диск, где создаётся том registrydata — по умолчанию это локальный диск хоста.
Конфигурация виртуального хоста Nginx
Создайте файл nginx/conf.d/registry.conf:
cd nginx/conf.d/
vim registry.confВставьте конфигурацию Nginx:
upstream docker-registry {
server registry:5000;
}
server {
listen 80;
server_name registry.hakase-labs.io;
return 301 https://registry.hakase-labs.io$request_uri;
}
server {
listen 443 ssl http2;
server_name registry.hakase-labs.io;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# Log files for Debug
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
location / {
# 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;
}
proxy_pass http://docker-registry;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;
}
}Сохраните.
Создайте дополнительный конфиг, чтобы увеличить допустимый размер тела запроса (для загрузки больших образов):
vim additional.confВставьте:
client_max_body_size 2G;Сохраните.
SSL-сертификаты и базовая аутентификация
Скопируйте ваши SSL-файлы в каталог nginx/ssl/:
cp /path/to/ssl/fullchain.pem nginx/ssl/
cp /path/to/ssl/privkey.pem nginx/ssl/Затем создайте файл с паролями для Registry в папке auth:
cd auth/
htpasswd -Bc registry.passwd hakase
TYPE THE STRONG PASSWORDНа этой стадии окружение готово для запуска.

Запуск Docker Registry
Запустите стек в фоне:
docker-compose up -dПроверка статуса контейнеров:
docker-compose ps
netstat -plntuВы увидите сервис registry, слушающий порт 5000 внутри сети mynet, а Nginx — на 80/443 портах хоста.


Шаг 4 — Тестирование
Перед тестированием добавьте корневой сертификат в Docker и систему, если вы используете самоподписанный CA.
Если у вас PEM-файл rootCA.pem, сконвертируйте в CRT:
openssl x509 -in rootCA.pem -inform PEM -out rootCA.crtСкопируйте сертификат в директорию Docker для конкретного хоста:
mkdir -p /etc/docker/certs.d/registry.hakase-labs.io/
cp rootCA.crt /etc/docker/certs.d/registry.hakase-labs.io/Добавьте сертификат в системное хранилище доверенных корней:
mkdir -p /usr/share/ca-certificates/extra/
cp rootCA.crt /usr/share/ca-certificates/extra/
dpkg-reconfigure ca-certificates
systemctl restart docker
Download / Tag / Push образа
Скачиваем образ:
docker pull ubuntu:16.04Тегируем его под наш реестр:
docker image tag ubuntu:16.04 registry.hakase-labs.io/ubuntu16Проверяем локальные образы:
docker images
Авторизуемся в реестре (вводим имя пользователя и пароль, которые указали при htpasswd):
docker login https://registry.hakase-labs.io/v2/Проверяем список репозиториев в Registry через HTTP API (httpie):
http -a hakase https://registry.hakase-labs.io/v2/_catalogЕсли репозиториев нет — вы увидите пустой каталог.
Теперь пушим образ в приватный реестр:
docker push registry.hakase-labs.io/ubuntu16Опять запрашиваем каталог, чтобы убедиться, что ubuntu16 появился:
http -a hakase https://registry.hakase-labs.io/v2/_catalog
Поздравляем — приватный Docker Registry с Nginx и базовой аутентификацией развернут и протестирован.
Безопасность и жёсткие настройки
Важно повысить безопасность Registry перед использованием в продакшене.
- Используйте TLS: никогда не запускайте Registry без HTTPS на публичных сетях.
- Ограничьте доступ на уровне сети (firewall, security groups) — разрешайте доступ только с доверенных IP/сервисов.
- Храните файл с паролями в отдельном защищённом хранилище (Vault, KMS). Не коммитьте registry.passwd в репозиторий.
- Добавьте двухфакторную аутентификацию и/или интеграцию с LDAP/AD при возможности (альтернативы: Harbor, Nexus).
- Включите мониторинг и логирование: собирайте nginx- и registry-логи, настраивайте оповещения при неудачных попытках входа.
- Регулярно проверяйте свободное место на диске тома registrydata и настраивайте политики очистки (garbage collection) для удаления неиспользуемых слоёв.
Короткая команда для запускa garbage collection (требует остановки push/pull во время выполнения):
docker exec -it bin/registry garbage-collect /etc/docker/registry/config.yml Примечание: перед запуском GC сделайте бэкап тома.
Альтернативные подходы
- Использовать готовые решения с UI и RBAC: Harbor, JFrog Artifactory, Sonatype Nexus — дают управление репозиториями, пользователей, сканирование уязвимостей.
- Облачные реестры: Amazon ECR, Google Container Registry/Artifact Registry, Azure Container Registry — интеграция с облачными IAM и управляемой инфраструктурой.
- Если требуется простой локальный кэш для Docker Hub — использовать pull-through cache у registry.
Когда такой подход не подходит (контрпримеры)
- У вас требования к аудитам и сложным политикам доступа — лучше готовые продукты (Harbor, Artifactory).
- Требуется масштабирование на десятки тысяч репозиториев с распределёнными storage-миграциями — задумайтесь о облачных решениях или корпоративных платформах.
Чеклисты по ролям
Администратор (инфраструктура):
- Настроил firewall и разрешил только нужные порты
- Разместил SSL-сертификаты и настроил автоматическое обновление (если используется LetsEncrypt)
- Настроил бэкапы тома registrydata
- Включил логирование и мониторинг
DevOps-инженер:
- Подготовил docker-compose и проверил сети/тома
- Настроил htpasswd или интеграцию с LDAP
- Произвёл тест push/pull
- Настроил GC и расписание обслуживания
Разработчик:
- Получил доступ и credentials
- Протестировал docker login/push/pull
- Добавил инструкции в CI для push в приватный реестр
Мини-методология для развёртывания в проде
- Подготовка: проверка домена, получение SSL и подготовка бэкапов.
- Настройка окружения: firewall, мониторинг, пользователи.
- Тестовое развёртывание в staging (копия прод окружения).
- Миграция и cutover: синхронизировать образы и переключить CI/CD.
- После запуска: мониторинг и план обслуживания (GC, обновления).
Устранение неполадок
Проблема: “Не удаётся залогиниться”
- Проверьте правильность файла auth/registry.passwd и его права.
- Убедитесь, что Nginx проксирует запросы в сервис registry (docker-compose ps).
- Просмотрите логи Nginx и Registry: docker-compose logs nginx / docker-compose logs registry.
Проблема: “Docker не доверяет сертификату”
- Убедитесь, что rootCA.crt скопирован в /etc/docker/certs.d/registry.hakase-labs.io/ и перезапущен docker.
- Если используется системный CA — добавьте crt в /usr/share/ca-certificates/extra/ и выполните dpkg-reconfigure ca-certificates.
Проблема: “Недостаточно места при push”
- Проверьте доступное место на диске тома registrydata: df -h
- Очистите старые образы/логируйте GC.
Критерии приёмки
- Registry доступен по HTTPS и отвечает на /v2/ с кодом 200 для авторизованных пользователей.
- Push и pull тестовый образов выполняются успешно из CI и локальных машин разработчиков.
- Процедуры бэкапа и восстановления задокументированы.
Короткий словарь
- Registry — сервис хранения Docker-образов.
- HTPasswd — формат файла с хешированными паролями для базовой аутентификации.
- GC (garbage collection) — сборщик мусора в Registry, очищает неиспользуемые слои.
Пример принятия решений — поток работ
flowchart TD
A[Подготовка окружения] --> B{SSL готов?}
B -- Да --> C[Настроить Nginx и скопировать сертификаты]
B -- Нет --> D[Получить сертификат 'Let's Encrypt или CA']
C --> E[Создать htpasswd и docker-compose.yml]
E --> F[Запустить docker-compose up -d]
F --> G[Провести тесты push/pull]
G --> H{Тесты прошли?}
H -- Да --> I[Переход в продакшен]
H -- Нет --> J[Устранить ошибки]Краткое резюме
- Приватный Docker Registry даёт контроль над образами и ускоряет CI/CD.
- Главные шаги: настройка docker-compose, Nginx с TLS и htpasswd, установка CA в Docker, тестовый push/pull.
- Для продакшена дополнительно: firewall, мониторинг, бэкапы, GC и, при необходимости, миграция на более функциональные решения.
Ссылки
- Руководство по созданию Docker-образов: https://www.howtoforge.com/tutorial/how-to-create-docker-images-with-dockerfile/


Автор: техническое руководство, адаптация и дополнения для безопасного и управляемого развёртывания приватного Docker Registry.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента