Как развернуть приватный Docker Registry на Ubuntu 22.04

Приватный 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-бэкенд, настроить резервное копирование и подключить систему мониторинга.

Комментарии (0)

Войдите, чтобы оставить комментарий

Похожие статьи

Как удалить Docker‑образы, контейнеры и тома: подробное руководство

Полное руководство по удалению Docker‑образов, контейнеров и томов. Включены подробные команды, примеры и советы по очистке Docker‑среды для освобождения места на диске.

Как работает time.sleep() в Python

Подробно разбираем функцию time.sleep() в Python: как она работает, где применяется и какие ограничения имеет. Рассмотрены практические примеры, использование в циклах, многопоточном и асинхронном коде.