Использование докеров, кукольных и дженкинсов для непрерывной доставки и развертывания 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, которые можно сохранить в репозитории и использовать для развертывания экземпляров вашей версии приложения.
  • База данных будет примером "службы поддержки ", которую вы можете подключить к своему приложению во время создания приложения. Обновление будет означать остановку одной версии приложения и запуск другой, подключенной к той же базе данных.