Docker + WordPress: Полный гайд разработки и деплоя за 7 шагов
Почему Docker стал стандартом для разработки WordPress
Контейнеризация позволяет изолировать окружение, гарантировать одинаковую конфигурацию на локальном компьютере и продакшн‑сервере. Для WordPress это значит отсутствие конфликтов PHP‑версий, быстрый откат к предыдущим образам и простая масштабируемость.
- Отделение базы данных от веб‑сервера.
- Автономные зависимости (PHP, Nginx/Apache, MySQL).
- Легкая интеграция с CI/CD пайплайнами.
Структура проекта и подготовка docker‑compose.yml
Создайте корневую папку проекта и разместите в ней файлы:
my-wp-project/
├─ docker-compose.yml
├─ .env
├─ wp-content/ # Тема и плагины
└─ php.ini # Настройки PHP Файл docker-compose.yml описывает три сервиса: wordpress, db и phpmyadmin (по желанию). Пример конфигурации:
version: "3.9"
services:
db:
image: mysql:8.0
restart: unless-stopped
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wp_user
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${ROOT_PASSWORD}
volumes:
- db_data:/var/lib/mysql
networks:
- wpnet
wordpress:
image: wordpress:php8.3-fpm
depends_on:
- db
restart: unless-stopped
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wp_user
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
WORDPRESS_DB_NAME: wordpress
volumes:
- ./wp-content:/var/www/html/wp-content
- ./php.ini:/usr/local/etc/php/conf.d/custom.ini
networks:
- wpnet
phpmyadmin:
image: phpmyadmin/phpmyadmin
depends_on:
- db
restart: unless-stopped
ports:
- "8081:80"
environment:
PMA_HOST: db
MYSQL_ROOT_PASSWORD: ${ROOT_PASSWORD}
networks:
- wpnet
volumes:
db_data:
networks:
wpnet:
driver: bridge Переменные окружения хранятся в файле .env (не коммитьте его в репозиторий):
DB_PASSWORD=supersecure123
ROOT_PASSWORD=rootpass123 Настройка PHP и WordPress для разработки
Кастомный php.ini
Для ускорения разработки включите отображение ошибок и уменьшите таймауты:
display_errors = On
error_reporting = E_ALL
max_execution_time = 300
memory_limit = 512M Установка WP‑CLI внутри контейнера
WP‑CLI упрощает создание темы, установку плагинов и миграцию данных. Добавьте в docker-compose.yml секцию command:
wordpress:
...
command: bash -c "docker-php-entrypoint php-fpm & sleep 5 && wp core install --url='http://localhost:8080' --title='My WP' --admin_user='admin' --admin_password='admin' --admin_email='admin@example.com'" После docker compose up -d ваш сайт будет готов к работе.
Локальная разработка: темы и плагины
Папка wp-content смонтирована в контейнер, поэтому любые изменения в коде темы мгновенно видны в браузере. Рекомендуется использовать плагины файлового менеджера для быстрого доступа к файлам из админки.
- Создайте дочернюю тему:
wp theme create mytheme --child-of=twentytwentyfour. - Подключите
webpackилиViteдля сборки assets, указывая путь./wp-content/themes/mytheme. - Тестируйте изменения, проверяя логи контейнера:
docker compose logs -f wordpress.
Оптимизация и подготовка к продакшн
Перед деплоем убедитесь, что в контейнере отключены отладочные параметры, а база данных оптимизирована. См. руководство по оптимизации базы данных WordPress и сокращению TTFB.
- Переключите режим
WP_DEBUGвwp-config.phpнаfalse. - Включите кеширование объектов (Redis) и страниц (FastCGI).
- Соберите минимизированные CSS/JS.
Деплой на сервер: от Docker‑Compose к Docker‑Swarm / Kubernetes
Для продакшн‑окружения часто используют Docker‑Swarm или K8s. Ниже – упрощенный пример деплоя с помощью Docker‑Compose на VPS, где вместо 8080 пробрасываем порт 80 через nginx-proxy:
services:
proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
- wpnet
wordpress:
environment:
VIRTUAL_HOST: mysite.example.com
... После docker compose -f docker-compose.prod.yml up -d ваш сайт будет доступен по домену. Не забудьте настроить SSL через WP Cron и системный cron для автоматических обновлений.
Автоматизация CI/CD с GitHub Actions
Создайте workflow .github/workflows/deploy.yml:
name: Deploy WordPress
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build images
run: |
docker compose -f docker-compose.prod.yml build
- name: Push to registry
run: |
docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_PASS }}
docker push myregistry.com/wordpress:latest
- name: Deploy to server
uses: appleboy/ssh-action@v0.1.10
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
cd /var/www/my-wp
docker compose pull
docker compose up -d
Такой пайплайн гарантирует, что каждый пуш в main автоматически обновит ваш Docker‑контейнер на продакшн‑сервере.
Тестирование и отладка в продакшн‑режиме
Для контроля качества используйте Schema Markup и проверяйте ошибки через wp health check. При необходимости включите WP_DEBUG_LOG в отдельный файл, чтобы не загрязнять вывод пользователям.
Следуя этим шагам, вы получите полностью изолированную и масштабируемую среду для разработки WordPress, а также надёжный процесс деплоя в продакшн.
❓ Часто задаваемые вопросы
Как подключить постоянный том к базе MySQL в Docker?
В docker‑compose.yml укажите volume‑монтирование: `- db_data:/var/lib/mysql`. Docker создаст каталог на хосте и будет сохранять данные между перезапусками.
Можно ли использовать PHP 8.3 в контейнере WordPress?
Да, официальный образ `wordpress:php8.3-fpm` полностью совместим с WordPress 6.5. Проверьте совместимость плагинов в статье о PHP 8.3 и WordPress.
Как ускорить загрузку страниц WordPress в Docker‑контейнере?
Отключите отладочный режим, включите кеширование (Redis, Opcache), а также оптимизируйте базу данных. Подробности – в руководстве по сокращению TTFB.
Что делать, если WP‑Cron не срабатывает в контейнере?
Замените его на системный cron на хосте или используйте `wp cron event run —due-now`. См. практики настройки WP‑Cron в 2026 году.