Использование докеров, кукольных и дженкинсов для непрерывной доставки и развертывания PROD
Необходимо настроить инфраструктуру для нового проекта. Раньше я использовал марионетку отдельно с дженкинсами, но теперь я думаю о включении сборников докеров, так что я мог бы продвигаться от разработчика к стадии до производства, не запуская сборку, а просто получая докерные изображения докеров, которые уже были встроенный.
Приложение:
- Веб-приложение Java с поддержкой api при поддержке postgresql, neo4j, elasticsearch
- Клиентское приложение, написанное с помощью angular, которое разговаривает с java через rest api
- Код, хранящийся в репозиториях git
Envs:
- Сервер Dev (создание, dev + тестовые среды) - 32-гигабайтная Linux-машина
- Сервер тестирования (AWS)
- Производство (AWS)
Настройка:
Так что в основном я думал примерно так:
- Отдельные изображения Docker для приложения java + cient side, postgresql, elasticsearch, neo4j, которые разговаривают друг с другом и хранят свои данные на хостах через тома Docker, или используя контейнеры данных Docker (еще не определились с подходом)
- Дженкинс строит весь код и создает изображения Docker, которые будут перенесены в закрытый внутренний репозиторий.
- Тестирование интеграции выполняется с модулем док-станции Puppet на сервере DEV
- Нажмите на производство с дженкинсами через марионетку с помощью Docker
Почему я должен использовать докер?
- Big dev machine - может легко запускать несколько приложений моего приложения без необходимости виртуализации (может иметь неустойчивый dev, стабильный dev, sit и т.д.).
- Простота развертывания (используйте докер и модуль кукольного докера) и откат (просто загрузите предыдущую версию из репозитория Docker)
- Быстрая миграция и возможность запуска новых экземпляров
- Подготовка к простому масштабированию различных частей системы (например, кластеризация elasticsearch)
Вопросы
- Это выглядит разумно?
- Я думаю об использовании этого кукольного модуля https://github.com/garethr/garethr-docker. Как обновить мои среды через него? Я должен как-то остановить контейнер докеров, сделать докер rm, а затем запустить докер?
- Мы используем Liquibase для управления обновлением базы данных. Угадайте, что это должно идти отдельно от докеров для обновлений/откатов?
Любые предложения приветствуются, спасибо.
Ответы
Ответ 1
Вы создаете контейнер, организованный PAAS. Мой совет, чтобы посмотреть на аналогичные системы для лучших практик, которые могут быть эмулированы.
Первое место для начала - это сайт с 12 факторами, написанный одним из соучредителей Heroku. Сайт невероятно полезен, описывая некоторые из желательных эксплуатационных характеристик современного приложения облачной шкалы. Следующей остановкой будет сам Героку, чтобы получить представление о том, как может выглядеть/ "современная" среда разработки и развертывания.
Я также рекомендую взглянуть на некоторые из новых платформ PAAS с открытым исходным кодом. Большие поддерживаемые вендором системы, такие как Cloud Foundry и Openshift все это ярость на данный момент, но появляются более простые решения (построенные на docker). Один из них, Deis, использует связанную технологию Chef, так что может дать некоторое представление о том, как марионетка может использоваться для управления вашими контейнерами докеров-контейнеров. (Modern Deis больше не использует шеф-повара)
Ответы:
- Да, это вполне разумно.
- Вместо управления "средами", сделайте так, как это делает Heroku, и просто создайте новое приложение для каждой версии вашего приложения. Это шаблон Build, Release, Run. В вашем случае Jenkins запускается с помощью нового кода, создает изображения Docker, которые можно сохранить в репозитории и использовать для развертывания экземпляров вашей версии приложения.
- База данных будет примером "службы поддержки ", которую вы можете подключить к своему приложению во время создания приложения. Обновление будет означать остановку одной версии приложения и запуск другой, подключенной к той же базе данных.