Gymterview
middle

Как использовать Nexus в качестве Docker Registry?

Nexus в роли Docker Registry — это конфигурация Nexus Repository Manager для хранения, проксирования и раздачи Docker-образов, что позволяет организации иметь приватный Docker Registry без отдельной инфраструктуры.

Представьте, что Docker Hub — это публичная библиотека, а вам нужна корпоративная. Вместо того чтобы разворачивать отдельное здание (standalone Docker Registry), вы добавляете новый отдел (Docker-репозиторий) к уже существующей библиотеке (Nexus). Читатели (разработчики) могут и хранить свои книги (hosted), и заказывать публичные (proxy) — через одно окно (group).

Настройка в Nexus

Для полноценной работы создаются три Docker-репозитория (каждый на своём HTTP-порту):

Репозиторий Тип HTTP-порт Назначение
docker-hosted Hosted 8083 Хранение собственных образов
docker-hub-proxy Proxy 8084 Кэширование образов из Docker Hub
docker-group Group 8085 Единый URL для скачивания (объединяет hosted + proxy)

Почему отдельные порты? Docker Registry API требует выделенного хоста/порта для корректной работы команд docker push и docker pull.

Использование Docker с Nexus

Пример
# Авторизация в Nexus Docker Registry
docker login nexus.company.com:8083 -u admin -p admin123

# Тегирование образа для Nexus
docker tag my-app:1.0.0 nexus.company.com:8083/my-app:1.0.0

# Загрузка образа в Nexus (push — через hosted-порт 8083)
docker push nexus.company.com:8083/my-app:1.0.0

# Скачивание образа из Nexus (pull — через group-порт 8085)
docker pull nexus.company.com:8085/my-app:1.0.0

Использование в Jenkinsfile

Пример
stage('Build & Push Docker Image') {
    steps {
        script {
            def image = docker.build("nexus.company.com:8083/my-app:${env.BUILD_NUMBER}")
            docker.withRegistry('https://nexus.company.com:8083', 'nexus-docker-credentials') {
                image.push()
                image.push('latest')
            }
        }
    }
}

Настройка Docker daemon

Если Nexus использует HTTP (без TLS), необходимо добавить в /etc/docker/daemon.json:

Пример
{
    "insecure-registries": ["nexus.company.com:8083", "nexus.company.com:8085"]
}

В production рекомендуется использовать HTTPS с валидным сертификатом — это устраняет необходимость insecure-registries и обеспечивает безопасную передачу данных.

Вывод

Использование Nexus как Docker Registry — удобное решение «два в одном»: не нужно разворачивать и поддерживать отдельный registry. Nexus предоставляет единый интерфейс управления для Maven-артефактов, Docker-образов и других форматов.

На собеседовании: часто спрашивают, зачем нужны разные порты для Docker-репозиториев в Nexus. Ответ: Docker Registry API требует выделенного хоста/порта. Push выполняется через hosted-порт, pull — через group-порт (объединяет hosted и proxy).