Обслуживать репозиторий докеров по некорневому пути (nginx + Sonatype Nexus)

У нас есть несколько репозиториев Docker, обслуживаемых сервером Sonatype Nexus.

Проблема в том, что мы хотим обслуживать их по путям вместо того, чтобы обслуживать их в разных доменах. Причина проста: легче настроить новые пути, чем новые домены, с регистрацией каждого поддомена и сертификатом SSL. Кроме того, есть некоторые проблемы с безопасностью.

Это можно сделать?


person MagMax    schedule 23.09.2019    source источник


Ответы (1)


Через некоторое время я обнаружил, что есть два шага: вход в систему и нормальное использование.

Поскольку в установке есть серверы nginx и nexus в составе docker-compose, я могу назвать хост nexus «nexus» и получить доступ только по http. SSL-сертификат разрешается в nginx с использованием обычной конфигурации nginx.

Чтобы войти в систему, важно перенаправить путь /v2/ в репозиторий докеров. Это можно сделать с помощью nginx:

location /v2/ {
   proxy_set_header    Host $host;
   proxy_set_header    X-Real-IP $remote_addr;
   proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header    X-Forwarded-Proto $scheme;
   proxy_pass          http://nexus:10000;
   proxy_read_timeout  90;
}

Обратите внимание, что предполагается, что конфигурация нексуса для репозитория докеров внутренне прослушивает порт 10000 (http). В этой конфигурации docker login уже должен работать, но вы не можете получить изображение.

Чтобы получить доступ к изображениям, важно переписать URI (пожалуйста, поместите эту конфигурацию поверх конфигурации /v2/, показанной ранее):

location ~ /v2/repository/docker-repo1/(.*) {
  proxy_set_header    Host $host;
  proxy_set_header    X-Real-IP $remote_addr;
  proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header    X-Forwarded-Proto $scheme;
  proxy_pass          http://nexus:10000/v2/$1;
  proxy_read_timeout  90;
}

И легко понять, что вы можете создать второй репозиторий, прослушивая порт 10001, с конфигурацией:

location ~ /v2/repository/docker-repo2/(.*) {
  proxy_set_header    Host $host;
  proxy_set_header    X-Real-IP $remote_addr;
  proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header    X-Forwarded-Proto $scheme;
  proxy_pass          http://nexus:10001/v2/$1;
  proxy_read_timeout  90;
}

И это сделано.

Помните, что важно поддерживать конфигурацию /v2/ (ту, которая используется для входа в систему) после всех остальных, иначе она никогда не будет достигнута.

Я не уверен, что все требования к авторизации будут работать должным образом ... Я обновлю этот ответ, если увижу какие-либо проблемы.

person MagMax    schedule 23.09.2019