Запуск WordPress в контейнере Docker — отличное решение для изоляции и удобного управления окружением сайта. Это позволяет быстро разворачивать тестовые и боевые версии, легко переносить сайт между серверами, а также автоматизировать обновления и резервное копирование.
Почему стоит использовать Docker для WordPress
Docker изолирует приложение и все его зависимости в контейнере, что избавляет от проблем с несовместимостью версий PHP, MySQL и других компонентов. Кроме того, контейнеры легко масштабировать и интегрировать в CI/CD процессы.
Использование Docker вместе с Nginx повышает производительность и безопасность: Nginx выступает обратным прокси-сервером, эффективно обрабатывающим запросы, отдающим статику и проксирующим динамические запросы к PHP.
Обзор архитектуры контейнеров
Минимально для работы WordPress в Docker нужны два контейнера:
- WordPress — содержит PHP и саму CMS;
- База данных — обычно MySQL или MariaDB;
- Nginx — обратный прокси, который может запускаться в отдельном контейнере или на хосте.
Для удобства развертывания рекомендуем использовать docker-compose, который позволяет описать всю связку в одном YAML-файле.
Пример docker-compose.yml для WordPress с Nginx
Ниже пример конфигурации с тремя сервисами: wordpress, db и nginx.
version: '3.8'
services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpressuser
MYSQL_PASSWORD: wordpresspass
MYSQL_ROOT_PASSWORD: rootpass
volumes:
- db_data:/var/lib/mysql
wordpress:
image: wordpress:php7.4-fpm
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpressuser
WORDPRESS_DB_PASSWORD: wordpresspass
WORDPRESS_DB_NAME: wordpress
volumes:
- ./wordpress:/var/www/html
depends_on:
- db
nginx:
image: nginx:latest
restart: always
ports:
- 8080:80
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./wordpress:/var/www/html
depends_on:
- wordpress
volumes:
db_data:Конфигурация Nginx для WordPress
Создайте файл ./nginx/conf.d/default.conf со следующим содержимым:
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass wordpress:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}Здесь Nginx отдаёт статику напрямую, а PHP-запросы передаёт в контейнер с WordPress (php-fpm) на порту 9000. Обратите внимание, что в fastcgi_pass используется имя сервиса wordpress, что позволяет Docker DNS разрешать адрес.
Запуск и проверка
В терминале в каталоге с docker-compose.yml выполните:
docker-compose up -dЧерез пару секунд WordPress будет доступен по адресу http://localhost:8080. Перейдите по ссылке и пройдите стандартную установку CMS.
Оптимизация и безопасность
Для продакшена рекомендуем:
- Разделять тома для данных WordPress и базы, делать регулярные бэкапы;
- Использовать отдельный контейнер с Redis или Memcached для кеширования;
- Настроить SSL (например, с помощью OmniVideo можно интегрировать видео с HTTPS);
- Ограничить доступ по IP к базе данных;
- Следить за обновлениями образов и своевременно обновлять их.
Пример кастомной функции для автоматического сброса кэша при обновлении записи
Если на сайте используется плагин кеширования, можно автоматически очищать кеш при обновлении поста через Docker-окружение. Вот пример функции в functions.php темы:
function wpsource_clear_cache_on_post_update($post_id) {
if (defined('WP_CLI') && WP_CLI) return;
// Пример: очистка кеша через вызов shell команды внутри контейнера
exec('docker exec wordpress_container_name wp cache flush');
}
add_action('save_post', 'wpsource_clear_cache_on_post_update');Замените wordpress_container_name на имя вашего контейнера WordPress.
Заключение
Использование Docker с Nginx — мощное и гибкое решение для работы с WordPress. Такой подход упрощает развертывание, повышает стабильность и позволяет быстро масштабировать проект. Следуйте рекомендациям по безопасности, чтобы избежать уязвимостей.