Я использую docker-compose в среде разработки с docker-compose.yml
файлом, в котором перечислены все необходимые мне контейнеры.
Также у меня есть централизованный репозиторий git, сервер Jenkins и еще один сервер, на котором я собираюсь хранить как промежуточные, так и производственные версии.
Поэтому вопрос в том, как лучше организовать процесс развертывания.
Теперь git push
на стороне сервера git запускается задание сборки Jenkins. В зависимости от имени ветки (staging или production) будут запущены разные задания.
Задание сборки использует docker-compose для запуска всей среды и запуска тестов. Как мне затем отправить новые контейнеры в среду staging/production?
Один из способов — отправить их в частный или публичный реестр docker, но какова наилучшая практика обновления контейнеров в производстве? Должен ли сервер Jenkins просто подключаться по ssh и запускать команды raw kill
, rm
, pull
и run
? Я не вижу примеров.
решение1
Kubernetes, Docker Swarm или Rancher, вероятно, являются лучшими способами реализации так называемого скользящего обновления.
По сути, скользящее обновление берет набор контейнеров (известных как сервис) и обновляет их один за другим. Итак, представьте, что у вас есть три контейнера, на которых запущено ваше приложение, скользящее обновление отключит первый контейнер и обновит его и так далее, пока сервис не будет полностью обновлен. Это означает, что вы фактически получаете нулевое время простоя приложения, поскольку балансировщики нагрузки в этих продуктах интеллектуальны и не будут перенаправлять на обновление контейнеров.
По этой ссылке вы найдете базовую реализацию Swarm, запускающую службу и затем обновляющую ее.
Для некоторых из самых простых настроек и внедрений - по моему опыту, Rancher является хорошей отправной точкой для освоения всех этих концепций. По сути, это интерфейс поверх различных технологий Docker, таких как Kubernetes.