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
Стоит упомянуть, что у нас есть отдельная подробная инструкция об инсталляции 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
Прежде чем приступить к описанию структуры контейнеров в файле 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.
Описание зависимостей в файле 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-файлов находятся за пределами этой статьи — это отдельная обширная тема, о которой можно почитать в официальной справке. Пройдемся лишь по основным пунктам.
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.
Шаг 1. В адресной строке веб-браузера нужно ввести адрес вашего сервера, после чего появится экран установки WordPress.
Сперва нужно будет выбрать язык, на котором будет работать CMS. Скорее всего вам будет нужен русский или английский.
Шаг 2. Далее жмем «Продолжить». Откроется страница с основными настройками WordPress: название сайта, имя пользователя, пароль пользователя (либо сгенерировать автоматически) и email-адрес.
Есть еще особый пункт внизу, запрещающий поисковым системам индексировать ваш сайт. Если ваш сайт не является приватным порталом, индексацию стоит оставить, чтобы пользователи могли попасть на ваш сайт из поисковой выдачи. Кстати, в качестве имени пользователя лучше не использовать такие распространенные имена, как «admin» или «root» — они упростят задачу взлома злоумышленникам.
Кстати, в некоторых случаях может появиться экран, запрашивающий информацию о базе данных, предварительно созданной в phpMyAdmin. Однако, в нашем случае его не должно быть, т.к. мы заранее прописали все необходимые переменные среды в файле docker-compose.yml
.
Шаг 3. Если все поля заполнены корректно, кнопка «Установить WordPress» перекинет вас на страницу авторизации. После входа в систему вы окажетесь в панели администратора. В ней много различных пунктов, но ее нельзя назвать сложной.
Дальнейшее использование WordPress заключается именно в оперировании множеством настроек внутри панели администратора. Исключением можно считать случай, когда PHP-переменные вручную проставляются в разметке страницы, тем самым превращая сырую HTML-верстку в полноценную тему WordPress, которую сможет установить любой желающий.
Если вы все таки установили phyMyAdmin, то его веб-интерфейс будет доступен по адресу вашего сервера, но на 8081 порту.
Подготовили для вас выгодные тарифы на облачные серверы
Хотя существует множество способов развернуть локальную среду для разработки приложений на WordPress, Docker резко контрастирует на их фоне благодаря функциям компонентного разделения, кроссплатформенности и переносимости.
С помощью Docker можно настраивать сразу несколько сред рядом друг с другом, используя разные компоненты. Каждый из них можно включать или исключать из используемого стека в зависимости от потребностей и задач.
В этой инструкции мы использовали контейнеры Docker для развертывания всех необходимых компонентов приложения на WordPress и выполнили ряд ключевых действий:
docker-compose
автоматически скачал необходимые образы и запустил требуемые для корректной работы контейнеры. При этом в качестве веб-сервера использовался Nginx, а для хранения данных мы применили базу данных MySQL.Эту базовую конфигурацию можно расширять или изменять различными способами. В качестве дополнения может выступить phpMyAdmin или совершенно другой веб-сервер на базе Apache или Node — в этом случае поступающие запросы будут передавать в WordPress через FastCGI-интерфейс.
На официальном сайте WordPress есть полноценная документация, описывающая нюансы работы с панелью администратора данной CMS. То же самое касается Nginx, на официальном сайте которого можно найти различные руководства по конфигурированию и использованию этого веб-сервера.
Привет, я делаю проект, в котором, в том числе, есть более продвинутый вариант использования Docker вместе с WordPress, подходящий и для прода.
Попробуйте, возможно вы захотите предлагать его вашим клиентам на VDS или Cloud: https://wp-box.org
Использование ключа -p у mkdir при создании директории без вложения - не имеет смысла, поэтому команда вида mkdir -p logs выглядит как минимум странно. Не мучайте людей - дайте одну команду по созданию сразу на все, например
mkdir -p /opt/wordpress/{nginx,data/html,data/mysql,logs/nginx}
Блок nginx в docker-compose.yml написан неверно - параметр image, volumes, ports и links должны иметь одинаковый отступ, иначе получается что volumes, ports и links принадлежат image, что неверно.
Вы забыли вытащить логи из контейнера nginx, хотя создали под это директорию на хосте, добавьте строку
- /opt/wordpress/logs/nginx:/var/log/nginx
в блок volumes для nginx. Ну а по-хорошему, размещайте логи согласно логике linux - в /var/log/ хостовой машиныДобрый день!
Да, флаг
-p
имеет смысл использовать, только когда есть иерархия директорий. И все же командаmkdir
в статье дается в более унифицированном виде, поэтому она используется сразу с флагом-p
как в случае с вложенными директориями, так и без них. То есть флаг-p
указывается заранее в момент написания команды, а путь каталога уже может варьироваться. При этом для большей наглядности командыmkdir
выполняются последовательно, а не объединяются в одну большую команду.С
image
получилась описка, так как в других блоках (wordpress
иdb
) image на том же уровне, что и остальные параметры. Спасибо, что обратили на это внимание. Мы внесли правки.Да, каталог логирования добавили в
volumes
веб-сервера.Проверьте пути) Я давал пути их своей раскатки - у меня все в /opt, а Вы делаете все из домашней директории Обратитесь к кому-нибудь из ОТП - к Макарову Александру что ли, а лучше - к инженерам
Добрый день! Поправили
docker-compose
. Теперьvolumes
указывает на ранее созданные каталоги логирования. Спасибо, что обратили внимание 🙂Здравствуйте! спасибо огромное за статью! очень полезная! Напишите, пожалуйста, вторую часть о том, как поставить wp на сервер с использованием домена и ssl от let's encrypt. В интернете очень немного материалов об этом, а те , которые есть, либо устарели, либо не очень информативные! Мне кажется, это было бы очень полезно! С наступающим!
Здравствуйте! Спасибо за идею, возьмем инструкцию в работу :)
Как меня бесит текст писать в файлах, почему конфигуратор нельзя? К кажому сервису на турбо вижн если кто помнит, визуальный конфигуратор. Как мне догадатся что туда в этот файл записать и почему оно не работатет? аааааа
Понимаем вашу боль :) Однако, Turbo Vision был выпущен 33 года назад, а сегодня разработка следует подходу «инфраструктура как код» (Infrastructure-as-Code, IaC), когда и код, и конфигурация указываются в виде текстовых файлов в формате кода. Так как сложность программных инструментов растет, это позволяет унифицировать множество вещей и, наоборот, упростить и ускорить конфигурацию.
sudo docker compose up -d
оШИБКА:
parsing /home/r/wordpress/docker-compose.yml: yaml: line 6: mapping values are not allowed in this context
Добрый день! Эта ошибка в YAML является исключительно синтаксической. Это может быть пропущенный пробел или символ «:». Но самое частое — использование табуляции вместо пробелов. Убедитесь, что вы не используете табуляцию нигде в YAML-файле.
а должно быть
после этого ошибка mapping values are not allowed не появляется
Попросили автора перепроверить еще раз. Порты действительно необходимо указывать в кавычках, а именно:
Поправили в статье. Спасибо за внимательность 💙