MAATRIX / Блог / Свой Docker Registry на VPS

Свой Docker Registry на VPS

Свой Docker Registry на VPS: настройка с нуля
Блог MAATRIX · 2026-07-07

Приватный реестр образов держит ваши сборки под контролем: не зависите от лимитов Docker Hub и не платите за приватные репозитории. Поднимаем за 20 минут.

Зачем свой реестр

Docker Hub ограничивает число pull для анонимов и берёт деньги за приватные образы. Если у вас CI/CD, несколько серверов или просто чувствительные сборки — держать реестр у себя дешевле и быстрее.

Реестр — это диск плюс сеть. Образы весят гигабайты, а pull во время деплоя должен быть быстрым. NVMe-диски MAATRIX здесь дают ощутимый выигрыш: слои читаются на порядок шустрее, чем на SATA-хостингах, и деплой не буксует.

  • Нет rate-limit — тяните образы сколько нужно.
  • Приватность из коробки: образы не покидают ваш VPS.
  • Локальный pull внутри одной сети — почти мгновенный.

Какой VPS выбрать для небольшого Docker-проекта

Для небольшого Docker-проекта начните со Старт: 2 vCPU, 4 ГБ памяти и 80 ГБ NVMe. Если на сервере будет несколько приложений, сайтов или контейнеров, рассмотрите Стандарт: 4 vCPU и 8 ГБ памяти. Это ориентиры для небольшого проекта, а не обещание конкретного числа посетителей или запросов.

Для небольшого проекта

Старт · 2 vCPU · 4 ГБ RAM
80 ГБ NVMe
Начальная конфигурация для приложения и сопутствующих сервисов.

Заказать Старт

Для нескольких приложений

Стандарт · 4 vCPU · 8 ГБ RAM
160 ГБ NVMe
Больше памяти и процессорных ресурсов на одном VPS.

Заказать Стандарт

После заказа переходите к настройке по статье. Если ресурсы заканчиваются, увеличьте конфигурацию; для базы данных дополнительно учитывайте объём и характер запросов.

В кнопках заказа выбрана локация в Великобритании. Другую страну можно выбрать при оформлении.

Оплата VPS картой РФ или по СБП доступна в личном кабинете. Для безналичной оплаты от юридического лица или ИП запросите счёт у support@maatrix.io, указав тариф и реквизиты.

Запуск registry

Официальный образ registry:2 запускается одной командой. Данные складываем в отдельный том, чтобы пережить пересоздание контейнера:

docker run -d --name registry \
  --restart unless-stopped \
  -v /srv/registry/data:/var/lib/registry \
  -p 127.0.0.1:5000:5000 \
  registry:2

Обратите внимание: порт слушаем только на 127.0.0.1. Наружу реестр отдадим через nginx с HTTPS — так безопаснее, чем светить 5000 в интернет.

Авторизация (basic-auth)

Без пароля любой сможет заливать образы. Создадим файл с логином/паролем через утилиту htpasswd:

apt install -y apache2-utils
mkdir -p /srv/registry/auth
htpasswd -Bbn deploy 'S3cretPass' > /srv/registry/auth/htpasswd

Этот файл подключит nginx как источник basic-auth (см. следующий раздел). Флаг -B использует bcrypt — то, что нужно для реестра.

HTTPS через nginx

Docker наотрез отказывается работать с реестром по HTTP (кроме localhost). Ставим nginx как реверс-прокси с TLS. Получаем сертификат Let's Encrypt:

apt install -y nginx certbot python3-certbot-nginx
certbot --nginx -d registry.example.com

Конфиг nginx для проксирования на реестр:

server {
  server_name registry.example.com;
  client_max_body_size 2048m;
  location / {
    auth_basic "Registry";
    auth_basic_user_file /srv/registry/auth/htpasswd;
    proxy_pass http://127.0.0.1:5000;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
  }
}

Директива client_max_body_size 2048m обязательна — иначе большие слои образов отвалятся с ошибкой 413.

Push и pull образов

Логинимся и заливаем первый образ. Тег обязательно с адресом реестра:

docker login registry.example.com
docker tag myapp:latest registry.example.com/myapp:1.0
docker push registry.example.com/myapp:1.0

На другом сервере тянем так же:

docker login registry.example.com
docker pull registry.example.com/myapp:1.0

Посмотреть список образов в реестре можно через его API:

curl -u deploy:S3cretPass https://registry.example.com/v2/_catalog

Очистка и обслуживание

Реестр не удаляет старые слои сам — диск постепенно забивается. Включите сборку мусора. Сначала пометьте образ на удаление через API, затем запустите garbage-collect:

docker exec registry \
  registry garbage-collect /etc/docker/registry/config.yml
  • Частая ошибка: забыли client_max_body_size — большие образы не заливаются.
  • Частая ошибка: порт 5000 открыт наружу без TLS — реестр доступен всем. Всегда прячьте за nginx.
  • Следите за местом: df -h /srv/registry. Ежедневные бэкапы MAATRIX защитят данные, но диск чистить всё равно нужно.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Частые вопросы

Можно ли обойтись без HTTPS?

Только для localhost или через явный insecure-registries в /etc/docker/daemon.json, что небезопасно. Для боевого реестра всегда используйте TLS через nginx и Let's Encrypt.

Сколько места нужно под реестр?

Зависит от размера и числа образов. Планируйте с запасом: каждый образ приложения — сотни мегабайт. На NVMe-дисках MAATRIX даже большой реестр отдаёт слои очень быстро.

Как удалять старые образы?

Пометьте манифест на удаление через Registry API (DELETE /v2/<name>/manifests/<digest>), затем запустите registry garbage-collect внутри контейнера.

Готовы перейти к настройке?

Закажите Старт с конфигурацией, предложенной для старта, или сравните все тарифы. Оплата картой РФ и через СБП — в личном кабинете.

Заказать Старт Все тарифы и цены