Оптимизация работы Drupal с помощью Docker на Ubuntu: узнайте, как установить и настроить Docker4Drupal для ускорения и упрощения разработки и поддержки вашего сайта.
В последние пол года, а может и больше, я перешел на Docker4Drupal с ранее описанного Drupal VM. Всё это время я набивал шишки, эксперементировал, и вот делюсь тем как всё "варить".
Сразу отвечу почему я перешел на вариант с Docker против Vagrant. Ответ один и очень простой — производительность. Докер работает под линуксом очень шустро (читай нативно), шустрее чем на Mac и Windows, точка. На виндоусах он разворачивает полноценную виртуальную машину для своей работы, что по сути, аналог Vagrant и какая между ними разница, не знаю, на Mac, как мне обьяснили, ситуация получше, но все же он доустанавливает какие-то либы и, вроде, часть ядра линукса, для работы и все же, работает медленнее чем под линуксом. На линуксе же, он не ставит вообще ничего, кроме того что требуется контейнеру для его работы. Он просто берет использует напрямую с хоста. В итоге, когда запущенный контейнер проекта от докера простаивает, он не ест практически никаких ресурсов вообще. Более того, докер может динамически забирать себе ресурсы для своей работы прямо с хоста, тогда как вагрант, требует задавать ограничения изначально, и резервирует ресурсы под виртуалку даже если она простаивает. Ну и сам докер, запускается, разворачивается, сворачивается нереально шустро. Когда Drupal VM у меня может стартовать под минуту с уже полноценным проектом, docker стартует с аналогичным проектом за секунд 5-10.
Также у вас может сложиться вопрос, а почему именно Docker4Drupal, ведь есть ещё куча аналогичных проектов заточенных под Drupal, но я пробовал лишь два:
- Dockerized Drupal: Проект походу мертв, даже сайт не открывается. Но использовал я его давненько, и все было круто, но лагал он по сравнению с Drupal VM просто нереально. Как оказалось, внутри запускается 11 контейнеров под проект, и в каждом контейнере запускается Vagrant =_=. Думаю дальше продолжать не стоит и разьяснять, почему Drupal VM с одним вагрантом работал быстрее чем 11 завернутых в докер контейнеры :)
- Docker4Drupal: Этот вариант использую на данный момент, так как с ним, у меня практически нет проблем ( парочка всплыла когда у них появилась 5.x ветка и происходит какая-то путанница с правами на проектах, но я, вроде, их поборол уже, у вас же их не должно быть вообще, так как мы начнем сразу с 5.х). Работает шустро, гнется простой правкой конфигов. Легко развернуть и зачистить всё за ним. Всё предельно просто и понятно, работает очень быстро, никаких вирутуалок внутри не заметил.
И ведь никто не мешает вам собрать собственную сборочку сервера в докере под друпал и поделиться! Например, такой проектик есть у Chi — Drupal Lemp и у politsin — drupal-docker.
Установка Docker на Ubuntu
При установке, обратите внимание чтобы версия была Community Edition (CE).
Обновляем информацию о пакетах.
$ sudo apt update
Устанавливаем доп пакеты, которые необходимы для установки докера и поддержки загрузки через https.
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
Добавляем ключ репозитория Docker
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Устанавливаем репозиторий Docker
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Обновляем индекс и устанавливаем Docker CE
$ sudo apt update && sudo apt install docker-ce
Проверяем установку Docker
$ sudo docker run hello-world
Если все сделали корректно, то он должен скачать образ и вывести приветственное сообщение Hello from Docker! и немного информации. Если появились ошибки или что-то пошло не так, пройдитесь по пунктам заново.
Теперь мы сделаем так, чтобы докер не требовал sudo каждый раз для запуска. Это опционально, и если вас устраивает, то шаги ниже можно пропускать.
Для начала создаем группу docker
$ sudo groupadd docker
Вероятнее всего, он напишет что такая группа уже существует, ничего страшного в этом нет, просто идем дальше.
Добавляем своего текущего пользователя в данную группу
$ sudo usermod -aG docker $USER
После этого необходимо разлогиниться и залогиниться под юзером в систему обратно. В некоторых случаях может потребоваться полная перезагрузка системы.
Теперь вновь можно проверить, работает ли докер без sudo
:
$ docker run hello-world
Он должен вернуть все то же сообщение. На этом установка docker завершена.
Дополнительные действия после установки
Автозапуск docker
По-умолчанию, докер сам должен настроить автозапуск своего демона. Но если по каким-то причинам этого не произошло, или наоборот, вы желаете его отключить, то вот пара команд:
# Добавить автозапуск
$ sudo systemctl enable docker
# Отключить автозапуск
$ sudo systemctl disable docker
Хранение данных в альтернативном месте
Данный раздел рекомендую прочитать всем. Может вам и не нужно будет это делать, но знать об этом точно стоит.
По умолчанию Docker хранит все свои образы и данные для будущих контейнеров
в /var/lib/docker
, и это может вызвать серьезные проблемы со временем. Причина
проблем кроется в том, что некоторые люди, например я, разбивают диск для Linux
руками по разным на то причинам. Я, например, при установке линукса, отдаю 30-45
гб. для ядра /
, а все остальное отдаю /home
(это позволяет
переустанавливать линукс или менять дистрибутив за считанные минуты, не теряя
никакие данные вообще). Таким образом, директория /var
попадает под
ограничение 30-45 гб. А контейнера могут весить со временем очень много, и не
стоит забывать что система также занимает место, как и другие програмки. У
кого-то это может быть вообще два разных диска, где ядро на SSD, а остальное на
HDD и место также ограниченно.
Проблема таится в том, что когда кончится место, а с докером оно кончится стремительно быстро, то все ваши контейнера просто откажут в работе. Они не будут отвечать, они не будут старотавать, они просто напросто откажут, вам придется делать всё что тут написано, и заботиться о переносе данных вручную и надеется что все пройдет гладко. И это может произойти в процессе работы с докером, и вы, возможно, даже не поймете почему ваш проект развалился и перестал отвечать, или в момент установки нового пакета или обновления системы, где с кэшем и временными файлами места просто не хватит и опять же, все приведет к краху.
Если у вас аналогичная ситуация, то нужно менять место хранения данных докера. Если у вас общий раздел для всех данных и ядра, вам все что написано ниже в данном разделе не нужно и можно пропускать.
Для того чтобы изменить местоположение файлов для докера, нам необходимо
поменять значение по умолчанию для демона. Мы можем переопределять значения для
демона докера при помощи файла daemon.json
, который нужно создать в
папке /etc/docker
. В данном файлике в формате JSON достаточно задать
переменную graph
, где значением будет путь до места хранения файлов докера.
Давайте это сделаем:
# Создаем файл
sudo touch /etc/docker/daemon.json
# Открываем его на правку
sudo nano /etc/docker/daemon.json
Добавляем значение
{
"graph": "/home/USERNAME/.docker"
}
Сохраняем, закрываем.
Путь можете указать какой вам удобно. Я указываю домашнюю директорию своего
юзера и скрытую папку .docker
. Если папки нет, докер создаст её сам и все
необходимые вложенные.
После чего необходимо перезапустить демон докера чтобы он увидел изменения.
$ sudo service docker restart
И для того чтобы убедиться что всё ок, запустите тест hello world заново. Если
вы не переносили уже имеющиеся данные из /var/lib/docker
, то он заново скачает
образ и выведет сообщение.
Установка Docker Compose
Docker Compose — это небольшая обертка для докера, которая позволяет
описывать контейнеры в конфигурационном файле docker-compose.yml
и управлять
ими одновременно через данную утилиту. Это необходимо установить, потому что это
во-первых, удобно, а во-вторых, требуется для Docker4Drupal.
Установка Docker Compose
# Качаем
$ sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
# Делаем метку выполняемого файла
$ sudo chmod +x /usr/local/bin/docker-compose
# Проверяем
$ docker-compose --version
Если вернул версию, всё готово.
Установка Docker4Drupal
Docker4Drupal — это по-сути, парочка конфиг файлов с настройками для Docker Compose, которые, под капотом, дергают определенные контейнера и связывают их между собой. Поэтому установка проста настолько, насколько это только реально.
Вариантов использования их конфиг файлов может быть уйма, тут уж как вам удобнее и лучше. Я покажу так, как это устроено у меня.
Для проектов у меня в домашней директории есть папка Projects, внутри которой
ещё несколько: github (для всяких контриб модулей и прочих разработок), *
local* (для локальной разработки), remote (подключенные внешние проекты
по (S)FTP). Как не сложно догадаться, разработка ведется в папке local, внутри
которой, у меня есть папка для каждого проекта. В итоге я имею примерно такой
путь ~/Projects/local/project-name
. И вот внутрь папки проекта я кидаю конфиги
Docker4Drupal.
Можете использовать всё по своему усмотрению, откуда вызывать - нет никакой
разницы, я же приведу пример, создав папку для тестового
проекта: ~/Projects/local/example
.
После того как создали папку для своего проекта, необходимо скачать Docker4Drupal. Для этого переходим в их репозиторий, а затем, на вкладку releases и качаем самый последний релиз. На момент написания статьи, это 5.0.4, внутри которого есть архив docker4drupal.tar.gz, вот его то нам нужно скачать.
Распаковываем архив в нашу папку с будущим проектом. Получится примерно следующее:
И на этом "установка" завершена.
Настройка Docker4Drupal
Из коробки всё само заведется и заработает, но я правлю конфиги под себя и покажу как это делаю, и какие полезные изменения можно внести.
Для базовой настройки нам интересны всего два файла .env
(скрытый файл, в
Ubuntu чтобы показать скрытые файлы CTRL + H, в KDE Dolphin F8)
и docker-compose.yml
.
Начем с .env
, в нем настраиваются все базовые настройки для контейнеров. Их
название, версии и доступы.
Первым делом стоит поменять название проекта под своё, чтобы контейнера не
перепутались. Я указываю название такое же, как и папки проекта. Я
меняю PROJECT_NAME
, в нашем случае на example
. Данная переменная может
содержать только латиницу, цифры и знак подчеркивания. Так что тире заменяйте на
подчеркивание или вообще пишите слитно. Далее я меняю PROJECT_BASE_URL
, это
адрес, по которому будет открываться сайт, а также базовый адрес для остальных
поддоменов типа phpmyadmin и прочего. Я аналогично, указываю в нашем
случае example.localhost
чтобы было проще вводить. Больше я ничего не меняю.
Ниже можно настроить специфичные версии для каждого из контейнеров. Для этого
достаточно раскомментировать нужную строку с переменной, убрав в начале #
, а
затем закомментировать ту, что использовалась ранее, добавив #
.
Например, на момент написания статьи, раздел настройки PHP имеет следующий вид:
### --- PHP ----
PHP_TAG=7.1-dev-4.2.5
#PHP_TAG=7.0-dev-4.2.5
#PHP_TAG=5.6-dev-4.2.5
#PHP_TAG=5.3-dev-4.2.5
#PHP_TAG=7.1-dev-macos-4.2.5
#PHP_TAG=7.0-dev-macos-4.2.5
#PHP_TAG=5.6-dev-macos-4.2.5
#PHP_TAG=5.3-dev-macos-4.2.5
Т.е. по умолчанию, версия php будет 7.1. Если вы хотите 5.6, то файл будет выглядить следующим образом:
### --- PHP ----
#PHP_TAG=7.1-dev-4.2.5
#PHP_TAG=7.0-dev-4.2.5
PHP_TAG=5.6-dev-4.2.5
#PHP_TAG=5.3-dev-4.2.5
#PHP_TAG=7.1-dev-macos-4.2.5
#PHP_TAG=7.0-dev-macos-4.2.5
#PHP_TAG=5.6-dev-macos-4.2.5
#PHP_TAG=5.3-dev-macos-4.2.5
Настройки версий можно менять в дальнейшем, после чего надо перезапускать контейнеры. Но вот название проекта я бы менять уже не рискнул.
Теперь перейдем к настройке docker-compose.yml.
В первую очередь, в данном файле нас интересует конфиг traefik в самом низу, там
где раздел ports и установлено '8000:80'
я меняю на '80:80'
. Если этого не
поменять, то сайт будет открываться по адресу example.com:8000, если поменять,
то просто по example.com. Согласитесь, удобнее.
Затем, я включаю Adminer, для этого надо найти его раздел в файле и убрать от
всех его строк комментарии #
. Получится так:
adminer:
container_name: "${PROJECT_NAME}_adminer"
image: wodby/adminer:$ADMINER_TAG
environment:
ADMINER_SALT: adminer-salt
labels:
- 'traefik.backend=adminer'
- 'traefik.port=9000'
- 'traefik.frontend.rule=Host:adminer.${PROJECT_BASE_URL}'
Если вы предпочитаете PhpMyAdmin или хотите оба, то расскоменнтируйте pma раздел аналогичным обарзом. Тут же вы можете заметить в последней строке где задается по какому хосту будет открываться adminer. В нашем случае это превратиться в adminer.example.localhost (если вы поменяли порт 8000 на 80, если нет, то adminer.example.localhost:8000).
По такому принципу включаются дополнительные контейнеры, вы сами можете наблюдать какие там есть, и если какой-то нужен, или хотите потестить, то всё так просто. После изменения этого файла, проект надо рестаровать чтобы изменения вступили в силу.
Также в docker-compose.yml есть две очень важные настройки. Первая находится
в разделе php.volumes
. Там, вы можете заметить, значение по
умолчанию ./:/var/www/html
. Это маппинг откуда:куда
. Если опираться на
стандартное значение, то его следует понимать следующим образом. Файлы из
текущей (./
) директории, нужно переносить в директорию /var/www/html
контейнера php. Это настройка синхронизации исходного кода с контейнером.
Папка "откуда", указывается относительно текущего
местоположения docker-compose.yml
.
Вторая аналогичная настройка есть в nginx, её тоже не забудьте поменять, если
изменили в php. В nginx также находится ещё одна очень важная
настройка nginx.environment.NGINX_SERVER_ROOT
. Она отвечает за то, где в
контейнере php находится index.php файл сайта. По умолчанию она имеет
значение /var/www/html/web
. Во-первых, если вы меняли место назначения файлов,
это также должно быть изменено. Во-вторых, оно настроено под Drupal 8
drupal-project композер установку. Если у вас Drupal 7 или стандартная установка
Drupal 8, то значение нужно поменять на /var/www/html
.
На этом настройка Docker4Drupal завершена. Правьте как хотите под себя, я делаю по минимуму.
Настройка алиасов
Docker4Drupal в PHP контейнере из коробки поставит вам composer, drupal console и drush launcher. Для их вызова, лучше всего, сделать алиасы.
Для этого надо добавить три алиаса, называйте их как хотите, я называл их
обычными именами. Если вы не меняли шел в системе, то следующие правки вносите
в ~/.bash_profile
(если нету, то создайте touch ~/.bash_profile
), если у
вас Zsh, то следующие строки вносите в ~/.zshrc
.
alias drush="docker-compose exec php drush"
alias drupal="docker-compose exec php drupal"
alias composer="docker-compose exec php composer"
Можно их добавить снизу файла, сохранить, закрыть и
прописать source ~/.bash_profile
или же source ~/.zshrc
. В зависимости куда
внесли алиасы.
Теперь, набирая в консоли drush, он будет вызывать команду docker-compose exec в контейнер php где он вызовет drush, а он, в свою очередь, уже вызовет драш. Аналогично и с остальными.
Данные команды будут работать в корне проекта, а также во всех вложенных его
папках, за пределами проекта будет выдавать ошибку что docker-compose.yml не
найден. Поэтому, перед тем как выполнять эти команды, зайдите в терминале в
папку с проектом cd ~/Projects/local/example
и вызывайте drush status
или
что вам нужно.
Запуск, установка, отключение, удаление
Если все установили и настроили как следует, то можно проверять.
Запуск сервера
Для того чтобы запустить сервер, заходите при помощи терминала в директорию с
проектом cd ~/Projects/local/example
и вызываете команду
запуска docker-compose up -d
(параметр -d
отключит вывод сообщений после
запуска и отдаст контроль над терминалом). У вас всё скачается, настроится и
запустится. И по адресу example.localhost должна открываться страница и писать "
File not found", потому что index.php по пути /var/www/html/web
не обнаружен.
Если у вас пишет что соединение не удалось установить, вероятнее всего у вас
Firefox или же ещё какие-то особенности. Для этого просто достаточно добавить
в /etc/hosts
записи для всех нужных вам доменов 127.0.0.1 example.localhost
и, например, если включили adminer 127.0.0.1 adminer.localhost
. Адреса начнут
работать.
Установка Drupal
Для примера мы поставим Drupal 8 drupal-project. Так как стандартные настройки полностью под него подходят, и делается это крайне быстро и легко. Да и вообще drupal-project крутейшая штука, я, если интересно, могу о нем расписать, хотя там все предельно понятно и просто.
Для этого достаточно выполнить пару команд в терминале
# Переходим в папку проекта, если ещё не там или вышли
$ cd ~/Projects/local/example
# Клонируем проект
$ git clone https://github.com/drupal-composer/drupal-project.git
# Переносим клонируемые файлы в нашу основную директорию
$ cp -R drupal-project/* .
# Удаляем файлы которые скопировали из старой папки
$ rm -rf drupal-project/
У вас должно получиться примерно следующее.
Так как это drupal-project и он не содержит в себе ядра друпала из коробки, мы устанавливаем его со всеми зависимостями.
Для того чтобы это сделать просто пишем composer install
и ждём окончания. Не
будет лишним сразу помочь создать ему папку config/sync
, на которую он может
ругаться в начале установки, для этого просто напишите mkdir -p config/sync
.
После окончания установки композера всё готово. Установщик Drupal будет доступен по адресу example.localhost.
Важно!. В процессе установки, или, если вы разворачиваете готовый проект, в
качестве хоста для базы данных нужно указывать mariadb
, вместо localhost
.
Остановка сервера
Для того чтобы остановить сервер просто пишем docker-compose stop
. Он выключит
все контейнеры и всё, сервер больше не работает. Если захотите опять запустить
его, просто пишите docker-compose up -d
и сайт снова заработает.
Удаление данных
Что делать если данные устарели, проект больше не нужен, и нужно освободить место на диске? Первым делом, нужно удалить все контейнера докера, а уже затем удалять папку проекта, иначе у вас в системе останутся мертвые данные от проекта.
Для того чтобы удалить все данные по текущему проекту в докере, достаточно
остановить сервер и написать docker-compose rm
, он спросит подтверждение,
убедитесь что удаляются файлы нужного проекта, это будет видно по названиям в
подтверждении, если всё ок, соглашайтесь, они удалятся. После чего, уже можно
удалять папку проекта, если она больше не нужна и у вас не останется никаких
следов текущего проекта.
Также есть ещё одна команда, docker-compose halt
. Её можно вызывать когда
сервер запущен, и вы решили его удалить. Он выполнит
команду docker-compose stop
и docker-compose rm
за вас.
Будьте очень аккуратны при удалении, данные будет не восстановить.
Дополнительные конфигурации и возможности
Данные конфигурации необязательны и только чтобы вы знали как, где и если потребуется, чтобы быстро сориентироваться.
Xdebug
В 8-ке xdebug порой необходим как воздух, с ним очень легко отследить как выполняется определенная часть кода и найти ошибку. К нашему счастью, с Docker4Drupal это делается очень просто.
Первым делом, рекомендую поставить расширение для браузера Xdebug helper Chrome \ Firefox. Он позволит простым нажатием в браузрной строке включать режим отладки.
Для того чтобы включить Xdebug в Docker4Drupal, заходим в файл *
docker-compose.yml* и находим раздел php. Там будут закомментированы две
переменные PHP_XDEBUG
и PHP_XDEBUG_DEFAULT_ENABLE
. Нам необходимо их
раскомментировать.
php:
image: wodby/drupal-php:$PHP_TAG
container_name: "${PROJECT_NAME}_php"
environment:
PHP_SENDMAIL_PATH: /usr/sbin/sendmail -t -i -S mailhog:1025
DB_HOST: $DB_HOST
DB_USER: $DB_USER
DB_PASSWORD: $DB_PASSWORD
DB_NAME: $DB_NAME
DB_DRIVER: $DB_DRIVER
## Read instructions at https://wodby.com/stacks/drupal/docs/local/xdebug/
PHP_XDEBUG: 1
PHP_XDEBUG_DEFAULT_ENABLE: 1
# PHP_XDEBUG_REMOTE_CONNECT_BACK: 0
# PHP_IDE_CONFIG: serverName=my-ide
# PHP_XDEBUG_REMOTE_HOST: 172.17.0.1 # Linux
# PHP_XDEBUG_REMOTE_HOST: 10.254.254.254 # macOS
# PHP_XDEBUG_REMOTE_HOST: 10.0.75.1 # Windows
volumes:
- ./:/var/www/html
## For macOS users (https://wodby.com/stacks/drupal/docs/local/docker-for-mac/)
# - ./:/var/www/html:cached # User-guided caching
# - docker-sync:/var/www/html # Docker-sync
## For Xdebug profiler files
# - files:/mnt/files
После чего перезапускаем контейнера, если они запущены и запускаем
заново docker-compose stop && docker-compose up -d
.
После запуска, Xdebug начнет работу. В браузерном расширении ставим зеленого жука, в IDE включаем режим дебага и пользуемся.
Xdebug очень сильно снижает производительность даже в режиме ожидания. Чем крупнее проект, тем сильнее будет ощущаться его присутствие. Так что после успешного дебага под свои нужды, я рекомендую комментировать конфиги которые его включают и перезапускать контейнера. Включайте только когда действительно нужно.
Blackfire
Blackfire — это сервис профилирования проекта от создателей Symfony. Для локальных проектов он бесплатный. Его очень круто использовать, когда на проекте есть какие-то тормоза, которых раньше не было. Он помогает вам найти узкие места в проекте, а затем провести ещё одну проверку, и сравнить насколько изменился результат и были ли внесенные изменения действенные.
Для его использования, нам также потребуется браузерное расширение Blackfire Companion Chrome \ Firefox, а также, вы должны зарегистрировать в данном сервисе.
После регистрации в сервисе вам нужно нажать на свою аватарку, зайти в Account и получить Server ID и Server Token.
После чего заходим в docker-compose.yml, расскомментируем соответствующий раздел
и укажем BLACKFIRE_SERVER_ID
и BLACKFIRE_SERVER_TOKEN
в соответствии с тем
что вам выдали в профиле.
blackfire:
image: blackfire/blackfire
container_name: "${PROJECT_NAME}_blackfire"
environment:
BLACKFIRE_SERVER_ID: XXXXX
BLACKFIRE_SERVER_TOKEN: YYYYY
Также в раздел php нужно добавить переменную PHP_BLACKFIRE
со значением 1
.
Видимо в новой версии про неё забыли, но без неё не заведется.
php:
image: wodby/drupal-php:$PHP_TAG
container_name: "${PROJECT_NAME}_php"
environment:
PHP_SENDMAIL_PATH: /usr/sbin/sendmail -t -i -S mailhog:1025
DB_HOST: $DB_HOST
DB_USER: $DB_USER
DB_PASSWORD: $DB_PASSWORD
DB_NAME: $DB_NAME
DB_DRIVER: $DB_DRIVER
## Read instructions at https://wodby.com/stacks/drupal/docs/local/xdebug/
# PHP_XDEBUG: 1
# PHP_XDEBUG_DEFAULT_ENABLE: 1
# PHP_XDEBUG_REMOTE_CONNECT_BACK: 0
# PHP_IDE_CONFIG: serverName=my-ide
# PHP_XDEBUG_REMOTE_HOST: 172.17.0.1 # Linux
# PHP_XDEBUG_REMOTE_HOST: 10.254.254.254 # macOS
# PHP_XDEBUG_REMOTE_HOST: 10.0.75.1 # Windows
PHP_BLACKFIRE: 1
Перезапускаем контейнера docker-compose stop && docker-compose up -d
и всё
готово!
Заходим на страницу где хотите профилировать. Жмете на иконку расширения, если всё корректно, будет кнопка "Profile!". Жмете на неё и начнется профилирование. Вы можете сразу тут задать название для своего профилирования.
При нажатии на время выполнения или другие кнопки, он откроет страницу с результатами профилирования.
Например, на скриншоте выше, дерево вызова для главной страницы. Видно, что вызов занял 253ms и в пике требовал 9.18MB оперативной памяти.
Поддержка HTTPS
По различным причинам, вам может потребоваться HTTPS для локалки. Например, захотите написать авторизацию через OAuth 2.0 на локалке, а без HTTPS этого сделать просто невозможно, так как https требуется на уровне OAuth 2.0 и все запросы с http, даже с локалки, будут просто откланяться. Что же делать в таком случае? И тут все просто!
Первым делом, нам надо сгенерировать самоподписанный сертификат для домена. Это очень просто, можно воспользоваться сервисом Self-Signed Certificate Generator. Заходим на сайт, вводим домен, в нашем примере example.localhost и жмем Generate. В результате он выдаст вам 2 ссылки на файлы example.localhost.key и example.localhost.cert. Их вам нужно скачать.
Вы также можете сгенерировать самостоятельно без всяких сайтов. Для этого достаточно ввести две команды заменив домен на нужный:
$ openssl genrsa -out example.localhost.key 2048
$ openssl req -new -x509 -key example.localhost.key -out example.localhost.cert -days 3650 -subj /CN=example.localhost
Эти файлы придется положить в проект. Я предлагаю сделать папку certs
внутри
проекта и положить оба файла туда. После чего, не забудьте эту папку добавить
в .gitgnore (правило certs/
).
Тогда как оба файла будут в этой папке, открываем docker-compose.yml.
Находим настройки для traefik в самом низу и меняем command
на новое
значение (будет в примере ниже), добавить порты для SSL 443, а также подключить
папку с сертификатами.
traefik:
image: traefik
container_name: "${PROJECT_NAME}_traefik"
command: -c /dev/null --web --docker --logLevel=INFO --defaultEntryPoints='https' --entryPoints="Name:https Address::443 TLS:/certs/example.localhost.cert,/certs/example.localhost.key" --entryPoints="Name:http Address::80"
ports:
- '80:80'
- '443:443'
# - '8080:8080' # Dashboard
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./certs:/certs
Не забудьте заменить название файлов на свои, и папку указать нужную, если вы решили хранить в другом месте.
Перезапускаем контейнера docker-compose stop && docker-compose up -d
.
Теперь сайт будет открываться по https://example.com
.
Поддержка поддоменов\алиасов
Например, вы захотели добавить алиас для домена. Тут всё просто. Находим
в nginx.label
следующую
строку: - 'traefik.frontend.rule=Host:${PROJECT_BASE_URL}'
и добавляем новое
правило через
запятую - 'traefik.frontend.rule=Host:${PROJECT_BASE_URL},www.${PROJECT_BASE_URL}'
—
теперь сайт будет открываться и по www.example.localhost.
Но что если нужно открывать сайт по любом поддомену (читай регулярка) ?. Тогда
под данной строкой нужно добавить
новую: - 'traefik.frontend.rule=HostRegexp:{subdomain:[a-z]+}.${PROJECT_BASE_URL}'
где [a-z]+
регулярное выражение. Перезапускаете сервак, и всё готово. Теперь
сайт будет открываться по любому поддомену, например moscow.example.localhost.
На этом, пожалуй всё. Если что интересного узнаю, напишу отдельно или дополню.
Комментарии
Снова здравствуйте Никита! Обнаружил, что если ставить D8 на docker4drupal брать версию 5.4.17 оного: https://github.com/wodby/docker4drupal/releases/tag/5.4.17 Последующие версии уже на 9ку нацелены. Я понимаю специалист легко поправит под себя .env и docker-compose.yml файлы, но специалистами не рождаются.
Никита, подскажите как делать Git коммиты при хранении данных в альтернативном месте? https://niklan.net/blog/172#khranenie-dannykh-v-alternativnom-meste
Данные настройки вообще никак не повлияют на то как производится работа с проектом. Это влияет лишь на то, где будут физически файлы на диске. Вы с ними напрямую всё равно никогда не будете работать.
Если физические файлы ядра находятся по адресу "/home/evgeny/.docker/volumes/powerbase_codebase/_data" а сам проект находится по адресу "/home/evgeny/web_progect/powerbase" то где работать с Git? Логически понятно что в первом каталоге, однако команда "drush cex" работает во втором каталоге а в перовом каталоге почему-то слетает Git при перезапуске Ubuntu. Подскажите, как у Вас налажен алгоритм отправки конфигов в Git при использовании альтернативных мест хранения для ядра? хочется верить, что после команды "drush cex" Вы не идете в каталог с ядром что-бы сделать "git commit"
С проектом нужно работать в принципе из /home/evgeny/web_progect/powerbase
и только оттуда. Вас вообще не должно никак касаться где и как хранит докер свои контейнеры. Этот пункт в статье лишь подсказка для тех у кого основной партишн мелкого размера.
Логически понятно что в первом
Туда вообще ни в коем случае не нужно влезать.
Подскажите, как у Вас налажен алгоритм отправки конфигов
Точно так же как и при оригинальном. Вообще никакой разницы.
Перечитайте раздел для чего делается перенос и когда он вообще необходим. Зачем вы туда после заходите и что-то делаете мне не ясно вообще.
Перечитал.
Я полез туда в связи с тем, что не мог обновить ядро https://drupal.ru/node/142312 попутно выяснилось, что лезть в /home/USERNAME/.docker необходимо для того чтобы дать права 777 на файлы ядра и в частотности на composer.json иначе после установки модуля с помощью composer файл не обновляется и всегда остается исходным.
"Точно так же как и при оригинальном. Вообще никакой разницы."
Все равно не понимаю. Вот смотрите. Если я правильно понимаю, Вы выполняете команду "drush cex" в каталоге /home/evgeny/web_progect/powerbase но файлы конфигов сохраняются в каталог /home/evgeny/.docker/volumes/powerbase_codebase/_data/config/sync и вот как теперь закомитить и запушить каталог config/sync на Github находясь в каталоге web_progect?
Я где-то читал что в файле settings.php можно прописать отдельный каталог хранения конфигов, может у Вас так и сделано? и находится этот каталог в web_progect.
Я полез туда в связи с тем, что не мог обновить ядро https://drupal.ru/node/142312
У композера банально не хватило прав. Всё правильно он ругается. Для решения достаточно задать настройку в settings.php
.
выяснилось, что лезть в /home/USERNAME/.docker необходимо для того чтобы дать права 777 на файлы ядра
Нет, не нужно, это какая-то ерунда. Файлы докера никак не должны модифицироваться из вне, кроме самого докера.
но файлы конфигов сохраняются в каталог
Вас это не должно волновать от слова совсем. Какая вам разница, где хранит файлы докер по факту? Докер их синхронизирует с вашего ПК в ту самую папку и потом там трёт. Это его механизм работы, вмешиваться в него нет вообще никаких причин.
P.s. Я подозреваю у вас просто-напросто есть файл docker-compose.override.yml
в котором друпал ставится в контейнер в обход хоста. Откуда у вас и возникают сложности и недопонимание где лежат файлы. Друпал должен быть на вашем ПК прямо тут /home/evgeny/web_progect/powerbase
. Эта папка будет автоматически синхронизироваться с докером /home/evgeny/.docker/volumes/powerbase_codebase/_data
в обе стороны. Всё.
Просто удалите docker-compose.override.yml
и создайте всё заного без него. Или прочитайте зачем он нужен и что там написано изначально, и сравните с тем что в docker-compose.yml
для php
раздела. Там совершенно разные образы качаются. В оверрдайс - мусор.
Действительно, стоило удалить docker-compose.override.yml, скопировать /home/evgeny/.docker/volumes/powerbase_codebase/_data/composer.json в home/evgeny/web_progect/powerbase и запустить composer update как файлы ядра закачались home/evgeny/web_progect/powerbase. А я то думал, что отсутствие файлов ядра в каталоге home/evgeny/web_progect/powerbase - это новшество Docker4Drupal. Благодарю за развернутые ответы и проницательность!
Никита, а подскажите почему при установки Drupal происходит ошибка подключения к БД? Мне один раз помогла переустановка Ubuntu, в этот раз хочется разобраться в чем проблема. P.S. при вводе команды docker ps" видно MariaDB работает: ····534e2ef95a30 wodby/mariadb:10.4-3.8.6 "/docker-entrypoint.…" 29 minutes ago Up 29 minutes 3306/tcp my_drupal9_project_mariadb
Никита, извиняюсь. Название БД должно быть drupal а не mariadb
Подскажите пожалуйста, можно аналогичным способом работать на VPS ?
Как настроить путь, по которому будет открываться контейнер с сайтом?
Niklan -- большущее спасибо за весь материал на сайте.
Вопрос решен. В файле .env и прописал айпи сервера.
"При установке, обратите внимание чтобы версия была Community Edition (CE)" -- а у меня LTS (Ubuntu 20.04.1), нужно ли мне это учесть и как именно?
Речь про версию докера, а не убунты. Просто ставьте, если возникнут проблемы переставите. Просто если появится выбор где-то, нужно выбирать CE версию докера.
Если хотите наверняка, я рекомендую ставить докер по официальной инструкции. Могло многое поменяться, но уверен что CE должна ставиться по умолчанию и никаких проблем не будет.
"они не будут старотавать"
"простым нажатием в браузрной строке"
На страничке https://github.com/wodby/docker4drupal/releases в описании последнего релиза читаем: Vanilla Drupal: Updated: 9.1.0, 8.9.11, 7.77 -- значит ли это, что данный образ docker4drupal содержит версии Друпал с указанными номерами?
По умолчанию (в архиве релиза) да, эти версии правятся в .env
файле.
На продакшене Apach, в Докере Nginx. Это нужно как-то учитывать (при переносе проекта на продакшн)? где и как?
Если конфигурация или .htaccess
на Apach как-то менялась, то, возможно стоит синхронизировать эти настройки. Всё слишком индивидуально, но вот в обратную сторону да, лучше убедить что всё ок если на проде Nginx.
Для уверенности, можно в контейнере nginx переключить на Apache.
После команды в статье { "graph": "/home/USERNAME/.docker"} выдает ошибку при запуске docker run hello-world пишет
Причина найдена: не хватало скобок
Здравствуйте Никита! Подскажите, а как на D4D установить D7?
-
Скачал docker4drupal 5.4.17 https://github.com/wodby/docker4drupal/releases/tag/5.4.17
-
Изменил: .env
### PROJECT SETTINGS
PROJECT_NAME=drupal7
PROJECT_BASE_URL=drupal7.localhost
DB_NAME=drupal7
DB_USER=drupal7
DB_PASSWORD=drupal7
docker-compose.yml
NGINX_SERVER_ROOT: /var/www/html
При обращению к сайту пишет: 404 Not Found nginx
В .env версию PHP или еще что-то под 7ку прописывать?
А где index.php
относительно docker-compose.yml
? И меняли ли настройку volumes
?
Т.к. D7 сайт с которым хочу поиграть собран без Композера, то: index.php и docker-compose.yml находятся в одной папке. volumes - не менял.
php:
volumes:
- ./:/var/www/html:cached
Тогда не подскажу. Нужно заходить в контейнер, проверять что все файлы там корректно присутствуют. Убедиться что действительно корректная настройка для NGINX_SERVER_ROOT
(может случайно смотрели другой docker-compose.yml
). Как вариант, попробовать поменять в .env
файле NGINX_VHOST_PRESET
на drupal7
. Но я не припоминаю чтобы такое делал, у меня и на пресете от д9 работает д7.
NGINX_VHOST_PRESET - да. При беглом осмотре помогло. Спасибо! А как версию PHP поменять на 5.6? Сейчас в .env: PHP_TAG=7.3-dev-4.15.8 по аналогии попробовал прописать PHP_TAG=5.6-dev-4.15.8
Выдало:
Pulling php (wodby/drupal-php:5.6-dev-4.15.8)...
ERROR: manifest for wodby/drupal-php:5.6-dev-4.15.8 not found: manifest unknown: manifest unknown
Где список пых можно взять?
Версии можно посмотреть у их имейджа (5.6-dev-4.14.3
).
Если это используется для разработки, на версию wodby вообще можно забить и писать просто 5.6-dev
, 7.4-dev
и т.д.
Всем доброго дня!
Есть пример конфигурации SSL сертификата для traefik v2? Перепробовал кучу вариантов, чет не один не завелся...
Покажите, пожалуйста, свою реализацию
Никита, подскажите как установить D4D на 32-х разрядную систему?
После мыторств получилось установить docker.io и docker-compose через synaptic, но после запуска docker-compose up -d
для D4D 5.3.1 получаю
Pulling traefik (traefik:latest)...
latest: Pulling from library/traefik
ERROR: no matching manifest for linux/386 in the manifest list entries
Хочется взять с собой в отпуск старый нетбук для программирования, но что-то не получается установить D4D.
Собственно, ошибка говорит за себя. У образа Traefik, который отвечает за маршрутизацию, нет поддержки i386 архитектуры. Тут ничего не поделать. Проще, наверное, просто обойтись без докера, раз это временное окружение.
Добрый день, Никита. Установил docker по данной инструкции и столкнулся с проблемой. А именно, у папки /home/мой-аккаунт/.docker каждый раз устанавливается владелец root группы root и при запуске docker постоянно выскакивает сообщение WARNING: Error loading config file: /home/roman/.docker/config.json: open /home/roman/.docker/config.json: permission denied. Применение chown помогает только до перезагрузки системы. Раньше такого не помню, использую xubuntu 20.04. Не знаешь, как эту проблему побороть?
Скорее всего потому что запускали докеры из под рута, лучше этого не делать и добавить пользователя в соответствующую группу и больше никогда не вызывать докер из под sudo.
Думаю нужно это всё же сделать, удалить .docker директорию принудительно из под рута, в следующий раз должна создаться с нужными правами или пофиксить ей владельца, если там есть важные данные.
Здравствуйте!
Я поднимаю Drupal сайт на docker4drupal.
Нужно создать сабтему на основе Bootstrap 4 SASS - Barrio. В инструкции на drupal.org пишет что для этой темы нужно установить node.js, gulp, и все необходимые зависимости для gulp чтобы он мог скомпилировать sass в css:
https://www.drupal.org/docs/contributed-themes/bootstrap-4-sass-barrio-starter-kit/installation
В docker-compose.yml я прописал такие конфиги для сервиса node.js:
node:
image: wodby/node:$NODE_TAG
container_name: "${PROJECT_NAME}_node"
working_dir: /var/www/html/web/themes/custom/bootstrap_sass_bcnews
labels:
- "traefik.http.services.${PROJECT_NAME}_node.loadbalancer.server.port=3000"
- "traefik.http.routers.${PROJECT_NAME}_node.rule=Host(`node.${PROJECT_BASE_URL}`)"
expose:
- "3000"
volumes:
- ./var/www/html/web/themes/custom/bootstrap_sass_bcnews:/var/www/html
command: sh -c 'apt-get install python3-software-properties gnupg2 curl wget -y && curl -fsSL https://deb.nodesource.com/setup_12.x | sudo -E bash - && sudo apt-get install -y nodejs && cd /var/www/html/web/themes/custom/bootstrap_sass_bcnews && npm install --global gulp-cli && npm install'
Путь к Drupal проекту в моей системе: /home/perceval/Desktop/bcnews_project
Путь к теме в контейнере: /var/www/html/web/themes/custom/bootstrap_sass_bcnews
После запуска контейнеров docker-compose up -d
и проверки docker ps
, я вижу что node.js контейнер не запущен:
В файле docker-compose.yml я правил только три строчки working_dir, volumes, command. И подозреваю, что-то не так написал в последних двух.
Файл .env:
### --- NODE ---
NODE_TAG=12-dev-0.84.0
В чем проблема? И вообще, правильно ли я написал команды в строке command?
P.S.: Для удобства чтения я напишу вам команды в столбец написанные мною в command в файле docker-compose.yml:
sh -c 'apt-get install python3-software-properties gnupg2 curl wget -y &&
curl -fsSL https://deb.nodesource.com/setup_12.x | sudo -E bash - &&
sudo apt-get install -y nodejs &&
cd /var/www/html/web/themes/custom/bootstrap_sass_bcnews &&
npm install --global gulp-cli &&
npm install'
- ./var/www/html/web/themes/custom/bootstrap_sass_bcnews:/var/www/html
должен быть либо как в php контейнере, либо working_dir: /var/www/html/web/themes/custom/bootstrap_sass_bcnews
нужно поменять на working_dir: /var/www/html
Вот почему была такая проблема:
- Node.js образ в docker4drupal использует
apk
вместоapt-get
для установки дополнительных пакетов. - Этот образ уже содержит node.js. Мне не нужно писать команду установки node.js в строке
command:
. Вот как должна была выглядеть конфигурация сервиса node.js в моем случае:
node:
image: wodby/node:$NODE_TAG
container_name: "${PROJECT_NAME}_node"
working_dir: /var/www/html/web/themes/custom/bcnews_bootstrap_sass
labels:
- "traefik.http.services.${PROJECT_NAME}_node.loadbalancer.server.port=3000"
- "traefik.http.routers.${PROJECT_NAME}_node.rule=Host(`node.${PROJECT_BASE_URL}`)"
expose:
- "3000"
volumes:
- ./:/var/www/html:cached
command: sh -c 'cd /var/www/html/web/themes/custom/bcnews_bootstrap_sass && npm init --yes && npm install --global gulp-cli && npm install --save-dev gulp && npm install && gulp'
Добрый вечер Никита. У меня есть готовый Drupal проект, который поднимаю с помощью docker4drupal. Теперь я хочу залить этот проект на хостинг(типичный Virtual Hosting). С помощью ftp я перенесу Drupal проект на выделенную мне хостингом часть диска, включая четыре файла docker4drupal (docker-compose.yml, .env, Makefile, traefik.yml) лежащие в его директории.
- База данных будет использоваться из контейнера mariadb? Или мне нужно перенести базу данных из моего volumes что указана в конфигурациях сервиса mariadb в файле docker-compose.yml?
volumes:
- ./db/init:/docker-entrypoint-initdb.d
- ./db/source:/var/lib/mysql
- Сейчас когда мой проект находится на моем компьютере, я запускаю контейнеры с помощью команды
docker-compose up -d
. Точно так же мне прописать в терминале с panel хостинга чтобы запустить контейнеры?
Вам нужно переносить БД в БД хостинга и всё в таком духе. Сомневаюсь что на шареде вы докеры сможете запустить. Если всё же хочется запустить D4D на хостинге \ vps и на это хватит прав, у меня есть примеры как это делать. Там немного другие конфиги нужны, ибо нужна более жесткая изоляция и запуск нескольких проектов одновременно.
Спасибо.
Вам нужно переносить БД в БД хостинга и всё в таком духе.
А БД откуда переносить? Из ./db/source
моего Volumes: - ./db/source:/var/lib/mysql
? Или искать БД в контейнере mariadb? Я просто не знаю где хранится БД контейнера mariadb, у контейнеров же своя файловая система...
Либо включить phpmyadmin
контейнер и сделать экспорт через него. Либо зайти в контейнер php make shell
и сделать дамп drush sql:dump --gzip --result-file=/var/www/html/dump.sql
и он появится в проекте. Главное не забыть удалить после чтобы в VCS не попало.
Я просто не знаю где хранится БД контейнера mariadb, у контейнеров же своя файловая система...
На будущее, для контейнера mariadb в volumes есть строка - /path/to/mariadb/data/on/host:/var/lib/mysql # Use bind mount
можно настроить, и будет храниться на хосте. Например, вот так — обратите что куда там монтируется и какая структура вообще. Она отличается от того что в статье \ видео и по умолчанию в D4D.
На будущее, для контейнера mariadb в volumes есть строка - /path/to/mariadb/data/on/host:/var/lib/mysql # Use bind mount можно настроить, и будет храниться на хосте.
А у меня с самого начала проекта в настройках была такая строка(если я правильно понял о чем вы). Вот такая у меня конфигурация сервиса mariadb с момента как создал проект:
services:
mariadb:
image: wodby/mariadb:$MARIADB_TAG
container_name: "${PROJECT_NAME}_mariadb"
stop_grace_period: 30s
environment:
MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
MYSQL_DATABASE: $DB_NAME
MYSQL_USER: $DB_USER
MYSQL_PASSWORD: $DB_PASSWORD
volumes:
- ./db/init:/docker-entrypoint-initdb.d
- ./db/source:/var/lib/mysql
То получается база данных у меня сохранялась на хосте? Здесь ./db/source
?
Если да, и она лежит в каком-то файле в папке ./db/source
возникает вопрос как перенести ее на хостинг?
Ведь в том phpmyadmin что установлен на моем компьютере, а не контейнерном phpmyadmin, я ее не вижу, возможно это потому что на компьютере у меня установлен mysql а mariadb, или какая-то другая причина.
Я просто не знаю где хранится БД контейнера mariadb То получается база данных у меня сохранялась на хосте? Здесь ./db/source?
Да это и есть БД, и она уже не в контейнере, а у вас на хосте, просто линкуется в контейнер при запуске. Но вам это не особо поможет в переносе на хостинг, там нужен .sql файл. Я написал какими способами его сделать выше.
Спасибо!
Попытался настроить хранение данных в альтернативном месте, но при up -d пишет, что вроде всё запускается, но при stop - останавливает только pma, traefik и mailhog. При docker ps вижу работающими только эти 3 контейнера. При этом ожидаемо не работает ничего...
Никита, снова здравствуйте! Недавно переустановил Linux, снова поставил D4D по этой инструкции и столкнулся с проблемой: drush не создает файлы дампа. Команда "drush sql-dump > test.sql" создает пустой файл. Как считаете, что может быть проблемой?
Наверное, слетели алиасы или docker compose новой версии (2).
Можно попробовать:
docker compose exec php drush sql:dump > test.sql
# Или команду ниже для старого docker compose.
docker-compose exec php drush sql:dump > test.sql
Если сработает одна из них — значит слетели алиасы.
$ docker-compose --version Docker Compose version v2.2.3 $ docker compose exec php drush sql:dump > test.sql docker: 'compose' is not a docker command. $ docker-compose exec php drush sql:dump > test.sql последний вариант также создал пустой файл test.sql
Другие команды drush вроде бы работают.
docker-compose exec -T php drush sql:dump > test.sql
вот так получается, спасибо что пнули в нужном направлении.
А может в статье указать, что сейчас нужно ставить последнюю версию docker-compose?
Так выходит что у вас никаких отличий от статьи нет. У вас просто не настроены алиасы, для этого отдельный раздел есть. Сами команды из алиаса у вас не поменялись даже.
Я имел ввиду версию docker-compose, а не алиасы.
В статье написано
"sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compo…-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose"
Сейчас вроде уже более новая версия актуальна.
Еще раз здравствуйте, Никита. Столкнулся с одной особенностью при бекапе БД.
Если его делать через drush sql:dump, а потом восстановить БД из этого файла - сайт работает очень медленно.
А если бекап сделать через Adminer - то после восстановления работает быстро.
Можете подсказать: в чем может быть проблема?
Подскажите, пожалуйста, устанавливаю Docker4Drupal на wsl2. Windows 10, Ubuntu 20.04.
Если в файле .env указан PROJECT_BASE_URL, который оканчивается localhost (например, drupal9.localhost), то после установки сайт просто открывается по этому адресу, с указанием соответствующего порта (drupal9.localhost:8000).
Если же изменить домен верхнего уровня в PROJECT_BASE_URL, например, указать drupal9.local, то сайт не откроется, в Chrome будет ошибка ERR_CONNECTION_REFUSED.
В файле hosts на Windows есть такая запись:
# Added by Docker Desktop
192.168.0.227 host.docker.internal
192.168.0.227 gateway.docker.internal
Если в этот hosts добавить запись с этим ip eth0 и названием хоста (192.168.0.227 drupal9.local) - сайт будет открываться.
Почему хост с доменом localhost открывается без добавления в файл hosts на Windows?
Теперь вместо "graph", надо "data-root" указывать
{
"data-root": "/home/USERNAME/.docker"
}
Рекомендую посмотреть в сторону Warden. Если рассматривать docker compose как обертку над docker, то warden это еще одна обертка над docker compose. Warden сокращает количество телодвижений в разы. Там работает все из коробки - xDebug, ssl сертификаты и прочее. Пожалуй самый простой и удобный инструмент контейнерной оркестрации для локальной разработки. Вот пример как в пару кликов установить друпал под варденом. https://docs.warden.dev/environments/drupal.html
упс. глупость написал. Все равно приходится.