Бесплатная миграция IT-инфраструктуры в облако

Как установить WordPress с помощью Docker

Миша Курушин
Миша Курушин
Технический писатель
18 июля 2023 г.
5566
13 минут чтения
Средний рейтинг статьи: 2

WordPress — это одна из множества популярных систем управления контентом на сайте (CMS), написанная на PHP. WordPress является open-source продуктом. Хранение данные в CMS основано на реляционной базе данных — MySQL.

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

Основой WordPress всегда служит некий технологический стек серверного ПО. Самым распространенным можно считать LAMP — Linux, Apache, MySQL, PHP.

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

Таким образом можно автоматизировать процесс установки и работы CMS, превращая WordPress в много-контейнерное приложение. Если вы разрабатываете продукт с использованием Docker, то после развертывания приложение однозначно заработает везде.

В этой инструкции мы рассмотрим развертывание тех-стека WordPress с применением Docker и Docker Compose. Однако, это будет не совсем LAMP — проект в этой инструкции основывается на таких компонентах, как Nginx, PHP, MySQL и конечно же WordPress.

Заметим, что данная инструкция предназначена для UNIX-подобных операционных систем — в частности, Debian и Ubuntu.

cloud

1. Установка компонентов Docker

Стоит упомянуть, что у нас есть отдельная подробная инструкция об инсталляции Docker на Ubuntu.

Шаг 1. Прежде всего рекомендуется предварительно обновить список существующих пакетов на вашей серверной машине:

sudo apt update

Шаг 2. Для гарантии корректного выполнения процесса установки, нам потребуются несколько ключевых пакетов для обеспечения работоспособности HTTPS-соединения:

sudo apt install apt-transport-https ca-certificates curl software-properties-common

Удаление старых версий Docker

Шаг 3. Для предотвращения возможных проблем, стоит проверить, установлена ли в вашей системе одна из старых версий Docker (docker-engine и docker.io, которые считаются устаревшими, в отличие от docker-ce и docker-ee). Если она присутствует, рекомендуется удалить ее:

sudo apt autoremove docker docker-engine docker.io docker-ce

Установка движка Docker

Шаг 4. Теперь можно взять ключ GPG от официального репозитория Docker и внести его в систему:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

А после включить в список пакетов и сам репозиторий:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

Шаг 5. Давайте еще раз обновим перечень пакетов, которые можно установить:

sudo apt update

Все! Теперь можно загрузить сам Docker:

sudo apt install docker-ce docker-ce-cli docker-compose-plugin

Для проверки наличия установленного Docker-а можно воспользоваться простой командой, которая выведет версию в терминал:

docker --version

Установка компонента Docker Compose

Docker Compose — это инструмент, позволяющий автоматизировать процесс управления контейнерами за счет использования специального файла-инструкции формата YAML.

В какой-то степени он похож на package.json в Node, но работает несколько шире — вы определяете службы, их зависимости, дисковые пространства и переменные окружения. А Docker Compose, следуя описаниям, выполняет автоматическое развертывание. В общем, именно это и обеспечивает переносимость разрабатываемых проектов.

Обратите внимание, что отдельная установка Docker Compose не требуется, если вы используете последние версии Docker. Вместо отдельного Compose V1 пакетом Docker CLI поставляется Compose V2, написанный на Go.

 

В этом случае вместо привычной команды docker-compose используется docker compose. Если по каким-то причинам вам требуется старая версия Compose V1, тогда инструкция ниже для вас.

Шаг 6. Из официального репозитория GitHub загрузим сначала исполняемый файл с новейшей версией docker-compose:

sudo curl -L "https://github.com/docker/compose/releases/download/2.19.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Шаг 7. Далее установим соответствующие права на использование этого файла:

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

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

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

docker-compose --version

2. Конфигурация Nginx

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

Особое значение имеет один из главных файлов конфигурации, который содержит настройки и маршрутизацию веб-сервера Nginx.

Создание каталогов

Шаг 1. Давайте создадим в домашней директории отдельный каталог для нашего приложения и сразу перейдем в него:

mkdir -p ~/wordpress
cd ~/wordpress

Здесь же создадим дополнительные подкаталоги внутри которых будут распределены данные Nginx, MySQL и WordPress.

mkdir -p nginx/
mkdir -p logs/
mkdir -p logs/nginx
mkdir -p data/
mkdir -p data/html
mkdir -p data/mysql

У нас имеется директория, предназначенная специально для хранения Nginx, а также отдельная папка, где будут сохраняться лог-файлы сервера. В каталоге с названием data будут размещены основные файлы CMS и базы данных.

