Как лучше организовать структуру сервера на aws с docker контейнерами?
Есть REST api на java, сайт на React, и база MySQL. Соответственно api написанное на java работает с базой, и по запросу с фронта, который написан на React, отдает ему данные. Я хочу развернуть все это на aws с использованием docker контейнеров. Вопрос заключается в том, как правильно это все организовать. Мне не нужен подробный туториал с описанием как это делать, просто вкратце рассказать, как организовать это дело.
Развернуть 3 docker контейнера внутри одного инстанса aws?
Или же под базу докер не нужен, а пусть она работает непосредственно на самом инстансе, а сделать 2 докера, один под api другой под react?
Мне на ум пришли только эти два варианта, как можно поступить ещё?
Имхо - для начала каждую сущность оборачиваем в контейнер, заставляем уметь работать или в единственном экземпляре, или в режиме нескольких инстансов. То есть, к API должен быть какой-то load balancer, веб сервер тоже с несколькими воркерами надо дружить, база тоже по мануалам масштабируется при появлении нескольких контейнеров.
Когда вся система готова масштабироваться, запиливаем потребный для текущей нагрузки сетап. Тут преимущество докера - в легкости миграции с одной машинки на класер: можно начать с одного инстанса где все контейнера крутятся, до вынесения любого компонента на любое количество экземпляров.
Так как в вопросе фигурирует AWS, то и поднимать все нужно с учетом сервисов, которые предоставляет AWS. Никаких трех контейнеров на инстанс!
Итак, по пунктам:
Для начала поднимаем и настраиваем VPC. Соевую заюзать готовый шаблон для Cloudformation. их можно легко найти на Github
БД - AWS RDS - легко сетапится, можно с репликацией, можно без
для API поднимаем Elastic Beanstalk с load balancer
статику грузим в S3
к S3 со статикой прикручиваем Cloudfront - в качестве CDN, так как раздача статики с S3 дороже, чем с Cloudfront
Настраиваем Route53: корневой домен через ALIAS -> Cloudfront, api.domain.com, через CNAME на URL от Elasticbeanstalk
Итого: нужен только один докер контейнер - для API.