Home » Установка WordPress с помощью Docker Compose
Установка WordPress с помощью Docker Compose

Установка 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.


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked