Докеризация нескольких веб-приложений, размещенных на EC2: оптимизация размера контейнера и обработка портов

Мой работодатель заинтересован в использовании Docker для контейнеризации своих веб-приложений. Мы используем AWS EC2 для размещения наших приложений, в котором запущен Tomcat, обслуживающий несколько WAR. Я новичок в Docker и мне нужно выяснить, как лучше с этим справиться.

Насколько я понимаю, неправильно иметь в одном контейнере Docker несколько веб-приложений. Поэтому для каждого приложения я должен создать контейнер из базового образа Tomcat и просто скопировать WAR в каталог tomcat / webapps, как в Dockerfile:

FROM tomcat:9.0.44-jdk11-openjdk

COPY ./target/my-app-1.00-SNAPSHOT.war $CATALINA_HOME/webapps/my-app.war  

Достаточно просто, отлично работает. Но образ Tomcat составляет 440 МБ. Итак, если у нас есть Tomcat, в настоящее время выполняющий 5 файлов WAR, каждый размером 50 МБ или около того, и каждый из них получает свой собственный контейнер с Tomcat, мы ожидаем десятикратного увеличения размера для каждого приложения. Это кажется ... действительно неэффективным. Неужели это стоимость использования контейнеров Docker? Как я могу это свести к минимуму?

Я тоже не уверен, как обрабатывать порты. Прямо сейчас порт 8080 сопоставлен с subdomain.mydomain.com. Но каждый контейнер, очевидно, будет работать в другом порту. Допустим, я запускаю контейнер для my-app-1 на порту 8080 и контейнер для my-app-2 на 8081. Как я могу позволить пользователям просто переходить на subdomain.mydomain.com/my-app-1, и subdomain.mydomain.com/my-app-2?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
33
1

Ответы 1

Дисковое хранилище

Образ Docker - это в основном список слоев (см. Технические характеристики), смонтированных с использованием файловая система union (обычно overlay2), что значительно сокращает объем необходимого физического хранилища. Нижние уровни доступны только для чтения и могут использоваться разными контейнерами.

Для 5 разных приложений вам понадобится 50 * 5 + 440 МБ. Единственное отличие от вашей текущей конфигурации - около 50 МБ образа Debian (см. информация о репо). Вы можете еще больше уменьшить его, экспортируя общие библиотеки, используемые в ваших приложениях, в общий загрузчик классов Tomcat и создав образ Docker, совместно используемый приложениями: каждый Tomcat в любом случае будет иметь одно приложение, поэтому изоляция между приложениями гарантирована.

объем памяти

Основное отличие от вашей текущей конфигурации - потребление памяти: у вас будет 5 запущенных JVM + библиотеки Tomcat.

Конфигурация сети

Внутри каждый контейнер будет прослушивать тот же порт, но на другом частном адресе (подключенном к виртуальному сетевому устройству, см. сеть). Docker может настроить переадресацию портов (NAT) от порта хост-системы к контейнеру докера, но это полезно только в том случае, если вы хотите получить доступ к напрямую службе, работающей в контейнере, из Интернета.

В вашем случае вам скорее понадобится запустить обратный прокси в хост-системе, например NGINX или Сервер Apache Http. Это обеспечит эквивалент объединенной файловой системы для вашего пространства имен URL.

Выбор обратного прокси - дело вкуса:

  • Apache2 может использовать протокол AJP (через mod_jk или более свежие модули mod_proxy_ajp), который будет перенаправлять каждую деталь клиентского соединения в Tomcat без какой-либо конфигурации.
  • NGINX меньше по размеру и поддерживает только HTTP, поэтому вам нужно настроить RemoteIpValve и SSLValve.

Однако Tomcat постепенно отказывается от AJP в пользу простого HTTP (см. этот разговор).

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