🐹 CentOS 7: Установка WordPress с Nginx, PHP, MariaDB, PhpMyAdmin с помощью Docker Compose.

Содержание:

1. Что такое Docker Compose?
2. Разница между Docker и Docker Compose.
3. Типичный сценарий использования Docker Compose.
4. Подготовка хост-сервера.
5. Установка Docker-Compose.
6. Установка WordPress с Nginx, PHP, MariaDB, PhpMyAdmin.
7. Настройка Docker-Compose.
8. Запуск docker-compose.
9. Настройка CMS WordPress.
10. Доступ в контейнеры docker.
11. Полезные команды.
12. Оригиналы источников информации.


На чем было опробовано:

  1. CentOS Linux release 7.9.2009 (Core)
  2. Docker Compose version 1.29.1, build c34c88b2.
  3. Docker-py version: 5.0.0.
  4. CPython version: 3.7.10.
  5. OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019.

1. Что такое Docker Compose?

Docker Compose — это инструментальное средство, входящее в состав Docker. Оно предназначено для решения задач, связанных с развёртыванием проектов.

Изучая основы Docker, вы могли столкнуться с созданием простейших приложений, работающих автономно, не зависящих, например, от внешних источников данных или от неких сервисов. На практике же подобные приложения — редкость. Реальные проекты обычно включают в себя целый набор совместно работающих приложений.

Как узнать, нужно ли вам, при развёртывании некоего проекта, воспользоваться Docker Compose?

На самом деле — очень просто. Если для обеспечения функционирования этого проекта используется несколько сервисов, то Docker Compose может вам пригодиться. Например, в ситуации, когда создают web-сайт, которому, для выполнения аутентификации пользователей, нужно подключиться к базе данных. Подобный проект может состоять из двух сервисов — того, что обеспечивает работу сайта, и того, который отвечает за поддержку базы данных.

Технология Docker Compose, если описывать её упрощённо, позволяет, с помощью одной команды, запускать множество сервисов.

Что такое Docker и как его установить на операционную систему CentOS 7 читайте по ссылке.

Ссылка: «CentOS 7: Установка и использование Docker».

Docker – это программное обеспечение, которое может упаковать ваше приложение, его зависимости, системные инструменты, системные библиотеки и настройки в единый виртуальный контейнер. Этот комбинированный пакет, содержащий все необходимое для запуска вашего приложения, называется образом контейнера Docker. Этот образ представляет собой автономный исполняемый программный пакет, который надежно работает на любом сервере – GNU/Linux, Windows, macOS, публичное облако или частное облако. Также эти образы можно использовать для запуска приложения как изолированного процесса в пространстве пользователя.

Рассмотрим как развернуть WordPress с Nginx, php-fpm и MariaDB и PhpMyAdmin с помощью Docker Compose на компьютере с Ubuntu.

2. Разница между Docker и Docker Compose.

Docker применяется для управления отдельными контейнерами (сервисами), из которых состоит приложение.

Docker Compose используется для одновременного управления несколькими контейнерами, входящими в состав приложения. Этот инструмент предлагает те же возможности, что и Docker, но позволяет работать с более сложными приложениями.

Docker (отдельный контейнер) и Docker Compose (несколько контейнеров).

3. Типичный сценарий использования Docker Compose.

Docker Compose — это, в умелых руках, весьма мощный инструмент, позволяющий очень быстро развёртывать приложения, отличающиеся сложной архитектурой. Сейчас мы рассмотрим пример практического использования Docker Compose, разбор которого позволит вам оценить те преимущества, которые даст вам использование Docker Compose.

WordPress — бесплатная система управления контентом (CMS) с открытым исходным кодом, которая опирается на базу данных MySQL и обрабатывает запросы с помощью PHP. Благодаря огромному количеству плагинов и системе шаблонов, а также тому факту, что большая часть административных функций может производиться через web-интерфейс, WordPress завоевала популярность среди создателей самых разных сайтов, от блогов и страниц с описанием продукта и до сайтов электронной торговли.

