Docker очень популярная тема, давно интересуюсь контейнеризацией, и всё чаще в последнее время использую для своих проектов, а также для проектов в drupal-coder.ru.
Подробнее про саму технологию можно почитать тут:
https://docs.docker.com/engine/understanding-docker/
https://habrahabr.ru/company/infobox/blog/237405/
https://habrahabr.ru/post/253877/
Сегодня я хочу рассказать как можно использовать Docker для локальной разработки Drupal сайтов. Инструкция приведена для ubuntu 16.04 LTS.
Условия задачи:
1) Быстро запускать требуемую среду для Drupal 7/8 проектов
2) Папки с файлами сайтов не должны быть привязаны к контейнеру, должны пробрасываться в контейнер, чтобы была возможность локально редактировать.
3) Возможность подключиться по ssh в контейнер
4) Базы mysql также не должны быть привязаны к контейнеру, папка с данными mysql пробрасывается в контейнер, данные будут сохраняться вне зависимости от наличия контейнера.
Установка Docker
Подробная инструкия по установке на официальном сайте
Пошаговая инструкция на русском:
- Обновление информации о пакетах и проверяем что APT готов работать по HTTPS:
$ sudo apt-get update $ sudo apt-get install apt-transport-https ca-certificates
- Добавляем новый GPG ключ:
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
- В файл /etc/apt/sources.list.d/docker.list добавляем строку:
deb https://apt.dockerproject.org/repo ubuntu-xenial main
- Обновляем информацию о пакетах, устанавливаем docker и запускаем демон:
$ sudo apt-get update $ sudo apt-get install docker-engine $ sudo service docker start
- Проверяем что docker установлен корректно:
$ sudo docker run hello-world
- Добавляем текущего пользователя в группу docker, чтобы была возможно запуска без sudo:
sudo usermod -aG docker $(whoami)
Запуск контейнера
Создадим под локальным пользователем папку projects в которой будут содержаться наши проекты и папку проекта drupal-admin.ru:
mkdir -p ~/projects/drupal-admin.ru
В качестве образа docker мне понравился https://hub.docker.com/r/wadmiraal/drupal/ его и будем использоваться для запуска.
docker run -d -p 8080:80 -p 30022:22 -p 3306:3306 -v ~/projects/drupal-admin.ru:/var/www -v mysql-data:/var/lib/mysql --name testsite -t wadmiraal/drupal
В этой команде мы примонтировали папку проекта в /var/www и создали data volume для хранения баз mysql.
По поводу именования образов:
- для Drupal 8 можно использовать образ wadmiraal/drupal:8
- для Drupal 7 можно использовать образ wadmiraal/drupal:7
Работа с Drupal сайтом в контейнере docker
Подключение по ssh к docker контейнеру (пользователь: root, пароль: root, порт: 30022):
ssh root@127.0.0.1 -p 30022
К mysql можно подключаться из консоли ssh командой:
mysql
Просмотреть сайт из браузера можно по адресу: http://127.0.0.1:8080
Просмотреть список запущенных контейнеров:
docker ps
Остановить запущенный контейнер:
docker kill [id контейнера]
Используем Docker-compose для быстрого старта
Docker-compose удобная утилита для работы с контейнерами, позволяющая быстро стартовать и останавливать контейнеры. Установка docker-compose:
$ curl -L https://github.com/docker/compose/releases/download/1.6.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose $ chmod +x /usr/local/bin/docker-compose
Подготавливаем файл конфигурации ~/projects/compose/docker-compose.yml:
version: '2' services: drupal_admin: image: wadmiraal/drupal:8 volumes: - mysql-data:/var/lib/mysql - /home/testuser/projects/drupal-admin.ru/:/var/www ports: - "8080:80" - "30022:22" - "3306:3306" restart: always volumes: mysql-data: external: true
Это yml файл, в котором можно хранить информацию о всех сайтах и их окружениях, которые необходимо запускать в контейнерах.
Запуск контейнера:
docker-compose up -d drupal_admin
Остановка контейнера:
docker-compose stop drupal_admin
Таким образом c использование docker-compose можно существенно упростить управление контейнерами, а в docker-compose.yml хранить информацию о всех своих Drupal сайтах в разработке.
Вот бы еще про докер под Винду... никак не займусь мазохизмом, пересаживаясь на *nix, ubuntu и всякие няшки. Почему-то консоль всегда вызывает уныние, а без линухов толком не запустишь ни драш, ни друпалконсоль. Есть vagrant, но xdebug плохо из под винды с phpstorm дружит, наверно потому что не умею готовить(((( приходится извращаться
А если контейнер остановлен или уничтожен - изменения тоже пропадут? Как вообще с этим работать чтобы всё сохранялось, или оно не пропадает?