Каким будет хороший рабочий процесс докеров webdev?

У меня есть догадка, что docker может значительно улучшить рабочий процесс webdev, но мне не удалось обойти вокруг того, как подходить к добавлению проекта докер в стек.

Основной стек программного обеспечения будет выглядеть следующим образом:

Программное обеспечение

  • Изображение Docker, предоставляющее пользовательский стек LAMP

    • Apache с несколькими модулями
    • MYSQL
    • PHP
    • Некоторые CMS, например. Silverstripe
  • GIT

Workflow

Я мог представить, что рабочий процесс выглядит примерно следующим образом:

Разработка

  • Напишите Dockerfile, который определяет LAMP-контейнер, отвечающий требованиям, указанным выше
    • REQ: машина должна запустить apache/mysql сразу после загрузки.
  • Создайте изображение докеров
  • Скопировать файлы, необходимые для запуска CMS, например. ~/dev/cmsdir
    • Поместите ~/dev/cmsdir/ под управлением версиями
  • Запустите контейнер докеров и как-то монтируйте ~/dev/cmsdir в /var/www/ в контейнере
  • Заполнение базы данных
  • Работайте в /dev/cmsdir/
  • Фиксировать и закрывать контейнер докеров

Развертывание

  • Настройка удаленного хоста (например, с невозможным)
  • Нажмите изображение контейнера на удаленный хост.
  • Fetch cmsdir -project через git
  • Запустите контейнер докеров, потяните в базу данных и установите cmsdir в /var/www

Теперь это выглядит неплохо на бумаге, но я не совсем уверен, что это будет правильный подход.

Вопросы:

  • При разработке локально, как я могу заставить базу данных сохраняться между перезагрузками экземпляра контейнера? Или мне нужно будет запускать sql-dump каждый раз, прежде чем откручивать контейнер?

  • Должен ли я иметь отдельные экземпляры контейнера для db и сервера apache? Или было бы достаточно, чтобы иметь один контейнер для вышеуказанного варианта использования?

  • Если вы используете отдельные контейнеры для базы данных и сервера, как я могу автоматизировать их одновременное форматирование?

  • Как я смогу монтировать /dev/cmsdir/ в контейнер /var/www/ -directory? Должен ли я использовать данные-тома для этого?

  • Я пропустил какие-то подводные камни? Все, что можно упростить?

Ответ 1

  • Если вам нужна стойкость базы данных к вашему контейнеру CMS, вы можете использовать один контейнер для MySQL и один контейнер для вашей CMS. В таком случае вы можете запустить свой контейнер MySQL, и вы можете повторно развернуть свою CMS так часто, как хотите независимо.

    Для разработки - другой вариант - сопоставить каталоги данных mysql с вашего компьютера хоста/разработки с использованием томов данных. Таким образом вы можете управлять файлами данных для mysql (в докере) с помощью git (на хосте) и "перезагрузить" начальное состояние в любое время (перед запуском контейнера mysql).

  • Да, я думаю, у вас должен быть отдельный контейнер для db.

  • Я использую только базовый script:

    #!/bin/bash
    
    $JOB1 = (docker run ... /usr/sbin/mysqld)
    $JOB2 = (docker run ... /usr/sbin/apache2)
    echo MySql=$JOB1, Apache=$JOB2
    
  • Да, вы можете использовать модули данных -v. Я бы использовал это для развития. Вы можете использовать установку только для чтения, поэтому вы не должны вносить изменения в этот каталог, если хотите (ваше приложение должно хранить данные где-то в другом месте).

    docker run -v=/home/user/dev/cmsdir:/var/www/cmsdir:ro image /usr/sbin/apache2
    

    В любом случае, для окончательного развертывания, я бы построил и образ с помощью файла docker с помощью ADD /home/user/dev/cmsdir /var/www/cmsdir

  • Я не знаю:-)

Ответ 2

Вы хотите использовать docker-compose. Следуйте инструкциям здесь. Очень просто. Кажется, отметьте все ваши поля.

https://docs.docker.com/compose/

Ответ 3

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

  • Вы можете настроить экземпляр docker MySQL и сохранить данные в контейнере данных без состояния, так как контейнер данных не должен активно запускаться

  • Да, я бы рекомендовал иметь отдельный экземпляр для вашего веб-сервера и базы данных. Это сила Докера.

  • Отметьте это репо, которое я создаю. В основном это так же просто, как make build и make run, и вы можете иметь локальный веб-сервер и контейнер базы данных.

  • Вы используете аргумент -v при запуске контейнера в первый раз, это свяжет конкретную папку в контейнере с хостом, запускающим контейнер.

  • Я думаю, что ваши идеи велики, и в настоящее время можно достичь всего, что вы просите.

Вот решение под ключ, которое обеспечивает все перечисленные вами потребности.

Ответ 4

Я собрал простую в использовании компоновку docker compose, которая должна соответствовать требованиям рабочего процесса разработки.

https://github.com/ehyland/docker-silverstripe-dev

Основные функции

  • Постоянная БД
  • Ваш выбор HHVM + NGINX или Apache2 + PHP5
  • Отладка и установка контрольных точек с помощью xDebug

README.md должен быть достаточно ясным, чтобы вы начали.