Ищу канонический вариант развертывания LEMP на docker

shark_255

Новичок
Ознакомился с docker-ом и хочу тестово развернуть у себя локально
банальную связку nginx+php+mysql.

Хотел бы это сделать сразу красиво, не городя костылей, быстрое гугление
приводит на такие решение https://github.com/stenote/docker-lemp
в которых все сервисы пихаются в один контейнер, что уже как бы противоречит
идее один сервис - один контейнер, в остальных вариантах нет логгирования,
и возможно того, с чем я возможно столкнусь, развернув эту всю махину на продакшене.

Если готового "канонического решение" нету, то хотелось бы советов от бывалых, чему нужно
уделить внимание в первую очередь и что важно.
 

AnrDaemon

Продвинутый новичок
Не "один сервис - один контейнер", а "одна задача - один контейнер".
Если задача "быстро развернуть девсервер", то "всё в один контейнер" - вполне себе допустимое решение.
 

shark_255

Новичок
Не "один сервис - один контейнер", а "одна задача - один контейнер".
Если задача "быстро развернуть девсервер", то "всё в один контейнер" - вполне себе допустимое решение.
Я слышал трактовку именно в контексте сервиса - основная аргументация, что если сервис ложится, то перезапускается контейнер,
его содержащий.
Понятное дело, что развернуть на коленке и такой вариант сойдет, но я как раз ищу вариант близкий к идеальному.
 

scorpion-ds

Новичок
Не настраивал Докер, но если я правильно понимаю, то конечный контейнер (сервис или в данном случай тестовый сервер) может состоять из других контейнеров, в каждом из которых уже установлены отдельно php, nginx и т.п., но для сборки этих слоев нужно дополнительное ПО, вроде "Docker Compose".

Впрочем у нас сейчас, все не так настроено, в "lite" контейнер при билде все каждый раз устанавливается, не быстро получается, порядка 3-4 минут, но пока почему-то так было сделано.

Кстати MySQL я бы не пихал в контейнер.
 

shark_255

Новичок
подразумевается что для разных систем "идеально" различно. возьми https://github.com/nanoninja/docker-nginx-php-mysql и ответь на вопрос "что в нем не идеально"
Неясно кому адресован вопрос, но, на всякий случай прокомментирую - ответить на что "близко к идеальному" может человек с высоким уровнем экспертности, я таковым не являюсь. Сугубо ИМХО, я бы вывел логи nginx, mysql, php etc тоже на хост.
 

WMix

герр M:)ller
Партнер клуба
Неясно кому адресован вопрос,
тебе
Сугубо ИМХО, я бы вывел логи nginx, mysql, php etc тоже на хост.
ну добавь по строчке для volumes
может человек с высоким уровнем экспертности, я таковым не являюсь.
обязательно добавь модуль для машинного обучения
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Если задача "быстро развернуть девсервер", то "всё в один контейнер" - вполне себе допустимое решение.
Такой задачи не должно быть - теряется смысл. Если запускаешь в контейнере стек swarm локально, на stage, в проде - получаешь идентичный runtime, идентичные версии всего.
Могу показать как я это делаю. Много конфигов, не очень быстро писать их, но очень удобно когда работает.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
подразумевается что для разных систем "идеально" различно. возьми https://github.com/nanoninja/docker-nginx-php-mysql и ответь на вопрос "что в нем не идеально"
1. "Docker Compose" - это утилита для разработки, про которую прямо пишут, что в проде не рекомендуется

2. https://hub.docker.com/r/nanoninja/php-fpm/ - а что делать, если нанониндзя забьет на 7.1, станет выпускать 7.2, а ваше приложение еще несовместимо?
что если нужен memcached, а image magic не нужен?
лучше использовать свой образ на базе https://hub.docker.com/_/php/
3. myadmin - seriously?

Да просто docker-compose.yml там очень личный
  • - "./etc/nginx/default.conf:/etc/nginx/conf.d/default.conf" - а что с остальными конфигами nginx? где fastcgi_params?
  • конфиг php - аналогично, нужна вся папка
  • MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - вместо этого надо использовать docker secrets
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
без если: мне такая конфигурация бесполезна, на ней не то, что кластер, даже сайт без микросервисов не запустить
 

AnrDaemon

Продвинутый новичок
Вооот. Тебе бесполезна.
Я же не говорю, что "моё решение единственно верное". Моё личное решение вообще из другой области и использованием других инструментов.
 

AmdY

Пью пиво
Команда форума
@grigori А вы докер в продакшене используете? было бы интересно почитать чего проверенного на практике.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
docker.tar.xz
это обрезанное содержимое папки docker, которая лежит в репозитории приложения,
стек запускается так:
Код:
$docker stack up -c stack.yml my_stack_name
докер должен быть в режиме swarm

поднимает nginx, mysql, php-fpm, инициализацию при первом старте, memcached,
монтирует приложение в контейнер php, папки htdocs в контейнер nginx, читает или монтирует конфиги, монтирует дамп для инициализации базы, создает и монтирует volumes куда какие надо
все образы официальные на базе alpine, кроме mysql - она его не умеет
образ php наследует от официального, добавлена пачка расширений, надо в него еще внести поддержку инициализации при первом старте, чтобы не делать это в отдельном контейнере
для выкладки в прод еще будет контейнер с кроном

в общем, это конфиг для разработки, который очень близок к тому, который будет на проде, главное различие - restart_policy и количество нод
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
Ага, спасибо. Я себе примерно так это и представлял, но пока что самому делать не приходилось.

все образы на базе alpine, кроме mysql - она его не умеет
Гм, а вот гуглится: https://www.google.com/search?q=docker+alpine+mysql&cad=h

Там какие-то проблемы? Если единственная проблема это необходимость glibc, то вроде это решаемо статической линковкой.

А вообще мыскль стандартно запускается какой-то дикой гребаниной на шелле, есть подозрение, что для контейнера это все можно выкинуть к черту и запускать mysqld напрямую.
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
я не хочу брать неизвестный образ, предпочитаю официальные, а официальная поддержка будет с 8ки
https://github.com/docker-library/mysql/issues/179

с официальными легко обновляться, просто командой docker pull,
а самому собирать каждую минорную версию мне лень :)
 
Сверху