Написание конфигурационного файла Nginx

Шаг 2. Теперь мы создадим конфигурационный файл для Nginx в ранее созданной директории, предназначенной для него:

nano ~/wordpress/nginx/nginx.conf

Шаг 3. Добавим минимальное описание в файл — исключительно под поставленные в этой инструкции задачи. В дальнейшем вы сможете расширять ее по мере роста сложности ваших проектов:

server {
  listen 80 default_server;
  server_name  _;

  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;
    }
}

Прослушиваемый порт — стандартный 80-й. При этом, директива default_server и настройка _ в server_name предписывает Nginx обрабатывать любые (с любым значением host в HTTP-заголовках) запросы на 80 порту.

Корневой каталог с файлами, которые будет отдавать сервер, находится по адресу /var/www/html, при этом среди них есть index.php — своего рода entry point (входная точка) в WordPress.

Далее указаны пути до файлов с логами — лог с запросами и лог с ошибками.

Стандартный route направляет пользователя во входную точку index.php, передавая также все аргументы (query string) из адреса. Соответственно, все запросы на php-файлы передаются непосредственно в контейнер PHP по протоколу FastCGI.

3. Описание необходимых образов и контейнеров 

Описание зависимостей в файле docker-compose

Нормальное функционирование WordPress подразумевает совместную работу 3 основных компонентов из ранее описанного тех-стека — сервер Nginx, сам WordPress и база данных MySQL.

При этом MySQL является основополагающим компонентом (сервер может быть любым, например Apache) приложения, т.к. все данные, которыми оперирует WordPress, располагаются именно там.

Поэтому потребуется дисковое пространство как для MySQL, так и для файлов тем оформления и плагинов, которые являются неотъемлемой частью CMS.

Именно по той причине, что WordPress является многокомпонентным приложением, для переносимого развертывания его структуры нам и понадобится docker-compose.

Шаг 1. Описание всех зависимостей мы разместим в специальном файле docker-compose.yml — создадим его:

sudo nano docker-compose.yml

Шаг 2. Сам файл наполним следующим содержимым:

version: '3.3'

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

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - ./data/html:/var/www/html
    ports:
      - "80:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST:  db:3306
      WORDPRESS_DB_USER: *имя пользователя от MySQL*
      WORDPRESS_DB_PASSWORD: *пароль от MySQL*
      WORDPRESS_DB_NAME: wordpress

  db:
    image: mysql:5.7
    volumes:
      - ./data/mysql:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: *root-пароль от MySQL*
      MYSQL_DATABASE: wordpress
      MYSQL_USER: *имя пользователя от MySQL*
      MYSQL_PASSWORD: *пароль от MySQL*

Тонкости написания yml-файлов находятся за пределами этой статьи — это отдельная обширная тема, о которой можно почитать в официальной справке. Пройдемся лишь по основным пунктам.

  • В данном случае мы сначала объявляем Nginx, WordPress и MySQL в качестве ключевых служб (контейнеров) приложения, при этом обязательно указываем их взаимосвязи. Например, для работы WordPress однозначно необходимо наличие базы данных.
  • Для WordPress и Nginx мы используем самые актуальные версии контейнеров. По умолчанию мы связываем их, резервируя 80-й порт для веб-трафика.
  • Когда вы вводите URL-адрес в браузер, контейнеры Nginx и WordPress работают совместно, последовательно обрабатывая запросы и возвращая пользователю сгенерированные веб-страницы в качестве ответа.
  • Служба базы данных представляет собой образ MySQL версии 5.7. Соответственно, мы не забываем указать переменные среды с необходимыми учетными данными для коммуникации контейнеров между собой.
  • Внутри каждой службы в параметре volumes объявляется дисковое пространство — каталоги, в которых хранятся рабочие файлы Nginx, WordPress и MySQL. Кстати, во время использования CMS в реальном проекте важно регулярно делать резервную копию (бекап) этих каталогов.

Необязательный компонент phpMyAdmin

Стоит упомянуть, что опционально вы можете включить в yml-файл образ phpMyAdmin:

...
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    restart: always
    links:
      - db:mysql
    ports:
    - "8081:80"
    environment:
      MYSQL_ROOT_PASSWORD: *пароль от MySQL*
...

Это веб-интерфейс, который является своего рода дополнением к MySQL — он позволяет управлять базой данных не через терминал и SQL-запросы, а визуально в окне браузера.

