Який би був хороший робочий процес docker webdev?


121

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

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

Програмне забезпечення

  • Зображення докера, що забезпечують власні стеки LAMP

    • Apache з декількома модулями
    • MYSQL
    • PHP
    • Деякі CMS, наприклад, Silverstripe
  • GIT

Робочий процес

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

Розвиток

  1. Напишіть, 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. Fetch cmsdir-проект через git
  4. Запустіть контейнер докера, затягніть базу даних і вставте cmsdirв неї/var/www

Зараз це виглядає на папері все досить приємно, Але я не зовсім впевнений, чи це взагалі був би правильний підхід.

Запитання:

  1. Під час розробки локально, як я можу змусити базу даних зберігатись між перезавантаженнями екземпляра контейнера? Або мені потрібно запускати sql-dump кожен раз, перш ніж вивертати контейнер?

  2. Чи потрібно мати окремі екземпляри контейнерів для db та апаш-сервера? Чи достатньо було б мати один контейнер для цього випадку?

  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. Так, ви можете використовувати перемикач обсягів даних -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
ben schwartz

48
Однозначно потрібно більше навчальних посібників / кращих практик щодо цього процесу. :(
Reza S

Цей підручник може дати тобі вказівки ..
Pithikos

Якщо ви втягуєте код з Github у Docker, це посилання пропонує лише читати SSH-ключі (тому зображення Docker можна перерахувати публічно) slash-dev-blog.me/docker-git.html
jhtong

4
@RoyTruelove станом на 2015 рік, фіг тепер застарілий на користь докер-композиту
allan.simon


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.