CEO at Wodby
5,6
рейтинг
26 ноября 2015 в 13:05

Разработка → Разворачиваем Drupal 8 с помощью Docker из песочницы

В честь долгожданного релиза Drupal 8 я сегодня расскажу как установить его с помощью Docker.



Сперва коротко зачем вообще это делать, какие преимущества это дает:

  • Независимость от хостера. В случае необходимости мигрировать сайт на другой хостинг, это будет намного проще сделать, т.к. по сути весь сайт – это набор контейнеров, которым без разницы где их запускают
  • Клонирование. Если вам нужно создать новый экземпляр сайта, например для разработки или тестирования, то достаточно будет склонировать контейнеры
  • Совместимость серверного окружения. Зачастую различие в версиях пакетов или отсутствие какого-то расширения на разных окружениях приводит к неочевидным багам. Использование одних и тех же контейнеров на разных окружениях помогает этого избежать
  • Изоляция. Изоляция докера by design полезна когда у вас несколько сайтов или экземпляров сайта на одном сервере (высокая нагрузка на один сайт не затронет остальные). Хотя она и несколько своеобразна
  • Оптимальное серверное окружение. Не секрет, что тот же nginx, php и mysql/mariadb нужно уметь оптимально сконфигурировать, в случае с докером вы можете найти публичные контейнеры на докер хабе, собранные другими людьми специально под друпал вашей версии
  • Масштабирование. Каждый контейнер можно смаштабировать как вертикально (добавить ресурсов), так и горизонтально (склонировать и распределять нагрузку через load balancer)

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

Ну что же, начнем. Так как у восьмерки нету нормальных модулей для интеграции с redis/memcached (для хранения внутреннего кэша) и varnish (кэширующий реверсивный прокси-сервер), то собирать окружение будем без них, обойдемся всего двумя контейнерами: веб-сервер (php + apache2) и база данных (mariadb aka форк mysql).

Для демонстрации мы поднимем самый маленький дроплет (VPS) на DigitalOcean с Ubuntu 14.04 x64.

Подключаемся к виртуалке по ssh под рутом, для простоты демонстрации отрубаем дефолтный файрволл ufw, чтобы избежать его конфигурации:

root@drupal8-docker:~# ufw disable
Firewall stopped and disabled on system startup

Устанавливаем докер:

root@drupal8-docker:~# wget -qO- https://get.docker.com/ | sh

Проверяем, что все ок:

root@drupal8-docker:~# docker -D info
Containers: 0
Images: 0
Server Version: 1.9.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 0
 Dirperm1 Supported: false
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.13.0-68-generic
Operating System: Ubuntu 14.04.3 LTS
CPUs: 1
Total Memory: 490 MiB
Name: drupal8-docker
ID: GUMM:PUBZ:VJOF:52B7:ZIEN:UCJC:4QA2:BSP5:UGSW:FGPV:AZY6:ASZD
WARNING: No swap limit support

Здесь мы видим, что у нас не запущено еще ни одного контейнера, не скачано ни одного образа, версию докера и прочее. По умолчанию используется файловая система AUFS, которая позволяет докеру использовать версионность своих образов по типу гита. Т.е. при обновлении образа у вас не будет скачиваться все с нуля, а скачается только новый слой.

Едем дальше, теперь нам надо скачать наши образы. Если не указывать абсолютный путь, то по умолчанию образ будет искать на hub.docker.com, скачиваем официальный образ mariadb. Так как мы не указываем тэг (версию), то используется тэг latest.

root@drupal8-docker:~# docker pull mariadb

В выводе вы увидите как скачиваются все слои (версии) образа:

docker pull

Теперь скачиваем официальный образ друпала, указывая нужный нам тэг. По Dockerfile, из которого собирается образ, мы видим, что за основу берется образ официальный образ php 5.6 с апачем, далее устанавливаются дополнительные библиотеки и php расширения, такие как gd, pdo и opcache. Затем устанавливаются рекомендуемые настройки opcache и скачивается сам друпал.

root@drupal8-docker:~# docker pull drupal:8.0.0

Смотрим список докер образов:

root@drupal8-docker:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
drupal              8.0.0               ddddc055c2c2        5 days ago          570.9 MB
mariadb             latest              b8ba0befc716        6 days ago          302.1 MB

Они весят довольно много, потому что оба образа собраны под Debian Jessie с их пакетной системой APT, которая подтягивает много тяжелых зависимостей.

Теперь запускаем контейнер с mariadb, ключом v (--volume) мы говорим докеру создать примонтированный раздел с хост ноды, где будут храниться данные базы, по умолчанию если этого не сделать, то данные будут хранится внутри контейнера и потеряются при ребилде контейнера (такое может понадобится, чтобы применить новые обновления mariadb). В ответ на запуск команды отображается хэш (идентификатор) запущенного контейнера.

root@drupal8-docker:~# docker run -e MYSQL_ROOT_PASSWORD=admin -e MYSQL_DATABASE=drupal8 -e MYSQL_USER=drupal8 -e MYSQL_PASSWORD=drupal8 -v mariadb:/var/lib/mysql -d --name mariadb mariadb
5a288bef768a000a28c0e482b8424007c606e8d0967703099f967ff6617ceb34

Теперь запускаем друпал с линком на только что запущенную mariadb и биндингом на 80 порт. Линк – это по сути запись в /etc/hosts, указывающая на IP контейнера с mariadb в виртуальной сети, созданной докером при установке.

docker run --name drupal8 --link mariadb:mysql -p 80:80 -d drupal:8.0.0

Смотрим docker ps, чтобы убедиться, что оба контейнера запущены:

docker ps

Заходим по нашему IP адресу в браузере и видим инсталятор друпала:

drupal 8 installation

С установкой проблем быть не должно, единственно, что на странице настроек БД нужно на месте хоста вместо localhost указать mysql, по этому имени мы выше создали биндинг.

drupal 8 installation

Ура! Наслаждаемся свежеустановленным друпалом.

drupal 8 installation
Чингис @wodby
карма
6,0
рейтинг 5,6
CEO at Wodby
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (7)

  • +2
    И оставляем сервер без фаервола…
    Вообще, имхо, бредовая идея, тк на каждый сайт по серверу — это как то жирновато. Ну либо разворачивать ha proxy/nginx для расселения нескольких таких контейнеров на веб порты, но для этого надо уметь из настраивать на хосте, что опять же нивелирует почти все плюсы данного подхода.
    • +1
      Мы у себя эту проблему как раз решаем через nginx на 80 порте, который сам уже дальше форвардит куда надо. Но это не нивелирует плюсы, потому этот самый nginx – это просто еще один контейнер. Возможно надо написать следующую статью как такое организовать.
  • +6
    Ждем статью «Разворачиваем статический сайт на Apache с помощью docker».
  • 0
    Можно запустить отдельным контейнером nginx, отдельным php-fpm, сделать data-контейнер с исходниками. В nginx отдавать статику а динамику через fpm контейнер.
    Красиво же получится, в духе докера — один контейнер одна функция.

    Ну и да, docker compose тоже хорошая штука, избавляет от головной боли с линками.
    • +1
      В случае php-fpm, его лучше все-таки держать вместе с nginx чтобы они общались по быстрым юникс сокетам. Также, у друпала есть такая утилита, drush, к которой привыкло большинство друпалистов, в случае с вынесением дата контейнера она работать не будет.

      Другими словами, в духе докера это, конечно, архитектурно красиво, но не юзабельно.
      Про compose думаю напишу в следующий раз.
  • 0
    Поставил минус за wget | sh

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.