В нашем случае phpMyAdmin не является обязательным компонентом, но в более сложных проектах такой функционал может оказаться полезен.

Загрузка образов и запуск контейнеров

Шаг 3. Теперь можно запустить этот файл — Docker Compose сформирует из всех описанных образов рабочие контейнеры и соответствующим образом сконфигурирует их:

docker compose up -d

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

Если Docker Hub недоступен, можно использовать наш бесплатный прокси, который возобновляет этот доступ. 

Шаг 4. По завершению процесса стоит убедиться, что загруженные контейнеры действительно запущены:

docker compose ps

Если все корректно, то в терминале появится список работающих контейнеров, названия которых будут соответствовать описаниям в файле docker-compose.yml.

Возможность перезапуска контейнеров

Каждый из контейнеров можно перезапускать в случае необходимости. Например, если вы обновите конфигурацию Nginx, то для ее применения потребуется рестарт веб-сервера.

docker compose restart nginx

Однако, предстоит еще один этап. Сразу после завершения загрузки и запуска контейнеров появится возможность открыть веб-интерфейс WordPress — через него будет выполняться дальнейшая конфигурация CMS.

4. Завершение установки WordPress через веб-интерфейс

Шаг 1. В адресной строке веб-браузера нужно ввести адрес вашего сервера, после чего появится экран установки WordPress.

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

Шаг 2. Далее жмем «Продолжить». Откроется страница с основными настройками WordPress: название сайта, имя пользователя, пароль пользователя (либо сгенерировать автоматически) и email-адрес.

Image4

Есть еще особый пункт внизу, запрещающий поисковым системам индексировать ваш сайт. Если ваш сайт не является приватным порталом, индексацию стоит оставить, чтобы пользователи могли попасть на ваш сайт из поисковой выдачи. Кстати, в качестве имени пользователя лучше не использовать такие распространенные имена, как «admin» или «root» — они упростят задачу взлома злоумышленникам.

Кстати, в некоторых случаях может появиться экран, запрашивающий информацию о базе данных, предварительно созданной в phpMyAdmin. Однако, в нашем случае его не должно быть, т.к. мы заранее прописали все необходимые переменные среды в файле docker-compose.yml.

Image2

Шаг 3. Если все поля заполнены корректно, кнопка «Установить WordPress» перекинет вас на страницу авторизации. После входа в систему вы окажетесь в панели администратора. В ней много различных пунктов, но ее нельзя назвать сложной.

Image3

Дальнейшее использование WordPress заключается именно в оперировании множеством настроек внутри панели администратора. Исключением можно считать случай, когда PHP-переменные вручную проставляются в разметке страницы, тем самым превращая сырую HTML-верстку в полноценную тему WordPress, которую сможет установить любой желающий.

Если вы все таки установили phyMyAdmin, то его веб-интерфейс будет доступен по адресу вашего сервера, но на 8081 порту.

Image1

Подготовили для вас выгодные тарифы на облачные серверы

Заключение

Хотя существует множество способов развернуть локальную среду для разработки приложений на WordPress, Docker резко контрастирует на их фоне благодаря функциям компонентного разделения, кроссплатформенности и переносимости.

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

В этой инструкции мы использовали контейнеры Docker для развертывания всех необходимых компонентов приложения на WordPress и выполнили ряд ключевых действий:

  • Загрузили Docker и Docker Compose (для управления контейнерами).
  • Предварительно подготовили файл конфигурации Nginx, передающий пользовательские запросы в контейнер WordPress через FastCGI-протокол.
  • Опционально загрузили phpMyAdmin для удобного управления базой данных через пользовательский интерфейс.
  • Составили файл с описанием служб, после чего docker-compose автоматически скачал необходимые образы и запустил требуемые для корректной работы контейнеры. При этом в качестве веб-сервера использовался Nginx, а для хранения данных мы применили базу данных MySQL.
  • Завершили установку WordPress через админ-панель в браузере.

Эту базовую конфигурацию можно расширять или изменять различными способами. В качестве дополнения может выступить phpMyAdmin или совершенно другой веб-сервер на базе Apache или Node — в этом случае поступающие запросы будут передавать в WordPress через FastCGI-интерфейс.

На официальном сайте WordPress есть полноценная документация, описывающая нюансы работы с панелью администратора данной CMS. То же самое касается Nginx, на официальном сайте которого можно найти различные руководства по конфигурированию и использованию этого веб-сервера.

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
18 июля 2023 г.
5566
13 минут чтения
Средний рейтинг статьи: 2
Комментарии 13
Sam
12.10.2024, 21:34

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

