Как развернуть многомодульную весеннюю загрузку maven в контейнер Docker

Я настраиваю многомодульный проект maven и пытаюсь развернуть его в докере для типичного трехслойного проекта с отдельным контейнером для MYSQL БД.

дерево проекта

Я проводил такие исследования в Интернете и натолкнулся на docker-compose концепцию, если я правильно понимаю с YAML файлом конфигурации, вы можете развернуть каждый файл jar в другом контейнере и заставить их работать вместе, это единственный подход в мое дело?

Могу ли я создать один только jar файл из трех модулей и развернуть его в контейнере? В моем случае мне не нужно рассматривать каждый проект как отдельный микросервис. С другой стороны, мне нужна компоновка докеров, потому что помимо моего проекта spring boot вам нужно запустить контейнер с MYSQL DB и подключить его к spring-boot.

Я не уверен, как подойти к этому сценарию, заранее спасибо за любой совет.


person Ricki    schedule 02.08.2019    source источник
comment
Разве ваш веб-модуль не зависит от других? Есть ли отдельный модуль api? Думаю, вам нужно больше рассказать о своей архитектуре.   -  person Robert Moskal    schedule 02.08.2019
comment
да, это так, Интернет зависит от домена, а домен зависит от постоянства да, они разделены, каждый проект представляет собой отдельный модуль, представляющий слой   -  person Ricki    schedule 02.08.2019


Ответы (3)


Не путайте n-уровни в вашем приложении с архитектурой микросервисов.

Микросервисы - это отдельные единицы развертывания, которые обмениваются данными между собой по какому-то протоколу (http, шина сообщений и т. Д.). Вызов функции в процессе (из одной банки в другую) - это не так, поэтому ваши отдельные модули maven не являются кандидатами на размещение в контейнерах и оркестровку с помощью docker-compose.

Если ваше веб-приложение взаимодействует с уровнем домена через, скажем, спокойный api, вы можете использовать docker compose для запуска двух отдельных контейнеров.

Но если, что вполне вероятно, ваш «api» обрабатывается контроллерами в веб-приложении, выполняющими внутрипроцессные вызовы на уровень вашего домена, у вас есть только один контейнер для создания и развертывания.

По-прежнему могут быть веские причины для контейнеризации вашего монолитного приложения. Возможно, он имеет сложные зависимости от ОС и / или вы хотите развернуть его на PAAS, например AWS Fargate или gCloud.

Возможно, вы все равно захотите использовать docker-compose для развертывания mysql в контейнере вместе с вашим веб-приложением.

person Robert Moskal    schedule 02.08.2019
comment
Если я правильно понимаю, тот факт, что у вас есть 3 Jars, не означает, что вы должны развертывать их отдельно? приложение - это просто Spring rest-api, ничего важного, поэтому вы предлагаете, если у меня есть зависимости между ними, я в порядке, если я разверну только веб-модуль? зависимости настроены, как вы сказали, через maven, связывая постоянство с уровнем домена и Интернет с уровнем домена - person Ricki; 02.08.2019
comment
Ага. Контейнеры - не решение, позволяющее банкам разговаривать друг с другом! - person Robert Moskal; 02.08.2019
comment
Спасибо за разъяснение концепций, попробую развернуть веб-модуль и посмотреть, что будет - person Ricki; 02.08.2019
comment
с другой стороны, я мог бы включить в docker-файл maven и собрать проект в контейнере - person Ricki; 02.08.2019

Согласитесь с Робертом, каждый jar / модуль в большинстве случаев не соответствует одному образу Docker (и, следовательно, контейнеру).

Я хотел добавить, что каждое загрузочное приложение (т.е. каждый класс с основным методом), скорее всего, окажется в своем собственном контейнере (не всегда, но это хорошее практическое правило). Это связано с тем, что каждый образ Docker может иметь одну точку входа, которая на самом деле является просто командой, выполняемой для запуска контейнера. Таким образом, каждый созданный вами основной метод является хорошим кандидатом для размещения в собственном контейнере, поскольку команда java может выполнять только один основной метод при запуске.

Docker Compose отлично подходит для совместной автоматизации запуска контейнеров, но это лишь один из многих инструментов, которые могут это сделать (docker swarm, rancher и kubernetes - другие инструменты, на которые вы можете посмотреть). Однако имейте в виду, что это и другие высокопроизводительные услуги высокого качества и, вероятно, излишки для простых установок для разработки или тестирования. Docker Compose отлично подходит для случаев, когда вам не нужно автоматическое масштабирование, отказоустойчивость, сложные политики безопасности, управление секретами и т. Д.

person Mike    schedule 04.08.2019

Я думаю, вы пытаетесь докеризовать свой многомодульный проект maven.

В этом случае вам нужно докеризовать свой толстый Jar из модуля, который содержит ваше загрузочное приложение @SpringBootApplication (например, веб), а не все файлы jar из разных модулей. Они будут автоматически включены как внутренние зависимости в ваш основной модуль (например, веб).

Вы можете найти в конце образы оптимизированных докеров для приложений Spring Boot с разделение на слои, посвященное тому, как докеризовать многомодульный проект.

person redoff    schedule 16.11.2020