Как правильно сбилдить, залить и запустить на проде контейнеры docker compose?
Добрый вечер.
Есть простой docker-compose из трех контейнеров nginx, mysql, php-fpm, все как обычно.
По команде docker compose build билдятся образы, после чего docker compose up их запускает, и на локальной машине всё прекрасно.
Но как теперь передать и запустить их на проде?
Очевидный вариант - скопировать всю папку проекта, запустить docker compose build там и радоваться, понятное дело, не подходит.
Я пробовал вариант с docker save/docker load:
- приходится прописывать save/load вручную для каждого образа;
- так же вручную делать docker create (по сути заменяя собой весь docker compose для оркестрации);
Я пробовал вариант с docker save/docker load, после чего вручную скопировал Dockerfile и docker-compose.yml и сделал docker compose up - в результате он попытался ещё раз сбилдить все образы по-новой, естественно не нашел файлов проекта и упал.
И конечно же я попробовал export DOCKER_HOST=ssh://prod.example.com, и выполнять docker compose внутри него. Проблем с ним не возникло - но меня смущает необходимость гадить себе в переменные окружения, не говоря уже о том, что я явно когда-то забуду про неё, и выполню на проде то, что не стоит.
Собственно, вопрос в заголовке: как правильно задеплоить контейнеры docker compose?
Билд делается один раз. Обычно разработчик это делает. Потом делают push в удаленный регистри. Указывают версию. Тег. В registry появляется образ всей системы (приложения в данном случае). После этого на проде можно поднять новую версию по указанному тегу. Вообще я думаю схем развертывания может быть много. Но на проде никаких компилляций обычно не делают.
Обычно образ делается в системах CI/CD, связанных с VCS, т.е. фиксация кода вызывает экшен (GitHub Actions/GitLab CI/CD, CircleCI и пр.), при котором на внешних мощностях из кода строится образ, которому присваивается версия и он загружается (с docker push) на хранилище образов (AWS ECR, JFrog Artifactory и т.д.), а оттуда скачивается (docker pull) на продакшен машине при запуске docker compose или в другой среде оркестрации контейнеров.
То есть, правильно ли я понимаю, что без docker registry (на отдельной машине или на самом же продакшн-сервере) не обойтись?
Просто для моих целей (пара деплоев в месяц, полтора разработчика, 1 инстанс приложения в прыжке) держать прямо всю ентерпрайз-инфраструктуру кажется слишком - мне бы подошел более простой вариант уровня "скопировали файлик, запустили команду", если такой существует.