Для запуска WordPress, как правило, требуется установка стека LAMP (Linux, Apache, MySQL и PHP) или LEMP (Linux, Nginx, MySQL и PHP), что может занять много времени. С помощью таких инструментов, как Docker и Docker Compose, вы можете упростить процесс настройки предпочитаемого стека и установки WordPress.

Вместо установки отдельных компонентов вручную, вы можете использовать образы, которые обладают такими стандартными элементами, как библиотеки, файлы конфигурации и переменные среды, и запускать эти образы в контейнерах, то есть изолированных процессах, запущенных в общей операционной системе. Кроме того, используя Docker Compose, вы можете координировать действия нескольких контейнеров, например приложения и базы данных, которые будут коммуницировать друг с другом.

4. Подготовка хост-сервера.

4.1. Обновим операционную систему CentOS 7 до актуального состояния:

# yum -y update && yum -y upgrade

4.2. Устанавливаем файловый менеджер Midnight Commander и интернет качалку wget:

# yum -y install mc wget

4.3. Отключим SELinux.

Состояние работы SELinux:

# sestatus

Ответ:

SELinux включен. Отключим его.

Для этого достаточно выполнить замену строки в вышеописанном конфигурационном файле следующей командой:

# sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config

После перезагрузки:

# shutdown -r now

Проверим состояние SELinux с помощью команды sestatus, как показано ниже:

# sestatus

SELinux выключен.

4.4. Установка Docker.

Установка и настройка производится по инструкции.

Ссылка: «CentOS 7: Установка и использование Docker».

5. Установка Docker-Compose.

Docker-Compose доступен в репозитории, но его версии немного отстают от последней.

Крайнюю и актуальную версию можно посмотреть здесь по ссылке:

# https://github.com/docker/compose/releases

Поэтому скачаем актуальную версию с GitHub.

# sudo wget -O /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/1.29.1/docker-compose-Linux-x86_64

# sudo chmod +x /usr/local/bin/docker-compose

После завершения процесса проверьте установленную версию Docker Compose:

# docker-compose version

Ответ:

6. Установка WordPress с nginx, PHP, MariaDB, PhpMyAdmin.

Для запуска WordPress, как правило, требуется установка стека LEMP (Linux, Nginx, MySQL и PHP), что может занять много времени.

С помощью таких инструментов, как Docker и Docker Compose, вы можете упростить процесс настройки предпочитаемого стека и установки WordPress. Вместо установки отдельных компонентов вручную, вы можете использовать образы, которые обладают такими стандартными элементами, как библиотеки, файлы конфигурации и переменные среды, и запускать эти образы в контейнерах, то есть изолированных процессах, запущенных в общей операционной системе. Кроме того, используя Compose, вы можете координировать действия нескольких контейнеров, например приложения и базы данных, которые будут коммуницировать друг с другом.

И маленькое замечание насчет безопасности — вам придется выполнять все команды или от root или от sudo или добавить вашего пользователя в группу docker (лучше последнее).

В целях безопасности, мы не будем работать через root, а добавим существующего пользователя в группу docker и перезагрузим службу:

# usermod -a -G docker $USER

Чтобы Docker Compose корректно работал, перезапустим службу Docker:

# systemctl restart docker

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

С Docker придется понять, что теперь не панель управления, а вы должны будете придумать, где разместить ваши данные из контейнера, будь то сайт или что-то еще

То есть, теперь не будет никаких кнопочек а-ля «Файловый менеджер«, которые сразу откроют вам папочку с данными ваших контейнеров. Вы должны сами придумать, где будете работать. К примеру это ~/dockerfiles/somefolder.

Создадим каталоги в которых будут хранится данные.

# cd ~

# mkdir -p wordpress-compose

# cd wordpress-compose/

# touch docker-compose.yml

# mkdir -p nginx/

# mkdir -p logs/

# mkdir -p logs/nginx

# mkdir -p data/

# mkdir -p data/html

# mkdir -p data/mysql

  • docker-compose.yml — это конфигурационный файл, в котором мы описываем какие контейнеры запускать, их настройки и связи между контейнерами.
  • nginx/ — каталог используемый для дополнительной конфигурации Nginx, как виртуального хоста и так далее.
  • logs/ — каталог логов для Nginx, MariaDB и php.
  • data/ — каталог с файлами WordPress и файлы базы данных.

