Мой работодатель заинтересован в использовании 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?





Образ Docker - это в основном список слоев (см. Технические характеристики), смонтированных с использованием файловая система union (обычно overlay2), что значительно сокращает объем необходимого физического хранилища. Нижние уровни доступны только для чтения и могут использоваться разными контейнерами.
Для 5 разных приложений вам понадобится 50 * 5 + 440 МБ. Единственное отличие от вашей текущей конфигурации - около 50 МБ образа Debian (см. информация о репо). Вы можете еще больше уменьшить его, экспортируя общие библиотеки, используемые в ваших приложениях, в общий загрузчик классов Tomcat и создав образ Docker, совместно используемый приложениями: каждый Tomcat в любом случае будет иметь одно приложение, поэтому изоляция между приложениями гарантирована.
Основное отличие от вашей текущей конфигурации - потребление памяти: у вас будет 5 запущенных JVM + библиотеки Tomcat.
Внутри каждый контейнер будет прослушивать тот же порт, но на другом частном адресе (подключенном к виртуальному сетевому устройству, см. сеть). Docker может настроить переадресацию портов (NAT) от порта хост-системы к контейнеру докера, но это полезно только в том случае, если вы хотите получить доступ к напрямую службе, работающей в контейнере, из Интернета.
В вашем случае вам скорее понадобится запустить обратный прокси в хост-системе, например NGINX или Сервер Apache Http. Это обеспечит эквивалент объединенной файловой системы для вашего пространства имен URL.
Выбор обратного прокси - дело вкуса:
mod_jk или более свежие модули mod_proxy_ajp), который будет перенаправлять каждую деталь клиентского соединения в Tomcat без какой-либо конфигурации.RemoteIpValve и SSLValve.Однако Tomcat постепенно отказывается от AJP в пользу простого HTTP (см. этот разговор).