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, базы данных)

Т.е. как научиться разворачивать большой проект на голый сервер в приемлимое время. + иметь возможность быстро поставить это на компьютере нового разработчика в команде (Как минимум в виртуалку)
  • Вопрос задан
  • 4484 просмотра
Решения вопроса 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
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы