За основу была взята статья https://blog.sonatype.com/using-sonatype-nexus-repository-3-part-3-docker-images
Nexus можно использовать в качестве docker-registry — как хранилище docker-образов, которые собраны самостоятельно, так и как кэширующий прокси для основного docker-hub, чтобы образы скачивались каждый раз не из интернета, а из локальной сети.
Далее будет рассмотрена последовательность шагов, позволяющая настроить свой собственный nexus в качестве docker-registry.
Нам потребуется:
- Приватный репозиторий для хранения собственных docker-образов;
- Прокси-репозиторий для хранения образов из docker-hub;
- Репозиторий-группа, которая объединит в себе приватный и прокси-репозиторий и будет выступать в качестве единой точки входа для docker-клиентов.
Для каждого репозитория можно создать свое собственное blob-хранилище, отличное от хранилища по-умолчанию. По сути это означает создание отдельной папки внутри рабочего каталога nexus (/nexus-data). Этот прием можно использовать, чтобы можно было подмонтировать отдельный диск или persistence volume (в случае запуска nexus через docker) для этой папки.
Создание приватного репозитория
Логинимся в nexus под админской учеткой, заходим в настройки (1), репозитории (2), создать репозиторий (3).

В списке типов репозиториев выбираем docker (hosted) и заполняем настройки как представлено на картинке.

Обращаем внимание на заполнение имени репозитория (docker-private), http-коннектор с портом 8082.
Создание прокси-репозитория
Делаем по аналогии с приватным репозиторием, но в списке выбираем тип docker (proxy).


Особенности — необходимо ввести удаленный docker-registry, который мы планируем проксировать (https://registry-1.docker.io в данном примере — центральный docker-репозиторий, но ничто не мешает ввести адрес любого docker-registry), выбрать Docker Index — Use Docker Hub
Создание группы-репозитория
Завершающий этап — создание группы репозиториев, которая объединяет в себе созданные выше приватный и прокси-репозиторий.


Особенности — указываем http-коннектор с портом 8083, добавляем ранее созданные репозитории docker-private и docker-proxy в качестве членов данной группы.
Создание отдельного пользователя
Чтобы пользоваться нашим собственным docker-registry более безопасно можно создать в nexus отдельного пользователя, которому присвоить роль, которой доступен деплой образов. Для этого переходим в раздел Users в настройках, создаем пользователя (например, docker), задаем ему пароль, роль deployers.
Настройка клиентов
Для взаимодействия с новосозданными репозиториями необходимо произвести настройку docker-демонов на машине, на которой планируется запускать docker-контейнеры.
Создаем файл (при отсутствии) /etc/docker/daemon.json со следующим содержимым
{
"insecure-registries": [
"repo-url-or-ip:8082",
"repo-url-or-ip:8083"
]
}
Это позволит docker’у обращаться к нашим репозиториям по менее безопасному http-протоколу. https в нашем случае не обязателен, т. к. мы работаем внутри локальной сети, недоступной извне.
Перезапускаем docker-демон командой sudo systemctl restart docker (при использовании ubuntu. В других дистрибутивах может использоваться иная команда)
Логинимся в нашем docker-репозитории с использованием учетной записи docker
sudo docker login -u docker -p passw repo-url-or-ip:8082
sudo docker login -u docker -p passw repo-url-or-ip:8083
При этом в домашней директории пользователя, под которым запускаем эти команды, будет создан файл ~/.docker/config.json с примерно следующим содержимым
{
"auths": {
"repo-url-or-ip:8082": {
"auth": "YWRtaW46YWRtaW4xMjM="
},
"repo-url-or-ip:8083": {
"auth": "YWRtaW46YWRtaW4xMjM="
}
}
Работа с docker-репозиторием
Для получения образов контейнеров из репозитория необходимо использовать команду (порт 8083 соответствует групповому репозиторию! При этом внутри nexus запрос будет направлен в репозиторий docker-proxy, который, в свою очередь, произведет вытягивание (в случае отсутствия) образа из центрального docker-hub’а, на который был настроен прокси)
sudo docker pull repo-url-or-ip:8083/httpd:2.4-alpine
Для загрузки своих собственных образов в nexus необходимо сперва пометить собранный на локальной машине образ тегом, а затем его залить в наш приватный docker-репозиторий (обращаем внимание на использование порта 8082)
sudo docker tag own-image:1 repo-url-or-ip:8082/own-image:1
sudo docker push repo-url-or-ip:8082/own-image:1
Для получения своих собственных образов можно использовать как порт 8082, так и 8083
sudo docker pull own-image:1 repo-url-or-ip:8082/own-image:1
# или
sudo docker pull own-image:1 repo-url-or-ip:8083/own-image:1