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
etdata/wordpress
(restic, Rclone, snapshots). - Mises à jour :
docker-compose pull
puisdocker-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è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 |