Далее в каталоге wordpress-compose/nginx создайте новый файл с конфигурацией Nginx :

# mcedit ~/wordpress-compose/nginx/nginx.conf

Вставьте следующее содержимое:

server {
  listen 80;
  listen [::]:80;

  root /var/www/html;
  index index.php;

  access_log /var/log/nginx/site-access.log;
  error_log /var/log/nginx/site-error.log;

  location / {
    try_files $uri $uri/ /index.php?$args;
  }

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass wordpress:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}

Сохраните файл и выйдите из редактора.

7. Настройка Docker-Compose.

Есть Docker port, а есть Published port. Docker port — это порт, который контейнер будет считать, что использует, а Published это порт, через который будет доступен Docker port на родительской машине. Простыми словами, это проброс портов

Мы будем использовать Nginx последней версии. Настроим сопоставление портов для порта 8080 на хосте с портом 80 в контейнере. Настроим конфигурацию виртуального хоста Nginx, файлы журнала Nginx и корневой каталог веб-сервера /var/www/html. Также укажем что контейнер Nginx связан с контейнером WordPress.

Контейнер — это как виртуальная машина. Его можно удалить, остановить, возобновить, подключиться к терминалу. В общем, делать все, что и с обычным Linux сервером или виртуальной машиной

Dockerfile — это набор инструкций, как нужно создавать контейнер. Пример такого файла можно увидеть здесь. Описание основных инструкций вот здесь

docker-compose.yml — в докере один Dockerfile это один сервис. Если вам нужен один сервис, например, торренто-качалка или генерация Let’s Encrypt сертификата, вы можете запустить его через docker run. Но если у вас приложение, состоящее из нескольких сервисов (PHP + Nginx + MySQL), то запускать их все по очереди длинными командами с кучей параметров было бы, как минимум, неудобно. Этот файл объединяет все в одном месте и управляется через команду docker-compose.

# docker-compose --help

Ответ:

Перейдем от теории к практике.

Отредактируем файл docker-compose.yml:

# mcedit docker-compose.yml

Добавим в него содержимое:

nginx: 
  image: nginx:latest
    volumes:
      - ./nginx:/etc/nginx/conf.d
      - ./data/html:/var/www/html
      - ./var/log/nginx:/var/log/nginx
    ports:
      - 8080:80
    links:
      - wordpress

Если вы копируете текст с сайта и вставляете в конфигурационный файл, убедитесь что форматирование не съехало и не появилось новых символов и пробелов, потому что из-за этого нарушается структура файла, что приводит к ошибкам.

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

Для этого, вставьте в конфигурационный docker-compose.yml текст:

  mysql:
    image: mariadb
    volumes:
      - ./data/mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 4m3SxCpaQb*6LB#
      MYSQL_DATABASE: db_wordpress
      MYSQL_USER: user_wp
      MYSQL_PASSWORD: 9UqfqeE9#hn2@t^
    restart: always

Теперь мы будем настраивать WordPress с помощью образа WordPress с php-fpm 7.4. Подключаем том Docker для директории /var/www/html в каталоге хоста WordPress, настроим базу данных, определив переменную среду WordPress, и свяжем WordPress с MySQL. Данные по настройке базы данных должны соответствовать предыдущей секции.

Вставьте в конфигурационный docker-compose.yml текст:

wordpress:
    image: wordpress:php7.4-fpm-alpine
    volumes:
      - ./data/html:/var/www/html
    depends_on:
      - mysql
    environment:
      WORDPRESS_DB_HOST: mysql
      MYSQL_ROOT_PASSWORD: 4m3SxCpaQb*6LB#
      WORDPRESS_DB_NAME: db_wordpress
      WORDPRESS_DB_USER: user_wp
      WORDPRESS_DB_PASSWORD: 9UqfqeE9#hn2@t^
      WORDPRESS_TABLE_PREFIX: wp_
    links:
      - mysql
    restart: always

