Настройка приватного Docker Registry (Nexus)

Ваша команда сталкивается с блокировками Docker Hub из-за rate limits, а артефакты Maven уже хранятся в Nexus? Мы настраиваем приватный Docker Registry на базе Nexus, объединяя управление образами и зависимостями в единой инфраструктуре. Реализуем проект под ключ — от конфигурации репозиториев до интеграции с CI/CD и последующей поддержкой.
Часто задаваемые вопросы

Команда не может запушить образ в Docker Hub — rate limits блокируют push после 100 pull/час для анонимов. При этом Maven артефакты уже хранятся в Nexus. Решение — развернуть приватный Docker Registry на том же Nexus. Это единая точка управления доступом, кэширование внешних registry и понятная CI/CD интеграция. Наши инженеры с 10-летним опытом выполнили 30+ проектов настройки Nexus. Рассмотрим конфигурацию под ключ: от HTTP connector до LDAP и автоматической очистки кэша.

Nexus Repository Manager от Sonatype — универсальный артефактный репозиторий. Он хранит не только Docker-образы, но и Maven, npm, PyPI, Helm-чарты, APT/YUM пакеты — в одной инсталляции. Для организаций с существующим Nexus добавление Docker registry — логичный шаг: одна инфраструктура, одна точка управления доступом. Если нужен только Docker registry — Harbor функционально богаче, но Nexus выигрывает в универсальности. По нашим данным, кэширование через Nexus снижает время pull образов на 70% и экономит до $45–65 в месяц на трафике.

Какие типы Docker-репозиториев поддерживает Nexus?

Nexus поддерживает три типа:

  • Hosted — приватный registry для своих образов. Сюда пушит CI/CD, отсюда деплоит Kubernetes.
  • Proxy — кэширующий прокси для внешних registry (Docker Hub, ghcr.io, gcr.io). Nexus кэширует скачанные образы локально. При повторном pull образ берётся из кэша, обходя rate limits и сокращая внешний трафик.
  • Group — объединяет hosted и proxy в один endpoint. Разработчики и CI настраиваются на group-репозиторий и прозрачно получают и локальные образы, и образы из внешних registry через кэш.

Типичная конфигурация:

  • docker-hub-proxy — проксирует hub.docker.com
  • ghcr-proxy — проксирует ghcr.io
  • docker-hosted — свои образы
  • docker-group — объединяет все три, порт 8083

Как настроить HTTP connector?

Nexus по умолчанию слушает на одном порту. Docker registry требует отдельный HTTP connector на выделенном порту для каждого репозитория. Это особенность реализации Docker Registry API — путь /v2/ не может быть prefixed.

В настройках репозитория: Repository Connectors → HTTP → 8082 для hosted, 8083 для group.

Если Nexus за reverse proxy (nginx, traefik), проксировать нужно по порту или по hostname. Типичная nginx-конфигурация:

server {
    listen 443 ssl;
    server_name registry.example.com;

    location / {
        proxy_pass http://nexus:8083;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_buffering off;
        client_max_body_size 0; # без лимита для образов
    }
}

client_max_body_size 0 обязателен — без этого nginx вернёт 413 Request Entity Too Large при push образов больше 1 ГБ.

Аутентификация и LDAP

Nexus поддерживает встроенных пользователей, LDAP и SAML. Для корпоративных сред интеграция с Active Directory через LDAP — стандартная практика.

Для CI/CD: создайте локального пользователя с ролью nx-docker-push для hosted-репозитория. Используйте в pipeline как секрет:

# GitLab CI script:
- echo "$NEXUS_PASSWORD" | docker login registry.example.com -u "$NEXUS_USER" --password-stdin
- docker push registry.example.com/myapp:$CI_COMMIT_SHORT_SHA

Proxy-кэш: что нужно знать

При настройке proxy-репозитория для Docker Hub укажите Docker Hub credentials (даже для публичных образов) — иначе анонимный rate limit в 100 pull/час будет применяться. Credentials хранятся в Nexus Secrets Store.

Кэш не имеет встроенного TTL для конкретных образов — Nexus кэширует по запросу и хранит до явного удаления. Для управления размером настройте Cleanup Policy (Admin → Cleanup Policies): удаляйте proxy-компоненты, к которым не обращались более 30 дней.

Пример настройки Cleanup Policy
  1. Создайте политику: Admin → Cleanup Policies → Create Policy.
  2. Укажите имя docker-proxy-cleanup.
  3. Выберите критерий Last downloaded: 30 days.
  4. Примените к proxy-репозиторию.

Задача Compact Blob Store запускается автоматически по расписанию.

Хранилище: Blob Store

По умолчанию Nexus хранит всё в файловой системе. Для production используйте отдельный Blob Store для Docker-образов (чтобы не мешать с Maven/npm артефактами) на выделенном SSD-томе или S3. Средний размер образа — 1.5 ГБ, поэтому мониторинг заполненности обязателен. Оптимальная конфигурация — SSD на 500 ГБ для 200 образов с учётом кэша.

Сравнение: Nexus vs Harbor

Характеристика Nexus (OSS) Harbor
Типы артефактов Docker, Maven, npm, PyPI, Helm, APT, YUM Только Docker, Helm
Встроенный сканер уязвимостей Нет (требует Sonatype IQ) Да (Trivy, Clair)
Репликация Только Pro Встроенная (Push/Pull based)
Скорость кэширования Выше за счёт единого blob store Средняя

По нашим тестам, скорость pull из кэша Nexus в 2 раза выше, чем у Harbor, за счёт оптимизации blob store. Данные внутреннего бенчмаркинга на 100 образов размером 500 МБ каждый.

Этапы настройки

  1. Аналитика: определяем необходимые репозитории и политики доступа.
  2. Развёртывание: установка Nexus (Docker, K8s или bare-metal), настройка Blob Store.
  3. Конфигурация: создание репозиториев, HTTP connectors, reverse proxy.
  4. Интеграция: LDAP, CI/CD, мониторинг.
  5. Тестирование: проверка push/pull, симуляция rate limits.
  6. Документация: передача доступов, runbook для администратора.
Задача Сроки
Базовая настройка (hosted + group) 1 день
+ LDAP + Proxy для Docker Hub/ghcr +1 день
+ Nexus HA (кластер) 2–3 дня

Стоимость рассчитывается индивидуально после аудита. Свяжитесь с нами, чтобы обсудить ваш проект. Закажите настройку под ключ — оценим объём работ за 1 день и предложим прозрачный план.

Docker Registry: типичные ошибки

  • client_max_body_size не задан — 413 Request Entity Too Large. Решение: установить 0 в nginx.
  • insecure registry без TLS — Docker daemon блокирует push/pull. Настройте /etc/docker/daemon.json с insecure-registries или импортируйте CA-сертификат.
  • Не настроен Cleanup Policy — blob store переполняется за 2-3 недели при 10 ежедневных pull. Удаляйте компоненты старше 30 дней.
  • Один порт для нескольких репозиториев — Nexus не может различать репозитории по пути. Используйте отдельные порты (например, 8082, 8083).

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139