Учитывая перенаправление URL-адресов: как использовать графические интерфейсы веб-приложений, работающих в разных контейнерах в одной сети докеров на удаленном сервере?

У меня такое чувство, что я упускаю из виду что-то очевидное, поскольку мои решения/идеи до сих пор кажутся слишком громоздкими. Я интенсивно искал хорошее решение, но пока безуспешно - вероятно, потому, что я не знаю, что искать.

Вопрос: Как вы взаимодействуете с графическими интерфейсами веб-серверов, работающих в разных контейнерах (в пределах одной сети Docker) на удаленном сервере, учитывая перенаправления URL между этими контейнерами?

Исходная ситуация: У меня есть два контейнера (веб-приложение Flask и сервер Tomcat с работающим на нем OpenAM), работающие на моем узле докеров (Azure-VM).

  • На виртуальной машине я могу выводить содержимое обоих контейнеров через открытые порты.
  • Используя переадресацию портов ssh, я могу взаимодействовать с графическими компонентами обоих контейнеров на моей локальной машине.
  • Оба контейнера были созданы с помощью одного и того же docker-compose, и к ним можно получить доступ через их доменное имя без дополнительных сетевых настроек.

До сих пор я настраивал OpenAM на своем локальном компьютере, используя переадресацию портов ssh.

Проблема: Веб-приложение Flask ссылается на OpenAM по его доменному имени, определенному в docker-compose, и наоборот. Я перенаправляю на свою локальную машину порт контейнера Flask. Приложение Flask запущено, и я могу взаимодействовать с ним в своем браузере. Система дает сбой, как только я перенаправляюсь с Flask на OpenAM на моем локальном компьютере, потому что ссылка на контейнер OpenAM, используемый Flask, специфична для сети Docker. Кроме того, порт контейнера OpenAM отличается. Другими словами, маршрутизация между двумя сетями отсутствует.

Идеи решений:

  • Выполняйте запросы на виртуальной машине с помощью инструментов командной строки.
  • Используйте контейнер с безголовым браузером, который автоматически выполняет запросы.
  • Используйте настройку сети «Хост» и вместо этого запустите безголовый браузер на виртуальной машине.
  • Направляйте все запросы через один контейнер (аналогично VPN) и используйте переадресацию портов ssh.

Упрощенная докер-компоновка:

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
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
2
0
281
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Route all requests through a single container - Это правильный подход.

См. Шаблон API-шлюза

Спасибо за предложение! Шаблон шлюза API Криса Ричардсона кажется многообещающим. Проверяем его пример ftgo-api-gateway: Он реализовал архитектуру с помощью Spring Cloud Gateway, запустив свое приложение в одном контейнере. Любые предложения о том, как реализовать эту архитектуру для приложения, распределенного по нескольким контейнерам и использующего flask в качестве шлюза? Как направить весь контейнерный трафик через один контейнер шлюза? Использование перенаправления Flask сталкивается с той же проблемой, что и выше.

L.Lauenburg 10.12.2020 09:35

Лучшее решение, которое я смог найти до сих пор. Он не служит для производства. Тем не менее, для создания прототипа или просто для имитации структуры сервера с помощью контейнеров это простая настройка.

Главная идея: Разверните третий контейнер VNC с запущенным веб-браузером и перенаправьте порт этого третьего контейнера на локальный компьютер. Поскольку третий контейнер является частью сети докеров, он может естественным образом разрешать внутренние доменные имена, а установка VNC на вашем локальном компьютере позволяет вам взаимодействовать с графическими интерфейсами.

Подход

  1. Добавьте VNC в docker-compose исходного вопроса.
  2. Включите переадресацию X11 на сервере и на стороне клиента.
  3. Пробросьте порт контейнера VNC с помощью ssh.
  4. Установите VNC на клиенте, запустите новый сеанс и введите предопределенный пароль.
  5. Попробуйте.

Шаг за шагом

  1. Добавьте контейнер VNC (вдохновленный сообщением creack в stackoverflow) в файл docker-compose из исходного вопроса:
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: docker-compose up
  1. Включите переадресацию X11 на сервере и на стороне клиента.
  • На стороне клиента $ vim ~/.ssh/config и добавьте следующие строки:
Host * 
ForwardAgent yes 
ForwardX11 yes
  • На стороне сервера запустите $ vim /etc/ssh/sshd_config и отредактируйте следующие строки:
X11Forwarding yes 
X11DisplayOffset 10
  1. Переадресовать порт контейнера VNC с помощью ssh
ssh -v -X -L 5900:localhost:5900 gw.example.com
  • Обязательно включите флаг -X для X11. Флаг -v предназначен только для отладки.
  1. Установите VNC на клиенте, запустите новый сеанс и введите предустановленный пароль.
  • Установите программу просмотра VNC на свой локальный компьютер.
  • Откройте установленную программу просмотра и начните новую сессию, используя перенаправленный адрес localhost:59000.
  • При появлении запроса введите пароль 1234, который был установлен в исходном файле Dockerfile образа VNC-дикера (см. сообщение creack, ссылка на которое приведена выше).
  1. Теперь вы можете перейти к openam:8080/openam/ или apache:80 в браузере сеанса VNC localhost:5900.
Ответ принят как подходящий

Еще лучшее решение, чистое и простое, а также прекрасно работающее при запуске частей приложения на разных виртуальных машинах.

Настройка и использование туннеля SSH SOCKS

Для Google Chrome и macOS:

  • Установите настройки сети для размещения в Dockerfile или docker-compose.
  • Запустите SSH-туннель:
$ ssh -N -D 9090 [USER]@[SERVER_IP]
  • Добавьте прокси-аддон SwitchyOmega в браузер Chrome.
  • Настройте SwitchyOmega, перейдя к 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"
  • Откроется новый сеанс Crome, в котором вы можете просто просматривать свои приложения Docker.

Ссылка | При работе с Linux или Windows | Использование Firefox (дополнение не требуется)

Руководство Как настроить туннель SSH SOCKS для частного просмотра объясняет, как настроить туннель SSH SOCKS под управлением Mac, Windows или Linux и с использованием Google Chrome или Firefox. Я просто сослался на настройку для macOS и Crome на случай, если ссылка исчезнет.

Другие вопросы по теме