Для управления СУБД прикручиваем phpmyadmin и на порт 8081:

pma:
  image: phpmyadmin/phpmyadmin
  restart: always
  links:
    - mysql:mysql
  ports:
    - 8081:80
  environment:
    PMA_HOST: mysql
    MYSQL_USERNAME" root
    MYSQL_ROOT_PASSWORD: 4m3SxCpaQb*6LB#

После добавления составных частей в docker-compose.yml — файла, сохраните его и выйдите из редактора. Конфигурация docker-compose готова.

У Вас должен получиться файл с таким содержимым:

version: '3'
services:

  mysql:
    image: mariadb
    volumes:
      - ./data/mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 4m3SxCpaQb*6LB#
      MYSQL_DATABASE: db_wordpress
      MYSQL_USER: user_wp
      MYSQL_PASSWORD: 9UqfqeE9#hn2@t^
    restart: always

  wordpress:
    image: wordpress:php7.4-fpm-alpine
    volumes:
      - ./data/html:/var/www/html
    depends_on:
      - mysql
    environment:
      WORDPRESS_DB_HOST: mysql
      MYSQL_ROOT_PASSWORD: 4m3SxCpaQb*6LB#
      WORDPRESS_DB_NAME: db_wordpress
      WORDPRESS_DB_USER: user_wp
      WORDPRESS_DB_PASSWORD: 9UqfqeE9#hn2@t^
      WORDPRESS_TABLE_PREFIX: wp_
    links:
      - mysql
    restart: always

  nginx:
    image: nginx:latest
    volumes:
      - ./nginx:/etc/nginx/conf.d
      - ./data/html:/var/www/html
      - ./var/log/nginx:/var/log/nginx
    ports:
      - 8080:80
    links:
      - wordpress

  pma:
    image: phpmyadmin/phpmyadmin
    restart: always
    links:
      - mysql:mysql
    ports:
      - 8081:80
    environment:
      PMA_HOST: mysql
      MYSQL_USERNAME: root
      MYSQL_ROOT_PASSWORD: 4m3SxCpaQb*6LB#

8. Запуск docker-compose.

Начнем создание новых контейнеров с docker-compose. Перейдите в каталог WordPress и запустите новые контейнеры на основании созданного нами файла.

# cd ~/wordpress-compose/

# docker-compose up -d

Побегут индикаторы загрузки образов:

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

Были созданы четыре контейнера.

Давайте проверим состояние контейнеров.

# docker-compose ps

Ответ:

Если вы хотите увидеть вывод журнала из контейнера, вы можете использовать команды ниже:

# docker-compose logs nginx
# docker-compose logs mysql
# docker-compose logs wordpress

Ответ: много всяких отчетов.

9. Настройка CMS WordPress.

Теперь откройте веб-браузер и введите URL-адрес сервера или IP-адрес.

# http://server_IP:8080/

Вы должны увидеть страницу установки WordPress.

Выберите свой язык и нажмите ‘продолжить’.

Если у Вас не открылась страница установки, посмотрите лог-файлы Nginx, а также файл hosts на компьютере с которого вы пытаете открыть сайт. Заполните детали, такие как: название сайта, имя пользователя, пароль, адрес электронной почты и нажмите кнопку ‘Установить WordPress’.

Вы будете перенаправлены на панель администратора WordPress.

WordPress установлен с помощью docker-compose.

Также по адресу http://server_IP:8081/ доступен phpMyAdmin

10. Доступ в контейнеры docker.

Чтобы убедиться, что все контейнеры доступны и проверить их состояние введите команду:

# docker-compose ps

Ответ:

У нас уже 4 контейнера, теперь мы можем попытаться войти в каждый.

Войдите в первый контейнер Nginx с помощью команды docker-compose.

# docker-compose exec nginx bash

  • nginx – имя файла в docker-compose.yml.
  • bash – выполнение команды в оболочке bash.

Теперь проверим наши настройки виртуального хоста на WordPress.

# cat /etc/nginx/conf.d/nginx.conf

Файл доступен в контейнере.

Для выхода наберите:

