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


121

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

Базовый программный стек будет выглядеть так:

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

  • Образ (ы) Docker, предоставляющий настраиваемый стек LAMP

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

Workflow

Я мог представить себе рабочий процесс примерно так:

развитие

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

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

  1. Настроить удаленный хост (например, с помощью ansible)
  2. Отправить образ контейнера на удаленный хост
  3. Получить cmsdir-проект через git
  4. Запустите контейнер докеров, загрузите базу данных и подключитесь cmsdirк ней./var/www

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

Вопросы:

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

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

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

  4. Как мне на самом деле подключиться /dev/cmsdir/к /var/www/каталогу контейнеров ? Следует ли мне использовать для этого объемы данных ?

  5. Пропустил ли я какие-нибудь подводные камни? Что-нибудь, что можно упростить?


1
Многим этот вопрос кажется интересным. Кто-то, кажется, недавно написал серию сообщений в блоге по этой теме. Так как он не закончил , как сейчас, я разместить ссылку на этот комментарий: project-webdev.blogspot.de/2015/05/...
jottr

Ответы:


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

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

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

  3. Я использую только базовый сценарий:

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

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

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

  5. Я не знаю :-)


6
Я написал учебник по написанию контейнера mysql, который реализует то, о чем вы говорите, в # 1 txt.fliglio.com/2013/11/creating-a-mysql-docker-container
Бен Шварц

48
Определенно должно быть больше руководств / передовых практик по этому процессу. :(
Reza S

Этот урок может дать вам некоторое направление ..
Питикос,

Если вы хотите получить код из Github в Docker, эта ссылка предлагает SSH-ключи только для чтения
jhtong

4
@RoyTruelove по состоянию на 2015 год, fig теперь устарел и
заменен


4

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

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

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

  3. Посмотрите это репо, которое я создавал . По сути, это так же просто, как make build&, make runи у вас может быть локальный веб-сервер и контейнер базы данных.

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

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

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


1

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

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

Основные особенности

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.