У меня такое чувство, что я упускаю из виду что-то очевидное, поскольку мои решения/идеи до сих пор кажутся слишком громоздкими. Я интенсивно искал хорошее решение, но пока безуспешно - вероятно, потому, что я не знаю, что искать.
Вопрос: Как вы взаимодействуете с графическими интерфейсами веб-серверов, работающих в разных контейнерах (в пределах одной сети Docker) на удаленном сервере, учитывая перенаправления URL между этими контейнерами?
Исходная ситуация: У меня есть два контейнера (веб-приложение Flask и сервер Tomcat с работающим на нем OpenAM), работающие на моем узле докеров (Azure-VM).
До сих пор я настраивал OpenAM на своем локальном компьютере, используя переадресацию портов ssh.
Проблема: Веб-приложение Flask ссылается на OpenAM по его доменному имени, определенному в docker-compose, и наоборот. Я перенаправляю на свою локальную машину порт контейнера Flask. Приложение Flask запущено, и я могу взаимодействовать с ним в своем браузере. Система дает сбой, как только я перенаправляюсь с Flask на OpenAM на моем локальном компьютере, потому что ссылка на контейнер OpenAM, используемый Flask, специфична для сети Docker. Кроме того, порт контейнера OpenAM отличается. Другими словами, маршрутизация между двумя сетями отсутствует.
Идеи решений:
Упрощенная докер-компоновка:
version: "3.4"
services:
openam:
image: openidentityplatform/openam
ports:
- 5001:8080
command: /usr/local/tomcat/bin/catalina.sh run
flask:
build: ./SimpleHTTPServer
ports:
- 5002:8000
command: python -m http.server 8000
Лучшее решение, которое я смог найти до сих пор. Он не служит для производства. Тем не менее, для создания прототипа или просто для имитации структуры сервера с помощью контейнеров это простая настройка.
Главная идея: Разверните третий контейнер VNC с запущенным веб-браузером и перенаправьте порт этого третьего контейнера на локальный компьютер. Поскольку третий контейнер является частью сети докеров, он может естественным образом разрешать внутренние доменные имена, а установка VNC на вашем локальном компьютере позволяет вам взаимодействовать с графическими интерфейсами.
Подход
Шаг за шагом
version: "3.4"
services:
openam:
image: openidentityplatform/openam
ports:
- 5001:8080
command: /usr/local/tomcat/bin/catalina.sh run
flask:
build: ./SimpleHTTPServer
ports:
- 5002:8000
command: python -m http.server 8000
firefoxVnc:
container_name: firefoxVnc
image: creack/firefox-vnc
ports:
- 5900:5900
environment:
- HOME=/
command: x11vnc -forever -usepw -create
docker-compose up
$ vim ~/.ssh/config
и добавьте следующие строки:Host *
ForwardAgent yes
ForwardX11 yes
$ vim /etc/ssh/sshd_config
и отредактируйте следующие строки:X11Forwarding yes
X11DisplayOffset 10
ssh -v -X -L 5900:localhost:5900 gw.example.com
1234
, который был установлен в исходном файле Dockerfile образа VNC-дикера (см. сообщение creack, ссылка на которое приведена выше).openam:8080/openam/
или apache:80
в браузере сеанса VNC localhost:5900
.Еще лучшее решение, чистое и простое, а также прекрасно работающее при запуске частей приложения на разных виртуальных машинах.
$ ssh -N -D 9090 [USER]@[SERVER_IP]
New Profile > Proxy Profile
, нажав create
, введя тот же IP-адрес сервера, что и для команды ssh, и порт 9090
."/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
--user-data-dir = "$HOME/proxy-profile" \
--proxy-server = "socks5://localhost:9090"
Руководство Как настроить туннель SSH SOCKS для частного просмотра объясняет, как настроить туннель SSH SOCKS под управлением Mac, Windows или Linux и с использованием Google Chrome или Firefox. Я просто сослался на настройку для macOS и Crome на случай, если ссылка исчезнет.
Спасибо за предложение! Шаблон шлюза API Криса Ричардсона кажется многообещающим. Проверяем его пример ftgo-api-gateway: Он реализовал архитектуру с помощью Spring Cloud Gateway, запустив свое приложение в одном контейнере. Любые предложения о том, как реализовать эту архитектуру для приложения, распределенного по нескольким контейнерам и использующего flask в качестве шлюза? Как направить весь контейнерный трафик через один контейнер шлюза? Использование перенаправления Flask сталкивается с той же проблемой, что и выше.