Настройка контейнера docker для разработки и тестирования WordPress

Немного о контейнеризации

Вопрос о применении контейнеризации возникает когда необходимо в быстром порядке развернуть веб-приложение на сервере, или обеспечить одинаковые условия на стадиях девелопмент и продакшен (исключить вариант — «А у меня все работает»). Кроме того, посредством контейнеризации можно разворачивать на одном сервере разные версии среды исполнения, например, хостинг приложений с разными версиями php, mysql.

Сам принцип контейнеризации отличается от виртуализации(когда в основной системе устанавливается виртуальная требующая соизмеримых ресурсов). Контейнеры разворачиваются на ядре основной системы — хоста, поэтому требования к «железу» значительно ниже. Контейнеры позволяют изолированно разворачивать компоненты системы включая в содержимое контейнера только то, что требуется. Сами контейнеры строятся на основе образов (images) которые представляют собой оболочку для компонентов. Например образ Apache, Mysql, php используется для контейнера на котором можно разрабатывать веб приложение.

Для работы с контейнерами необходимо установить следующие компоненты:

  • docker — программное обеспечение для виртуализации на уровне ядра системы, позволяет создать на основе образов среду для разработки или продакшена любого п.о.
  • docker-compose — расширение от разработчика позволяющего облегчить создание цепочки контейнеров каждый из которых выполняет свою задачу. Например, к контейнеру с веб-сервером подключить контейнер с базой данных.
  • docker-machine — ядро docker (включая linux) для развертывания системы контейнеризации на windows и mac.

Более подробно раскажу об установке docker на Arch Linux, установку на другие платформы лучше выполнять  по официальному руководству.

Установка

Установка  docker и docker-compose:

sudo pacman -S docker docker-compose

Добавить демон docker в сервисы, добавить пользователя в группу docker (разрешить работу с docker без root) и запустить сервис:

# Создание символической ссылки в systemctl для автозагрузки
sudo systemctl enable docker
# Добавление пользователя в группу docker
sudo gpasswd -a <user> docker
# Запуск службы
sudo systemctl start docker

Для того чтобы права на использование вступили в силу необходимо перезайти в систему.

Для windows установка не представляет сложности, в том случае если у вас Windows 10 Professional или Ultimate. Официально контейнеризация поддерживается только с применением Hyper-V, а она для Windows Home не доступна. В таком случае вам поможет альтернативное решение — Docker Toolbox  на основе виртуальной машины установленной в VirtualBox.

Разворачиваем контейнер для wordpress.

Для начала создадим папку для нашего проекта. Затем в этой папке создаем файл docker-compose.yaml.

Вы можете использовать расширение .yml при желании.

Процесс так же описан в официальной документации.

version: '3.3'
# Подключаемые контейнеры сервисов
services:
   # Контейнер с базой данных
   db:
     # Требуемый образ если его нет в системе, то он будет загружен автоматически
     image: mysql:5.7
     # Создаем том для хранения данных базы. При остановке и перезагрузке контейнера данные базы будут сохранены в нем  
     volumes:
       - db_data:/var/lib/mysql
     # Команда автоматически презагружает контейнер если он остановился
     restart: always
     # Переменные для доступа к базе данных
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
   # Контейнер с wordpress
   wordpress:
     # Добавляем зависимости
     depends_on:
       # Зависимость от базы данных. Без нее wordpress не поставить.
       - db
     # Версия wordpress контейнера - последняя
     image: wordpress:latest
     # Привязываем 80 порт локальной машины к 80 порту контейнера 
     ports:
       - "80:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
# Подключаем тома в качестве сервисов.
volumes:
    db_data:

Запускаем контейнеры:

docker-compose up

В итоге осталось только перейти по ссылке http://localhost:80  чтобы попасть на страницу установки wordpress.

Настройка доступа к папкам в контейнере.

Разумеется предлагаемого официальной документацией функционала недостаточно. Поскольку для нормальной работы требуется доступ к папкам на хостинге мы модифицируем наш файл docker-compose.yaml следующим образом:

version: '2'
services:
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    restart: always
    volumes:
      - ./wp-content:/var/www/html/wp-content
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: p4ssw0rd!
    ports:
      - 80:80
      - 443:443
    networks:
      - back
  db:
    image: mysql:5.7
    restart: always
    volumes:
       - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: p4ssw0rd!
    networks:
      - back
  phpmyadmin:
    depends_on:
      - db
    image: phpmyadmin/phpmyadmin
    restart: always
    ports:
      - 8080:80
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: p4ssw0rd!
    networks:
      - back
networks:
  back:
volumes:
  db_data:

После запуска контейнеров в нашей рабочей папке появится каталог wp-content который примонтирован в контейнер wordpress. Теперь все изменения в каталоге будут сразу отражатся на сайте.

При остановке и запуске контейнеров все изменения сохраняются. Подробнее ознакомится с управлением контейнерами и работой с docker можно в официальной документации.