Docker nginx-proxy: прокси между контейнерами
В настоящее время я работаю над стеком разработки с использованием Docker-Compose в своей компании, чтобы предоставить разработчикам все, что им нужно для кодирования наших приложений.
Это включает, в частности:
контейнер Gitlab (sameersbn / gitlab) управлять частными GIT-репозиториями,контейнер Дженкинса (библиотека / Jenkins) для построения и непрерывной интеграции,контейнер Archiva (ninjaben / Archiva-докер) управлять репозиториями Maven.Чтобы защитить сервисы через HTTPS и показать их внешнему миру, я установил отличный контейнер nginx-proxy (jwilder / Nginx-прокси), которая позволяет автоматизировать настройку прокси-сервера nginx с использованием переменных среды в контейнерах и автоматического перенаправления HTTP на HTTPS.
DNS настроен для сопоставления каждого общедоступного URL-адреса докеризованных сервисов с IP-адресом хоста.
Наконец, используя Docker-Compose, мой файл docker-compose.yml выглядит так:
version: '2'
services:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- /var/config/nginx-proxy/certs:/etc/nginx/certs:ro
postgresql:
# Configuration of postgresql container ...
gitlab:
image: sameersbn/gitlab
ports:
- "10022:22"
volumes:
- /var/data/gitlab:/home/git/data
environment:
# Bunch of environment variables ...
- VIRTUAL_HOST=gitlab.my-domain.com
- VIRTUAL_PORT=80
- CERT_NAME=star.my-domain.com
archiva:
image: ninjaben/archiva-docker
volumes:
- /var/data/archiva:/var/archiva
environment:
- VIRTUAL_HOST=archiva.my-domain.com
- VIRTUAL_PORT=8080
- CERT_NAME=star.my-domain.com
jenkins:
image: jenkins
volumes:
- /var/data/jenkins:/var/jenkins_home
environment:
- VIRTUAL_HOST=jenkins.my-domain.com
- VIRTUAL_PORT=8080
- CERT_NAME=star.my-domain.com
Для рабочей станции разработчика все работает как положено. Можно получить доступ к услугам разницы черезhttps://gitlab.my-domain.com
, https://repo.my-domain.com
а такжеhttps://jenkins.my-domain.com
.
Проблема возникает, когда одна из служб Dockerized получает доступ к другой службе Dockerized. Например, если я пытаюсь получить доступhttps://archiva.my-domain.com
от Дженкинса Докера, я получу ошибку тайм-аута от прокси.
Кажется, что даже еслиarchiva.my-domain.com
определяется как общедоступный IP-адрес хоста из контейнера Docker,запросы, поступающие от докеризованных сервисов, не передаются через прокси-сервер nginx.
Насколько я понял, docker-nginx обрабатывает запросы, поступающие из хост-сети, но не заботится о запросах, поступающих из внутренней контейнерной сети (_dockerconfig_default_ для стека Docker-Compose).
Вы могли бы сказать, зачем мне использовать прокси из контейнера? Конечно, я мог бы использовать URLhttp://archiva:8080
из контейнера Дженкинс, и это будет работать. Но такая конфигурация не масштабируется.
Например, используя сборку Gradle для компиляции одного приложения, build.gradle должен объявить мой частный репозиторий черезhttps://archiva.my-domain.com
, Это будет работать, если сборка запускается с рабочей станции разработчика, но не через контейнер jenkins ...
Другим примером является аутентификация в Jenkins с помощью службы OAuth GitLab, где должен использоваться тот же URL-адрес, что и для аутентификации GitLab.и то и другое доступны снаружи и внутри контейнера Jenkins.
Мой вопрос вот тогда:Как настроить nginx-proxy для прокси запроса от контейнера к другому контейнеру?
Я не видел ни одной темы, обсуждающей эту проблему, и я недостаточно понимаю проблему, чтобы построить решение на конфигурации nginx.
Любая помощь могла бы быть полезна.