Гид по технологиям

Установка WordPress в Docker с MariaDB и Nginx на хосте

• 7 min read • DevOps • Обновлено 21 Nov 2025
WordPress в Docker с MariaDB и Nginx — установка
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-world

Docker установлен.

Шаг 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 внутри Docker-контейнера.

Контейнер 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

Проверка того, что контейнер WordPress запущен.

Вы увидите, что в контейнере запущен 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 в Docker в браузере.

Нажмите «Войти в 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)

Отладка и распространённые ошибки

  1. Проблема: 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
  2. Проблема: Nginx даёт 502 Bad Gateway

    • Убедитесь, что контейнер слушает на 8081 и localhost:8081 отвечает
    • Проверьте логи Nginx: journalctl -u nginx или /var/log/nginx/error.log
  3. Проблема: потеря данных при пересоздании контейнера

    • Всегда используйте тома (-v) для данных MariaDB и для /var/www/html
  4. Проблема: PHP версия слишком старая

    • В образе wordpress:latest может быть старый PHP; при необходимости используйте другой образ или создайте собственный Dockerfile с нужной версией PHP/Apache/Nginx

Мини-методология развёртывания

  1. Подготовка окружения: обновление пакетов и установка Docker
  2. Настройка томов и прав доступа
  3. Запуск MariaDB-контейнера и проверка доступа
  4. Запуск WordPress-контейнера и проверка локально
  5. Настройка reverse proxy (Nginx на хосте) и HTTPS
  6. Тестирование и документация

Модель принятия решения: 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), сохраняйте их на хосте или в объектном хранилище. Также можно бэкапить томы файловой системы.

Ссылки и источники


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

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро