Docker — архитектурные вопросы о деплое и не тольно?

Доброго времени суток, вопросы к людям, которые умеют Docker

1) Как организовать доступ к нескольких сайтам по домену с хоста?
Я сделал так: прокинул порт nginx и в hosts прописал 127.0.0.1 api.domain.local

Но если несколько контейнеров в nginx будут?

2) Как организовать деплой нескольких php-проектов используя докер?
Сейчас думаю так:
Отдельный репозиторий для docker-environment'a, отдельный репо для каждого php-проекта, дальше их git clone, и потом просто папку с проектами маунтим в php и nginx контейнеры. Порты nginx прокинуты.

3) Где держать крон для запуска задач?
Внутри контейнера, в котором находится сам скрипт для выполнения задачи?
Сделать отдельный контейнер для крона (Но как тогда запускать задачи из других контейнеров, даже если они (контейнеры) в одной сети)?
Или держать крон на host системе?

Как я понимаю, правильный путь: держать cron и его таски на хост системы, а сами jobs запускать как docker exec ...?

4) Как обновлять софт в докер-контейнере? Например сейчас у меня через apt-get install в Dockerfile ставится версия libxml2-dev (2.9.1), а последняя 2.9.3.
Как организуется обновление до последних версий софта?
Весь софт руками перерывать?
И если например apt-get update && apt-get upgrade в докер-файле писать, не будет ли так, что в dev, stage, prod environment версии софта будут различные?

5) Можно ли билдить image где-то на своем сервере, и оттуда забирать уже на другие машины?
Что-бы только билд-сервер отвечал за билд, а все остальные пользовались тем, что он выдает. (Образы ведь должны быть одинаковые на всех этапах разработки)

6) Правильно ли держать композер в контейнере с PHP?
Если нет, то как его выносить в отдельный контейнер? Наследоваться от контейнера с пхп и билдить для каждого проекта отдельно?
А если держать его внутри контейнера, то, получается, что в его скриптах нельзя прописывать npm install, так как ноду надо держать отдельно, как в таком случае организовать развертку правильно? Разнести все сборщики в отдельные контейнеры и на хосте собирать?

6.5) Где вообще держать вещи типа: composer, npm, gulp, webpack, bower?

7) Нужен ли композер на проде или туда уже все должно приходить вместе с Docker-Image?

8) Сборщик логов/дампер баз располагать в контейнере с проектом? Или отдельный контейнер для каждого? Или на хосте держать?

9) Как вы организовываете развертывание проекта состоящего из нескольких приложений (Под приложением имею ввиду например: api на php, воркер на node, демон - на С++, блог на WP, базы данных)

Т.е. как научиться разворачивать большой проект на голый сервер в приемлимое время. + иметь возможность быстро поставить это на компьютере нового разработчика в команде (Как минимум в виртуалку)
  • Вопрос задан
  • 4488 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
1) nginx-proxy
2) копируйте исходники в образ (в dockerfile), собирайте либо локально либо на CI-сервере эти образы и пушьте их в docker/distribution (либо платный docker-hub либо разверните свой, это с докером делается за минут 10).
3) Прямо в контейнере с PHP. Либо заведите отдельный контейнер для php-cli и зачедите отдельный контейнер для исходников, и через volumes_from расшарьте между ними. Вариант с cron на хосте тоже достоен существования, но это не ок в большинстве случаев.
4) обновлять базовый образ. А там уж как организуетесь.
5) Можно, смотрим пункт 2.
6) Вообще тут можно схитрить. Вы можете же хранить зависимости прямо в репозитории, в смысле коммитить вендоры. Но вы этого не делаете. На момент когда запускается docker build ваших образов, все зависимости уже должны поставиться. И для каждого из перечисленных вами средств разработки уже есть свой контейнер, готовый. Берем и юзаем.
7) как мы выяснили в пункте 6 - композера на проде быть не должно. вообще как, вы оттещенный образ со стэйджинга должны просто "мувать" на продакшен. В этом плане риски при релизе минимальны.
8) тут опять же по разному. Мне удобнее прямо из контейнера коннектиться например в sentry или graylog и скидывать туда логи. Ну или мы должны пихать логи в stdout/stderr контейнера и далее агрегировать их снаружи, тут так же есть куча вариантов.
9) все это отдельные контейнеры, все это вместе связывается башем и docker-compose. Все это разварачивается либо через docker-machine и CI либо просто через CI. Docker-machine будет "удобным" только с версии 0.7 или 0.8.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@jamaZ
Зачем в наше время пилить Docker вручную, когда есть Nomad, Kubernetes, Mesos, Swarm, Cocaine или, на худой конец Consul
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы