Установка WordPress в Docker с MariaDB и Nginx на хосте
Введение
В этом руководстве мы установим WordPress, используя несколько Docker-контейнеров: один для WordPress, другой для базы данных MariaDB. Nginx будет установлен на хосте и настроен как обратный прокси (reverse proxy) для контейнера с WordPress.
Краткая дефиниция: Docker — платформа для упаковки приложений в контейнеры, которые изолируют процессы и зависимости на уровне ОС.
Важно: сохраняйте секреты и пароли вне публичных скриптов, используйте переменные окружения и/или секреты Docker в продакшене.
Основные требования
- Ubuntu 15.04 x86_64 (в примере) — команды подходят и для других версий Ubuntu с незначительными изменениями
- Права root или sudo
- Базовые знания Docker
Содержание (что вы получите)
- Настройка Docker и скачивание образов
- Создание контейнера MariaDB и проверка подключения
- Создание контейнера WordPress и проверка работы локально на порту 8081
- Установка Nginx на хосте и его настройка как reverse proxy
- Чек-листы для ролей (DevOps / Разработчик / Админ), критерии приёмки
- Советы по безопасности, резервному копированию и отладке
Шаг 1 - Установка Docker
В этом шаге мы обновим репозитории Ubuntu и установим docker.io.
Станьте root-пользователем для следующих команд:
sudo -sОбновим индекс пакетов apt:
apt-get updateУстановим Docker:
apt-get install docker.ioПосле окончания установки запустите Docker и добавьте автозапуск при старте системы:
systemctl start docker
systemctl enable dockerПроверим версию Docker и запустим тестовый контейнер:
docker version
docker run hello-worldDocker установлен.
Шаг 2 - Настройка контейнера MariaDB
Скачиваем официальный образ MariaDB из Docker Hub:
docker pull mariadbПросмотреть локальные образы:
docker imagesСоздаём локальные каталоги для данных и кода WordPress (используются как тома):
mkdir ~/wordpress
mkdir -p ~/wordpress/database
mkdir -p ~/wordpress/htmlЗапускаем контейнер MariaDB с переменными окружения для паролей и баз данных. В примере используются простые пароли — в продакшене используйте сложные секреты и Docker secrets:
docker run -e MYSQL_ROOT_PASSWORD=aqwe123 -e MYSQL_USER=wpuser -e MYSQL_PASSWORD=wpuser@ -e MYSQL_DATABASE=wordpress_db -v /root/wordpress/database:/var/lib/mysql --name wordpressdb -d mariadbПояснение параметров:
- MYSQL_ROOT_PASSWORD — пароль для root MySQL
- MYSQL_USER — создаётся пользователь базы данных (wpuser)
- MYSQL_PASSWORD — пароль для wpuser
- MYSQL_DATABASE — создаётся база данных wordpress_db
- -v /root/wordpress/database:/var/lib/mysql — том: данные базы сохраняются на хосте
- –name wordpressdb — имя контейнера
Проверим IP-адрес контейнера (в сети по умолчанию Docker):
docker inspect -f '{{ .NetworkSettings.IPAddress }}' wordpressdbПодключимся к базе с хоста (пример):
mysql -u wpuser -h 172.17.0.2 -p
TYPE PASSWORD: wpuser@Проверим наличие базы:
show databases;Изображение: проверка базы данных в контейнере