Попробуйте, возможно вы захотите предлагать его вашим клиентам на VDS или Cloud: https://wp-box.org

Денис Игоревич
Денис Игоревич
05.04.2024, 18:25
  1. Использование ключа -p у mkdir при создании директории без вложения - не имеет смысла, поэтому команда вида mkdir -p logs выглядит как минимум странно. Не мучайте людей - дайте одну команду по созданию сразу на все, например mkdir -p /opt/wordpress/{nginx,data/html,data/mysql,logs/nginx}

  2. Блок nginx в docker-compose.yml написан неверно - параметр image, volumes, ports и links должны иметь одинаковый отступ, иначе получается что volumes, ports и links принадлежат image, что неверно.

  3. Вы забыли вытащить логи из контейнера nginx, хотя создали под это директорию на хосте, добавьте строку  - /opt/wordpress/logs/nginx:/var/log/nginx в блок  volumes для nginx. Ну а по-хорошему, размещайте логи согласно логике linux - в /var/log/ хостовой машины

Команда Timeweb Cloud
Команда Timeweb Cloud
09.04.2024, 11:05

Добрый день!

  1. Да, флаг -p имеет смысл использовать, только когда есть иерархия директорий. И все же команда mkdir в статье дается в более унифицированном виде, поэтому она используется сразу с флагом -p как в случае с вложенными директориями, так и без них. То есть флаг -p указывается заранее в момент написания команды, а путь каталога уже может варьироваться. При этом для большей наглядности команды mkdir выполняются последовательно, а не объединяются в одну большую команду.

  2. С image получилась описка, так как в других блоках (wordpress и db) image на том же уровне, что и остальные параметры. Спасибо, что обратили на это внимание. Мы внесли правки.

  3. Да, каталог логирования добавили в volumes веб-сервера.

Денис Игоревич
Денис Игоревич
10.04.2024, 05:35

Проверьте пути) Я давал пути их своей раскатки - у меня все в /opt, а Вы делаете все из домашней директории Обратитесь к кому-нибудь из ОТП - к Макарову Александру что ли, а лучше - к инженерам

Команда Timeweb Cloud
Команда Timeweb Cloud
23.04.2024, 03:17

Добрый день! Поправили docker-compose. Теперь volumes указывает на ранее созданные каталоги логирования. Спасибо, что обратили внимание 🙂

tarchevsky
tarchevsky
29.12.2023, 13:16

Здравствуйте! спасибо огромное за статью! очень полезная! Напишите, пожалуйста, вторую часть о том, как поставить wp на сервер с использованием домена и ssl от let's encrypt. В интернете очень немного материалов об этом, а те , которые есть, либо устарели, либо не очень информативные! Мне кажется, это было бы очень полезно! С наступающим!

Команда Timeweb Cloud
Команда Timeweb Cloud
15.01.2024, 05:15

Здравствуйте! Спасибо за идею, возьмем инструкцию в работу :)

имя
имя
06.12.2023, 20:24

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

Команда Timeweb Cloud
Команда Timeweb Cloud
07.12.2023, 08:06

Понимаем вашу боль :) Однако, Turbo Vision был выпущен 33 года назад, а сегодня разработка следует подходу «инфраструктура как код» (Infrastructure-as-Code, IaC), когда и код, и конфигурация указываются в виде текстовых файлов в формате кода. Так как сложность программных инструментов растет, это позволяет унифицировать множество вещей и, наоборот, упростить и ускорить конфигурацию.

имя
имя
06.12.2023, 20:08

sudo docker compose up -d

оШИБКА:

parsing /home/r/wordpress/docker-compose.yml: yaml: line 6: mapping values are not allowed in this context

Команда Timeweb Cloud
Команда Timeweb Cloud
07.12.2023, 06:13

Добрый день! Эта ошибка в YAML является исключительно синтаксической. Это может быть пропущенный пробел или символ «:». Но самое частое — использование табуляции вместо пробелов. Убедитесь, что вы не используете табуляцию нигде в YAML-файле.

Roman Tkachev
Roman Tkachev
12.03.2024, 14:27
      ports:
        - 8080:80

а должно быть

      ports:
        - «8080:80»

после этого ошибка mapping values are not allowed не появляется

Команда Timeweb Cloud
Команда Timeweb Cloud
19.03.2024, 05:47

Попросили автора перепроверить еще раз. Порты действительно необходимо указывать в кавычках, а именно:

ports:
  - "8080:80"

Поправили в статье. Спасибо за внимательность 💙