- Home »

Установка WordPress с помощью Docker Compose
Контейнеризация стала неотъемлемой частью современной IT-инфраструктуры, и WordPress — не исключение. Если вы до сих пор мучаетесь с установкой LAMP стека, настройкой виртуальных хостов и разбираетесь с зависимостями, то Docker Compose может стать вашим спасением. В этой статье мы детально разберем, как развернуть WordPress используя Docker Compose, создать изолированную среду для разработки и продакшена, а также автоматизировать весь процесс.
Зачем это нужно? Представьте, что вы можете развернуть полноценный WordPress сайт с базой данных, веб-сервером и всеми зависимостями одной командой. Плюс получить возможность легко масштабировать, делать бэкапы и переносить проект между серверами. Звучит заманчиво? Тогда поехали!
Как это работает под капотом
Docker Compose — это инструмент для определения и управления многоконтейнерными приложениями. В случае с WordPress нам нужно минимум два контейнера:
- WordPress контейнер — содержит PHP, Apache/Nginx и сам WordPress
- MySQL/MariaDB контейнер — база данных
- phpMyAdmin (опционально) — для удобного управления БД
Контейнеры общаются между собой через внутреннюю Docker-сеть, что обеспечивает изоляцию и безопасность. Данные хранятся в Docker volumes, что гарантирует их сохранность при перезапуске контейнеров.
Пошаговая настройка WordPress с Docker Compose
Для начала убедитесь, что у вас установлен Docker и Docker Compose. Если нет — вот быстрая установка для Ubuntu:
# Установка Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
# Установка Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# Проверка установки
docker --version
docker-compose --version
Теперь создаем структуру проекта:
mkdir wordpress-docker && cd wordpress-docker
mkdir -p data/mysql data/wordpress
touch docker-compose.yml .env
Создаем файл окружения .env
:
# Database settings
MYSQL_ROOT_PASSWORD=your_strong_root_password
MYSQL_DATABASE=wordpress
MYSQL_USER=wp_user
MYSQL_PASSWORD=your_wp_password
# WordPress settings
WORDPRESS_DB_HOST=mysql:3306
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_USER=wp_user
WORDPRESS_DB_PASSWORD=your_wp_password
# Domain settings
DOMAIN=localhost
EMAIL=admin@example.com
Базовый docker-compose.yml
:
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: wp_mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
- ./mysql-init:/docker-entrypoint-initdb.d
networks:
- wp_network
wordpress:
depends_on:
- mysql
image: wordpress:latest
container_name: wp_wordpress
restart: unless-stopped
ports:
- "80:80"
- "443:443"
environment:
WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST}
WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME}
WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD}
volumes:
- wordpress_data:/var/www/html
- ./wp-config-php.ini:/usr/local/etc/php/conf.d/wp-config.ini
networks:
- wp_network
phpmyadmin:
depends_on:
- mysql
image: phpmyadmin/phpmyadmin
container_name: wp_phpmyadmin
restart: unless-stopped
ports:
- "8080:80"
environment:
PMA_HOST: mysql
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
networks:
- wp_network
volumes:
mysql_data:
wordpress_data:
networks:
wp_network:
driver: bridge
Запускаем контейнеры:
docker-compose up -d
Проверяем статус:
docker-compose ps
docker-compose logs -f wordpress
Продвинутая конфигурация с SSL и обратным прокси
Для продакшена нужен SSL. Добавим Nginx и Let’s Encrypt:
version: '3.8'
services:
nginx:
image: nginx:alpine
container_name: wp_nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
- wordpress_data:/var/www/html
depends_on:
- wordpress
networks:
- wp_network
certbot:
image: certbot/certbot
container_name: wp_certbot
volumes:
- ./ssl:/etc/letsencrypt
- wordpress_data:/var/www/html
command: certonly --webroot --webroot-path=/var/www/html --email ${EMAIL} --agree-tos --no-eff-email -d ${DOMAIN}
networks:
- wp_network
mysql:
image: mysql:8.0
container_name: wp_mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
networks:
- wp_network
wordpress:
depends_on:
- mysql
image: wordpress:fpm-alpine
container_name: wp_wordpress
restart: unless-stopped
environment:
WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST}
WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME}
WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD}
volumes:
- wordpress_data:/var/www/html
- ./php.ini:/usr/local/etc/php/php.ini
networks:
- wp_network
redis:
image: redis:alpine
container_name: wp_redis
restart: unless-stopped
networks:
- wp_network
volumes:
mysql_data:
wordpress_data:
networks:
wp_network:
driver: bridge
Практические кейсы и рекомендации
Сценарий | Рекомендация | Пример использования |
---|---|---|
Разработка | Используйте bind mounts для живого редактирования кода | ./wp-content:/var/www/html/wp-content |
Тестирование | Добавьте контейнер с тестовыми данными | Отдельный MySQL с фикстурами |
Продакшен | Используйте именованные volumes и внешние сети | external: true в networks |
Высокая нагрузка | Добавьте Redis для кеширования | WordPress Redis Object Cache |
Полезные команды для управления
# Остановка всех контейнеров
docker-compose down
# Остановка с удалением volumes (ОСТОРОЖНО!)
docker-compose down -v
# Просмотр логов
docker-compose logs -f [service_name]
# Выполнение команд в контейнере
docker-compose exec wordpress bash
docker-compose exec mysql mysql -u root -p
# Создание бэкапа базы данных
docker-compose exec mysql mysqldump -u root -p wordpress > backup.sql
# Восстановление из бэкапа
docker-compose exec -T mysql mysql -u root -p wordpress < backup.sql
# Обновление контейнеров
docker-compose pull
docker-compose up -d
# Мониторинг ресурсов
docker stats
Автоматизация и скрипты
Создадим скрипт для автоматического развертывания:
#!/bin/bash
# deploy-wordpress.sh
set -e
echo "🚀 Deploying WordPress with Docker Compose..."
# Проверка зависимостей
if ! command -v docker &> /dev/null; then
echo "❌ Docker not found. Please install Docker first."
exit 1
fi
if ! command -v docker-compose &> /dev/null; then
echo "❌ Docker Compose not found. Please install Docker Compose first."
exit 1
fi
# Создание .env файла если его нет
if [ ! -f .env ]; then
echo "📝 Creating .env file..."
cat > .env << EOF
MYSQL_ROOT_PASSWORD=$(openssl rand -base64 32)
MYSQL_DATABASE=wordpress
MYSQL_USER=wp_user
MYSQL_PASSWORD=$(openssl rand -base64 32)
WORDPRESS_DB_HOST=mysql:3306
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_USER=wp_user
WORDPRESS_DB_PASSWORD=$(openssl rand -base64 32)
DOMAIN=localhost
EMAIL=admin@example.com
EOF
fi
# Запуск контейнеров
echo "🔄 Starting containers..."
docker-compose up -d
# Ожидание готовности
echo "⏳ Waiting for services to be ready..."
sleep 30
# Проверка статуса
echo "📊 Checking service status..."
docker-compose ps
echo "✅ WordPress deployed successfully!"
echo "🌐 WordPress: http://localhost"
echo "🗄️ phpMyAdmin: http://localhost:8080"
echo "📋 Check logs: docker-compose logs -f"
Делаем скрипт исполняемым:
chmod +x deploy-wordpress.sh
./deploy-wordpress.sh
Альтернативные решения
- Podman Compose — аналог Docker Compose для rootless контейнеров
- Kubernetes — для больших проектов с высокими требованиями к масштабируемости
- Docker Swarm — встроенная оркестрация Docker
- Portainer — графический интерфейс для управления контейнерами
Интересные факты и нестандартные применения
Несколько крутых лайфхаков для продвинутых пользователей:
- Multi-site WordPress — можно настроить несколько сайтов в одном контейнере
- WP-CLI в контейнере — автоматизация установки плагинов и тем
- Elasticsearch для поиска — добавляем мощный поисковый движок
- Varnish для кеширования — ускоряем сайт в разы
Пример с WP-CLI:
services:
wp-cli:
image: wordpress:cli
depends_on:
- wordpress
volumes:
- wordpress_data:/var/www/html
command: tail -f /dev/null
networks:
- wp_network
Установка плагинов автоматически:
docker-compose exec wp-cli wp plugin install woocommerce --activate
docker-compose exec wp-cli wp theme install astra --activate
Мониторинг и оптимизация
Добавляем контейнер с мониторингом:
monitoring:
image: prom/prometheus
container_name: wp_monitoring
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
networks:
- wp_network
Для серьезных проектов рекомендую использовать VPS с достаточными ресурсами или даже выделенный сервер для максимальной производительности.
Сравнение с традиционными методами
Критерий | Docker Compose | Традиционная установка |
---|---|---|
Время развертывания | 5-10 минут | 30-60 минут |
Изоляция | Полная | Зависит от настроек |
Масштабируемость | Высокая | Сложная |
Портативность | Отличная | Низкая |
Потребление ресурсов | Немного выше | Оптимальное |
Заключение и рекомендации
Docker Compose для WordPress — это не просто модный инструмент, а практичное решение для современной веб-разработки. Он особенно полезен для:
- Команд разработчиков — единая среда для всех участников проекта
- Девопс-инженеров — легкое развертывание и масштабирование
- Агентств — быстрое создание проектов для клиентов
- Образовательных проектов — изолированная среда для экспериментов
Главные преимущества: скорость развертывания, воспроизводимость, изоляция и возможность автоматизации. Недостатки: немного больше потребления ресурсов и необходимость изучения Docker.
Рекомендую начать с базовой конфигурации для локальной разработки, а затем постепенно добавлять продвинутые возможности вроде SSL, мониторинга и кеширования. Не забывайте про регулярные бэкапы и мониторинг безопасности!
Для официальной документации и дополнительных примеров обратитесь к официальной документации Docker Compose и официальному образу WordPress.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.