Приватный Docker Registry позволяет хранить собственные образы контейнеров внутри компании или проекта. Это удобно, когда вы работаете с закрытым кодом, хотите ускорить деплой или просто не хотите публиковать образы в Docker Hub.
В этой инструкции разберём, как поднять собственный реестр Docker на Ubuntu 22.04, настроить HTTPS и защитить доступ базовой авторизацией.
Шаг 1. Установка Docker на Ubuntu 22.04
Сначала обновим систему:
sudo apt update
sudo apt upgrade -yУстановим зависимости:
sudo apt install ca-certificates curl gnupg lsb-release -yДобавим официальный GPG-ключ Docker:
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpgДобавим репозиторий:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullУстановим Docker:
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -yПроверим работу:
sudo systemctl status dockerШаг 2. Запуск контейнера Registry
Docker Registry доступен как официальный образ в Docker Hub.
Создадим директорию для хранения данных:
sudo mkdir -p /opt/registryЗапустим реестр:
docker run -d \
--name registry \
-p 5000:5000 \
-v /opt/registry:/var/lib/registry \
--restart always \
registry:2Проверим, что контейнер работает:
docker psНа этом этапе реестр доступен по адресу:
http://server_ip:5000Но он пока не защищён и работает без HTTPS. Это небезопасно.
Шаг 3. Настройка домена и Nginx
Установим Nginx:
sudo apt install nginx -yСоздадим конфигурацию:
sudo nano /etc/nginx/sites-available/registryДобавим:
server {
listen 80;
server_name registry.example.com;
location / {
proxy_pass http://localhost:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}Активируем конфигурацию:
sudo ln -s /etc/nginx/sites-available/registry /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxШаг 4. Подключение HTTPS через Let's Encrypt
Установим Certbot:
sudo apt install certbot python3-certbot-nginx -yПолучим сертификат:
sudo certbot --nginx -d registry.example.comПосле завершения Certbot автоматически обновит конфигурацию Nginx и включит HTTPS.
Проверить автообновление сертификатов можно так:
sudo systemctl status certbot.timerШаг 5. Настройка базовой авторизации
Создадим директорию для хранения файла паролей:
sudo mkdir -p /opt/registry/authУстановим утилиту htpasswd:
sudo apt install apache2-utils -yСоздадим пользователя:
sudo htpasswd -Bc /opt/registry/auth/htpasswd adminОстановим текущий контейнер:
docker stop registry
docker rm registryЗапустим заново с авторизацией:
docker run -d \
--name registry \
-p 5000:5000 \
-v /opt/registry:/var/lib/registry \
-v /opt/registry/auth:/auth \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
--restart always \
registry:2Шаг 6. Подключение к реестру
Авторизуемся:
docker login registry.example.comСоберём тестовый образ:
docker build -t registry.example.com/test-image .Отправим его в реестр:
docker push registry.example.com/test-imageПроверить список репозиториев можно так:
curl -u admin https://registry.example.com/v2/_catalogТакой вариант подходит для небольших команд, стартапов и внутренних CI/CD-процессов. При росте нагрузки можно добавить S3-бэкенд, настроить резервное копирование и подключить систему мониторинга.