WordPress в Docker — быстрый старт и развёртывание
Краткие ссылки
- Getting Started
- Base Images
- Deploying Your Stack
- Next Steps
- Configuration With Docker Secrets
- Adding Your Own Site
- Conclusion

О чём эта инструкция
WordPress — один из самых популярных движков для сайтов. Он написан на PHP, хранит данные в MySQL и обычно запускается за веб-сервером Apache. Эти зависимости означают набор пакетов и конфигураций, которые удобно упаковывать в контейнеры. В этой статье вы найдёте пошаговую инструкцию для быстрого развёртывания WordPress в Docker с рабочими примерами, практиками безопасности и операционными рекомендациями.
Важно: термин “контейнеризация” — упаковка приложения и его зависимостей в контейнеры для предсказуемого запуска. Docker Compose — инструмент для определения и запуска нескольких контейнеров как единой службы.
Getting Started
Для работы вам потребуются Docker и Docker Compose. Compose облегчает описание двух сервисов — веб и база данных — а также томов для постоянного хранения данных (volumes). В типичном случае вам нужны:
- Веб-контейнер: Apache + PHP, который обслуживает WordPress.
- База данных: MySQL (или совместимый MariaDB) в отдельном контейнере.
- Тома Docker для каталога WordPress и каталога данных MySQL.
Тома сохраняют файлы конфигурации, темы, плагины и загруженные медиа, чтобы изменения не терялись при перезапуске контейнера.
Base Images
Официальный образ WordPress на Docker Hub доступен в нескольких тегах: общие, по версии WordPress, по версии PHP, варианты для Apache, FPM и Alpine. Если вы укажете тег
latest— вы получите актуальную версию WordPress с последним официальным PHP. Для предсказуемых развёртываний лучше закреплять версии:
wordpress:5.7— WordPress 5.7 с последним PHP (по умолчанию)wordpress:php7.4— PHP 7.4 с последней версией WordPresswordpress:5.7-php7.4— WordPress 5.7 на PHP 7.4
Полный список тегов и вариантов доступен на Docker Hub. Образы уже содержат базовую конфигурацию; дополнительные настройки php.ini можно добавить, поместив файл в каталог
$PHP_INI_DIR/conf.dвнутри контейнера.
Deploying Your Stack
Создайте новую директорию для сайта и добавьте туда файл
docker-compose.ymlНиже — пример корректного и готового к использованию docker-compose файла для локального и тестового развёртывания. Он минимален, но содержит все необходимые элементы.
version: "3.8"
services:
wordpress:
image: wordpress:5.7-php7.4-apache
restart: unless-stopped
ports:
- "80:80"
environment:
WORDPRESS_DB_HOST: mysql:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: example
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress:/var/www/html
depends_on:
- mysql
mysql:
image: mysql:5.7
restart: unless-stopped
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: example
MYSQL_RANDOM_ROOT_PASSWORD: "1"
volumes:
- mysql:/var/lib/mysql
volumes:
wordpress:
mysql:Пояснения:
- Используйте реальные надёжные пароли на продакшене; примерный пароль в конфиге только для тестов.
depends_onупрощает порядок старта, но не гарантирует доступность БД — проверяйте готовность сервиса при первом подключении.- Монтирование всего
/var/www/htmlв том позволяет использовать автообновления и сохранять все файлы сайта между перезапусками контейнеров.
Запустите стек командой:
docker-compose up -dи откройте http://localhost в браузере. В первый раз создание БД и инициализация могут занять несколько секунд. Если появится ошибка “error establishing database connection”, подождите 10–30 секунд и обновите страницу.

Пройдите стандартный мастер установки WordPress: создайте администратора (обязательнo отличающийся от учётных данных MySQL) и войдите в админ-панель.
Базовые рекомендации по структуре томов и правам
- Тома: используйте Docker volumes для
/var/www/htmlи/var/lib/mysql, чтобы данные сохранялись вне контейнеров. - Права: избегайте запуска PHP под root; официальные образы уже настроены для безопасных UID/GID, но при копировании файлов в том проверьте владельца и права.
- SELinux/AppArmor: в системах с включёнными механизмами безопасности возможны блокировки доступа — проверьте логи сервиса Docker и применяйте метки/правки если необходимо.
Next Steps — что делать после установки
- Установите только те темы и плагины, которые действительно нужны. Меньше — значит безопаснее.
- Настройте бэкапы базы и wp-content (см. раздел бэкап SOP ниже).
- Обновляйте WordPress, плагины и темы регулярно.

