Guide — Déployer WordPress avec Docker Compose (5 minutes)

Instance WordPress + MySQL fiable et persistante — idéale pour POC, staging ou petit site.

⏱️ 5–10 min 🐳 Docker & Compose 🔐 SSL via reverse proxy (option) 📦 Persistant ✅ Evergreen

1) Pré-requis

  • Docker & Docker Compose installés (Linux/macOS/Windows).
  • Port HTTP libre (ex. 8080) — un domaine si vous activez SSL.
  • Accès shell et droits d’écriture pour créer les dossiers/volumes.

Sur un serveur déjà en prod, exposez WordPress en interne et placez un reverse proxy (Nginx/Traefik) en frontal.

2) Structure du projet

wordpress-docker/
├── docker-compose.yml
├── env/
│   └── .env
└── data/
    ├── mysql/
    └── wordpress/

Les dossiers data/* assurent la persistance ; env/.env isole les secrets.

3) Fichier docker-compose.yml

version: "3.8"

services:
  db:
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - ./data/mysql:/var/lib/mysql
    env_file:
      - env/.env
    restart: unless-stopped

  wordpress:
    image: wordpress:latest
    depends_on:
      - db
    volumes:
      - ./data/wordpress:/var/www/html
    env_file:
      - env/.env
    ports:
      - "8080:80"
    restart: unless-stopped
Ports : changez 8080:80 si occupé (ex. 9090:80). Compat : MySQL 8 avec plugin natif facilite migrations depuis versions antérieures.

4) Variables d’environnement

# env/.env
MYSQL_ROOT_PASSWORD=ChangeMoi-TresFort-!2a
MYSQL_DATABASE=wordpress
MYSQL_USER=wpuser
MYSQL_PASSWORD=MotDePasse-User-!9

WORDPRESS_DB_HOST=db:3306
WORDPRESS_DB_USER=wpuser
WORDPRESS_DB_PASSWORD=MotDePasse-User-!9
WORDPRESS_DB_NAME=wordpress

Ne commitez jamais ce fichier. En prod, privilégiez Docker secrets ou un coffre (ex. Vault).

5) Lancement & vérifications

Démarrer

docker-compose up -d

Sanity checks

docker ps
# → deux conteneurs "db" et "wordpress" doivent être "Up"

Ouvrez http://<IP_ou_domaine>:8080 et suivez l’assistant d’installation WordPress.

6) SSL & Reverse proxy (option)

Exposez WordPress derrière un proxy (Nginx/Traefik). Le proxy termine TLS (Let’s Encrypt) ; WordPress reste en HTTP dans le réseau interne.

Exposer WordPress au proxy

# Remplacez "ports" par "expose" côté wordpress
services:
  wordpress:
    ...
    expose:
      - "80"

Exemple Nginx (vhost)

server {
  listen 80;
  server_name monblog.example.com;

  location / {
    proxy_pass http://wordpress:80;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

Avec Traefik, activez les routers + TLS via labels pour certificats Let’s Encrypt automatiques.

7) Bonnes pratiques

  • Backups : sauvegardez data/mysql et data/wordpress (restic, Rclone, snapshots).
  • Mises à jour : docker-compose pull puis docker-compose up -d.
  • DB non exposée : ne mappez pas de port MySQL vers l’extérieur.
  • Ressources : limitez CPU/RAM si nécessaire ou migrez vers Kubernetes en prod.
  • Secrets : évitez env_file en prod, préférez secrets/chiffrement.

8) Dépannage rapide

ProblèmeCause probableSolution
WordPress n’accède pas à la DB Host/user/mot de passe erronés Vérifier WORDPRESS_DB_* et WORDPRESS_DB_HOST=db:3306
MySQL redémarre en boucle Droits/owner du volume Assigner l’UID correct sur data/mysql ; vérifier l’espace disque
Port 8080 pris Conflit local Changer en "9090:80" (ou libérer le port)
Erreurs PHP/permissions Fichiers corrompus / droits Vérifier owner de data/wordpress ; réparer via wp-cli si besoin