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 смонтирована в контейнер, поэтому любые изменения в коде темы мгновенно видны в браузере. Рекомендуется использовать плагины файлового менеджера для быстрого доступа к файлам из админки.

  1. Создайте дочернюю тему: wp theme create mytheme --child-of=twentytwentyfour.
  2. Подключите webpack или Vite для сборки assets, указывая путь ./wp-content/themes/mytheme.
  3. Тестируйте изменения, проверяя логи контейнера: 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 году.