Конфигурация с Docker secrets
Для совместной работы в командах или при размещении на хостинге, где несколько человек имеют доступ, используйте Docker secrets вместо явных переменных окружения. Пример секции compose с секретом пароля базы:
services:
wordpress:
image: wordpress:5.7-php7.4-apache
environment:
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/WORDPRESS_DB_PASSWORD
secrets:
- WORDPRESS_DB_PASSWORD
secrets:
WORDPRESS_DB_PASSWORD:
file: ./db_passwordФайл db_password в рабочей директории должен содержать только пароль. В контейнере он будет доступен по пути /run/secrets/WORDPRESS_DB_PASSWORD, а WordPress прочитает значение при старте.
Важно: Docker secrets работают только с Docker Swarm и ограниченно в Compose в разных версиях — проверьте поддержку на вашей платформе.
Добавление собственной темы и плагинов
Вы можете подключать готовые темы и плагины, либо создавать кастомный образ на основе официального. Пример Dockerfile для темы:
FROM wordpress:5.7-php7.4-apache
COPY ./theme/ /var/www/html/wp-content/themes/example-theme/Если хотите активировать тему автоматически, используйте отдельный сервис с WP-CLI:
services:
wpcli:
image: wordpress:cli-2-php7.4
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: example
WORDPRESS_DB_NAME: wordpress
volumes_from:
- wordpress:rwПримеры команд для автоматической установки и активации темы:
docker-compose run --rm wpcli core install --title="My Site" --admin_user=admin --admin_password=changeme --admin_email=me@example.com --url=localhost --allow-root
docker-compose run --rm wpcli theme activate example-theme --allow-rootАвтоматизируйте эти шаги в CI/CD, чтобы при сборке образа или развёртывании окружения сайт автоматически получал нужные настройки.
Резервное копирование и восстановление — стандартная процедура (SOP)
Краткая методика бэкапа:
- Бэкап базы данных: создайте дамп
mysqldumpвнутри контейнера MySQL или снаружи, подключившись к сервису. - Бэкап файлов: сохраните содержимое тома
wordpress(особенноwp-content/uploads,themes,plugins). - Хранение: переносите бэкапы на внешний удалённый сервер или в облако (S3, FTP, rsync).
- Тест восстановления: периодически разворачивайте бэкап в изолированном окружении и проверяйте целостность сайта.
Пример команды для дампа базы (запуск из хоста):
docker-compose exec mysql sh -c 'exec mysqldump --databases wordpress -u"$MYSQL_USER" -p"$MYSQL_PASSWORD"' > backup.sqlИ пример восстановления из дампа:
docker-compose exec -T mysql mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" wordpress < backup.sqlКритерии приёмки бэкапа:
- Дамп базы успешно импортируется в тестовое окружение.
- Файлы wp-content доступны и соответствуют ожидаемой структуре.
- Сайт в тестовом окружении загружается без критических ошибок.
Безопасность и жесткие рекомендации
Important: базовая безопасность — обязательна даже для локальной разработки.
- Изолируйте среду: не используйте общие тома с чувствительными данными.
- Пароли и секреты: храните вне репозитория, используйте Docker secrets или менеджеры секретов.
- Ограничьте доступ к панели администратора по IP или используйте двухфакторную аутентификацию.
- Минимизируйте права файловой системы: файлы должны принадлежать не-root пользователю внутри контейнера.
- Обновления образов: периодически выполняйте
docker-compose pullиdocker-compose up -d --pullдля подтягивания обновлений базового образа.
Дополнительные меры:
- Включите WAF (Web Application Firewall) или прокси-сервис (например, Nginx с модулем ModSecurity) перед WordPress.
- Используйте регулярные сканирования на уязвимости для плагинов.
Производительность и масштабирование — на что обратить внимание
- Для высокой нагрузки разделяйте слои: используйте отдельный сервис PHP-FPM и фронтальный Nginx вместо встроенного Apache.
- Кеширование: добавьте Redis или memcached для объектного кеша; используйте плагины типа WP Super Cache или WP Rocket для статического кеширования.
- Отдельная БД: для больших проектов держите MySQL вне Docker (управляемый сервис) или на отдельном большем хосте.
Траблшутинг — часто встречающиеся проблемы
- “Error establishing a database connection”: база ещё инициализируется — подождите; проверьте переменные окружения и доступность порта 3306.
- Проблемы прав на файлы: проверьте UID/GID и права в томе
/var/www/html. - Плагины не сохраняют настройки: возможно, том не подключён или права не позволяют записывать.
Полезные команды:
docker-compose logs -f wordpress
docker-compose exec wordpress bash
docker-compose exec mysql mysql -u root -pCI/CD и автоматизация
- Собирайте кастомные образы в CI, копируя темы и плагины, и пушьте их в приватный реестр.
- Автоматизируйте запуск WP-CLI команд при развёртывании для установки и миграции.
- Используйте миграции базы в виде SQL-скриптов, которыми управляет pipeline.
Миграция сайта в Docker — советы
- Экспортируйте полную базу и wp-content из старого окружения.
- Разворачивайте дамп и файлы в тестовом Docker-стеке и проверяйте ссылки, пути и права.
- Обратите внимание на абсолютные URL в базе данных (wp_options и содержимое постов) — при смене домена требуется поиск/замена.
Роль‑базированные чек-листы
Разделение ответственности ускоряет развертывание и поддержку.
Developer:
- Подготовить тему/плагин в каталоге исходников.
- Написать Dockerfile для интеграции ассетов.
- Тестировать на локальном docker-compose.
DevOps:
- Настроить тома, секреты и CI/CD.
- Обеспечить мониторинг и оповещения.
- Настроить бэкап и процедуру восстановления.
Site Admin:
- Проверять обновления и совместимость плагинов.
- Проводить регулярные бэкапы и тесты восстановления.
- Управлять учётными записями и доступом.
Быстрая таблица принятия решений (Mermaid)
flowchart TD
A[Нужен ли контейнер?] -->|Да| B{Тест/Продакшн}
B -->|Тест| C[Использовать docker-compose локально]
B -->|Продакшн| D{Требуется масштабирование}
D -->|Нет| E[Compose + managed DB]
D -->|Да| F[Swarm/Kubernetes + external DB]
A -->|Нет| G[Развёртывание на VM/хостинге]Когда метод не подойдёт — ограничения и контрпримеры
- Очень крупные, нагруженные сайты с миллионами посетителей обычно требуют специализированного инфраструктурного стека и управляемых сервисов (распределённая БД, CDN, кластер PHP-FPM), где простая Compose-конфигурация не даст нужной отказоустойчивости.
- Если хостинг не поддерживает Docker или запрещены привилегированные контейнеры, этот подход может оказаться неприменим.
Итог и рекомендации
Подход с Docker и официальным образом WordPress даёт предсказуемое и воспроизводимое окружение, упрощает совместную работу и автоматизацию. Для небольших и средних проектов Compose подходит отлично; для крупной нагрузки стоит рассматривать orchestration (Kubernetes/Swarm) и выделенные управляющие сервисы для БД и кэша.
Коротко:
- Используйте закреплённые теги образов на продакшене.
- Храните секреты отдельно и автоматизируйте бэкапы.
- Следите за правами и обновлениями образов.
Дополнительные ресурсы: официальная страница образа WordPress на Docker Hub и документация Docker Compose.
Краткое резюме
- WordPress в Docker запускается с двумя сервисами: WordPress (Apache/PHP) и MySQL.
- Держите данные в томах для персистентности.
- Для безопасности применяйте Docker secrets и регулярные обновления.
- Автоматизируйте установку с WP-CLI и включайте тесты восстановления в процесс бэкапа.
Важно: периодически проверяйте восстановление бэкапов и обновления, чтобы избежать простоев и потери данных.
Похожие материалы
PHPMyAdmin в Docker — быстрое руководство
Как переслать сообщение на iPhone
Systemd: простая настройка и управление сервисами
duf — анализ диска в Linux
Kompose: перенести Docker Compose в Kubernetes