Помогите разобраться в вопросе деплоя php приложения которое работает в dockere. Есть например php приложение, есть его код в каком нибудь version control system, приложение имеет n инстансов, которые могут размещаться на разных серверах. Имеется какой-то свой docker image в котором устанавливается php-fpm определенной версии, различные php extension необходимые для функционирование приложения. И если мы хотим настроить автодеплой при помощи какого либо CI\CD tools(Jenkins, Gitlab CI\CD etc), правильно ли я понимаю алгоритм и процесс как это должно происходить?
В нашем CI\CD pipeline, который сперва делает checkout нужной нам ветки из VCS, далее мы билдим контейнер с php(код php в контейнер попадает путем COPY команды), далее выполняем composer install(так как vendor папку не храним в VCS), далее запускаем тесты\анализаторы кода и тд, если проверки прошли успешно делаем docker push в какой либо registry(docker, gitlab etc), правильно ли понимаю что в registry пушим образ в котором кроме самого php-fpm и его extension, должен присутствовать код приложения (с vendor и тд)? Далее на целевых серверах делаем docker pull только что созданного образа и docker run.
Alexey Dmitriev, Работать будет и если через ftp архив с кодом загружать, вопрос в том насколько мной описаный алгоритм соответствует devops практикам и best practices по использованию docker
Markusam, полностью соответствует, только есть нюанс с docker pull на серверах, из-за рестарта контейнера у тебя будет downtime, стоит подумать над использованием какого либо оркестратора контейнеров
Надо не забыть про миграции БД и откат миграций в случае если pipeline упадёт с ошибкой.
А ещё могут понадобится фоновые процессы, например обработчики очередей или запускать что-то через cron.
А ещё могут понадобится фоновые процессы, например обработчики очередей или запускать что-то через cron.
На практике сталкивался только с тем что всякие фоновые процессы помещали обычно в тот же контейнер что и веб приложении и за процессом обычно присматривал supervisor. Насколько знаю это не совсем правильная практика, рекомендуются под каждый процесс по контейнеру. А не будет ли это слишком накладно по ресурсам? И насколько понимаю тогда под фоновые процессы надо создавать отдельный docker image(php-cli) Надо ли в связи с этим тогда переделывать архитектуру приложения?
В целом все правильно.
Насчет деплоя - есть нюансы
- как CD pipeline знает адреса серверов? В современном "облачном" окружении они часто меняются, нужен какой-то метод для их динамического получения
- как обеспечить бесперебойную работу приложения во время деплоя?
В облаках (AWS/GCP/ наверно и Yandex) есть managed services, которые сами умеют решать эти и другие (autoscaling) проблемы. В AWS это ECS, Elastic Beanstalk, AWS App Runner, managed K8S.
как CD pipeline знает адреса серверов? В современном "облачном" окружении они часто меняются, нужен какой-то метод для их динамического получения
В самом скрипте pipeline адрес сервера можно записать как переменную и при деплое(тогда это должен быть по идеи отдельный pipeline?) передавать это значение, ну это если адреса не меняются динамически.
как обеспечить бесперебойную работу приложения во время деплоя?
Ну это тогда надо внедрять green\blue deployment?
Либо как я понимаю ответом на все это есть как вы указали managed services? Но это при использовании клауд решений(если какой нибудь hetzner брать то там такого может не быть?)
P.S. Прошу прощения за возможно глупые вопросы, потому что в devops практиках не гуру