# exit

Далее попробуйте войти в контейнер MySQL, а затем в оболочку MySQL с помощью нашего пароля на файле.

# docker-compose exec mysql bash

# mysql -u root -p4m3SxCpaQb*6LB#

Посмотреть список баз данных:

# show databases;

Вы увидите нашу базу данных WordPress.

Для выхода из базы данных наберите:

# exit

Для выхода из контейнера наберите:

# exit

В контейнере WordPress вы увидите все файлы CMS WordPress.

# docker-compose exec wordpress bash
# ls -lah

Ответ:

11. Полезные команды.

Рассмотрим некоторые команды, которые могут вам пригодиться при работе с Docker Compose.

11.1. Запуск контейнера.

  • Фоновый — запустили и отключились detach.

# docker run -d mysql

  • Со своим названием.

# docker run --name database mysql

  • Этот удалится после отключения от него или выполнения задачи.

# docker run -rm ubuntu pwd

  • Проброс порта с контейнера на хост. Слева порт на хосте (Published).

docker run -p 8080:80 -d nginx

  • Остановка работающего. Данные внутри сохраняются. Запуск через start.

# docker stop NAME

  • Удаление контейнера. Проброшенные в него файлы сохраняются.

# docker rm NAME (-f удаляет даже если контейнер запущен)

11. 2. Отладка.

  • Подключение к терминалу контейнера.

# docker exec -it NAME bash

  • Посмотреть лог-файлы внутри контейнера (STDOUT, STDERR).

# docker logs -f NAME

11.3. Управление образами.

  • Сборка образа контейнера на базе Dockerfile (точка в конце нужна).

# docker build --tag image-name .

  • Список.

# docker images -a

  • Удаление.

# docker image rm NAME (-f force)

  • Переименование.

# docker image tag SOURCE[:TAG] TARGET[:TAG]

11. 4. docker-compose.

  • Создание/обновление контейнеров приложения в фоне (-d).

# docker-compose up -d APP_NAME

  • Остановка.

# docker-compose stop

  • Запуск остановленного приложения.

# docker-compose start

  • Остановка и удаление. Эта команда позволяет останавливать и удалять контейнеры и другие ресурсы, созданные командой docker-compose up.

# docker-compose down

  • Лог-файлы всех сервисов приложения.

# docker-compose logs -f

11.5. Другие полезности.

  • Работающие и остановленные контейнеры.

# docker ps -a (без -a только работающие)

  • Показать данные контейнера. Тут можно найти его IP, пути к volumes и кучу другого.

# docker inspect NAME

11.6. Чистка мусора.

  • Удалить все остановленные контейнеры.

# docker rm $(docker ps -a -q)

  • Удалить незакрепленные ни за каким контейнером volumes.

# docker volume rm $(docker volume ls -f dangling=true -q)

  • Удалить неиспользуемые сети.

# docker network prune

  • Удалить все неиспользуемые данные.

# docker system prune -a

  • Удалить контейнеры, что остановлены больше часа назад + образы, с которыми не работает ни один контейнер, продвинутый способ.

# docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc:ro spotify/docker-gc

11.7. Прочие команды.

  • Эта команда выводит журналы сервисов:

# docker-compose logs -f [service name]

  • Например, в нашем проекте её можно использовать в таком виде:

# docker-compose logs -f [service name].

  • С помощью такой команды можно вывести список контейнеров:

# docker-compose ps

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

# docker-compose exec [service name] [command]

    • Например, она может выглядеть так:

# docker-compose exec wordpress ls

  • Такая команда позволяет вывести список образов:

# docker-compose images

Ответ:

12. Оригиналы источников информации.

  1. habr.com «Руководство по Docker Compose для начинающих».
  2. digitalocean.com «Установка WordPress с помощью Docker Compose».
  3. admin812.ru «Развертывание WordPress с NGINX, PHP-FPM и MariaDB с помощью Docker ComposeРазвертывание WordPress с NGINX, PHP-FPM и MariaDB с помощью Docker Compose».
  4. blog.amd-nick.me «Просто о сложном — Docker».