Контейнер MariaDB и база готовы.
Шаг 3 - Настройка контейнера WordPress
Скачиваем официальный образ WordPress с Docker Hub:
docker pull wordpress:latestЗапускаем контейнер WordPress и связываем его с контейнером базы данных (в примере порт 80 контейнера проброшен на 8081 хоста):
docker run -e WORDPRESS_DB_USER=wpuser -e WORDPRESS_DB_PASSWORD=wpuser@ -e WORDPRESS_DB_NAME=wordpress_db -p 8081:80 -v /root/wordpress/html:/var/www/html --link wordpressdb:mysql --name wpcontainer -d wordpressПояснение параметров:
- WORDPRESS_DB_USER, WORDPRESS_DB_PASSWORD, WORDPRESS_DB_NAME — параметры подключения WordPress к базе
- -p 8081:80 — проброс порта 80 контейнера на 8081 хоста
- -v /root/wordpress/html:/var/www/html — том с файлами веб-сайта
- –link wordpressdb:mysql — простое сетевое связывание контейнеров (устаревший метод, в простых сценариях работает)
Проверим, что контейнер отвечает (на хосте):
curl -I 192.168.43.99:8081
Вы увидите, что в контейнере запущен Apache и PHP, и есть редирект на установку WordPress.
Совет: вместо –link рекомендуется использовать пользовательскую сеть Docker: docker network create mynet && docker run –network mynet … — тогда контейнеры общаются по именам.
Шаг 4 - Установка и настройка Nginx на хосте как обратного прокси
Установим Nginx на хосте:
apt-get install nginxСоздаём виртуальный хост в /etc/nginx/sites-available/:
cd /etc/nginx/sites-available/
vim wordpressВставьте конфигурацию (замените server_name на ваш домен):
server {
listen 80;
server_name wordpress-docker.co www.wordpress-docker.co;
location / {
proxy_pass http://localhost:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}Активируем сайт и удалим дефолтную конфигурацию:
ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-available/default
rm -f /etc/nginx/sites-enabled/defaultПерезапустим Nginx:
systemctl restart nginxПолезно: проверьте конфигурацию перед перезапуском:
nginx -tЕсли вы используете брандмауэр, откройте порт 80 (и 443 для HTTPS).
Шаг 5 - Установка WordPress через браузер
Откройте в браузере указанный домен (например, www.wordpress-docker.co). Вы будете перенаправлены на страницу установки WordPress. Введите название сайта, имя администратора и пароль, затем нажмите “Установить WordPress”.

Нажмите «Войти в WordPress» и используйте созданные учётные данные. Вы попадёте в админ-панель.

Пример домашней страницы:

Установка завершена.
Критерии приёмки
- Контейнеры wordpressdb и wpcontainer запущены и в состоянии “Up”.
- WordPress успешно подключается к базе данных и страница установки/панели доступна по домену.
- Данные WordPress сохраняются в /root/wordpress/html, данные MariaDB — в /root/wordpress/database.
- Nginx на хосте корректно проксирует запросы в контейнер.
Чек-листы по ролям
Чек-лист для DevOps:
- Установлен Docker и проверена версия
- Контейнер MariaDB настроен с томом на хосте
- Контейнер WordPress запущен и доступен на внутреннем порту
- Nginx настроен и проверен nginx -t
- Бекапы данных и процедуры отката задокументированы
Чек-лист для разработчика:
- Файлы темы доступны в /root/wordpress/html/wp-content/themes
- Можно подключиться по FTP/SFTP или через том для разработки
- Отрабатывают перезапуски контейнера без потери данных
Чек-лист для администратора сайта:
- Админ-панель WordPress доступна
- Создана учётная запись администратора
- Настроены базовые плагины безопасности и резервного копирования
Безопасность и резервное копирование (рекомендации)
- Не храните пароли в явном виде в командах — используйте Docker secrets или переменные окружения из файлов с ограниченным доступом.
- Для продакшена используйте отдельную сеть Docker и управление доступом к контейнерам.
- Настройте автоматические бекапы базы данных (crontab + mysqldump в хостовой папке или использование тома + инструментов резервного копирования).
- Используйте HTTPS (Let’s Encrypt) на Nginx и перенаправляйте весь трафик на 443.
Пример быстрых шагов для HTTPS (сертификат Let’s Encrypt):
- Установите certbot на хосте
- Получите сертификат: sudo certbot –nginx -d wordpress-docker.co -d www.wordpress-docker.co
- Автоматизируйте обновление сертификатов (cron/ systemd timer)
Отладка и распространённые ошибки
Проблема: WordPress не может подключиться к базе
- Проверьте переменные окружения в контейнере WordPress
- Убедитесь, что mysql-пользователь и пароль существуют
- Если использовалось –link, проверьте, что имя контейнера совпадает
- Попробуйте подключиться из контейнера WordPress к базе: docker exec -it wpcontainer bash && apt-get update && apt-get install -y mariadb-client && mysql -h wordpressdb -u wpuser -p
Проблема: Nginx даёт 502 Bad Gateway
- Убедитесь, что контейнер слушает на 8081 и localhost:8081 отвечает
- Проверьте логи Nginx: journalctl -u nginx или /var/log/nginx/error.log
Проблема: потеря данных при пересоздании контейнера
- Всегда используйте тома (-v) для данных MariaDB и для /var/www/html
Проблема: PHP версия слишком старая
- В образе wordpress:latest может быть старый PHP; при необходимости используйте другой образ или создайте собственный Dockerfile с нужной версией PHP/Apache/Nginx
Мини-методология развёртывания
- Подготовка окружения: обновление пакетов и установка Docker
- Настройка томов и прав доступа
- Запуск MariaDB-контейнера и проверка доступа
- Запуск WordPress-контейнера и проверка локально
- Настройка reverse proxy (Nginx на хосте) и HTTPS
- Тестирование и документация
Модель принятия решения: Nginx на хосте или в контейнере?
Mermaid диаграмма выбора:
flowchart TD
A[Нужно ли подключать Nginx к внешним сервисам хоста?] -->|Да| B[Nginx на хосте]
A -->|Нет| C[Nginx в контейнере]
B --> D[Простой reverse proxy, SSL на хосте]
C --> E[Оркестрация: Docker Compose / Kubernetes]Пояснение: если Nginx должен обслуживать несколько приложений на хосте, удобнее держать его на хосте. Для изолированного контейнеризированного стека лучше использовать контейнерный Nginx.
Советы по масштабированию и миграции
- Для нескольких экземпляров WordPress используйте внешний балансировщик (или Nginx, HAProxy) и общую внешнюю базу данных (MariaDB Galera / облачная БД).
- Данные пользователей и медиафайлы храните в общем хранилище (NFS, S3 + plugin для WordPress).
- Для CI/CD используйте Docker Registry и docker-compose/kubernetes манифесты.
Тесты и приёмка (Критерии)
- HTTP GET / должен возвращать код 200 для главной страницы после завершения установки
- Авторизация в /wp-admin должна работать с созданной учётной записью
- Бекап базы + восстановление должны вернуть корректный сайт на тестовом экземпляре
Краткий словарь терминов (1‑линия)
- Контейнер — изолированный процесс с зависимостями приложения.
- Том (Volume) — постоянное хранилище данных для контейнера.
- Reverse proxy — сервер, принимающий запросы и перенаправляющий их на внутренние сервисы.
Часто задаваемые вопросы
Q: Можно ли запускать Nginx внутри контейнера вместо хоста?
A: Да — это распространённый подход. Для простоты интеграции с другими сервисами часто предпочитают Nginx на хосте; для полной контейнеризации и масштабирования лучше поместить его в контейнер и управлять через docker-compose/kubernetes.
Q: Как правильно бекапить MariaDB в контейнере?
A: Делайте регулярные дампы (mysqldump), сохраняйте их на хосте или в объектном хранилище. Также можно бэкапить томы файловой системы.
Ссылки и источники
- https://hub.docker.com/_/wordpress/
- https://hub.docker.com/_/mariadb/
- https://www.howtoforge.com/tutorial/docker-installation-and-usage-on-ubuntu-15.04/
Итого: описанный подход даёт быстрый путь для локального и тестового развёртывания WordPress в контейнерах. Для продакшена дополните конфигурацию автоматическим резервным копированием, секрет-менеджментом и HTTPS.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента