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/mysqletdata/wordpress(restic, Rclone, snapshots). - Mises à jour :
docker-compose pullpuisdocker-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_fileen prod, préférez secrets/chiffrement.
8) Dépannage rapide
| Problème | Cause probable | Solution |
|---|---|---|
| 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 |