Installer Joomla avec Docker Compose (prod) : HTTPS, base de données, volumes
Déployer Joomla en production, ce n’est pas juste lancer un conteneur : il faut gérer HTTPS, une base de données persistante, des volumes pour les fichiers, et une stratégie de sauvegarde réaliste.
Dans ce guide, on part d’un docker-compose.yml simple et on l’amène vers une mise en service propre. Et si vous cherchez une option rapide sans vous coltiner l’exploitation au quotidien, vous pouvez aussi passer par l’application Joomla sur adgents.cloud : déploiement en 1 clic, scaling CPU/RAM et sauvegardes automatiques (jusqu’à 1/h selon l’offre).
Pourquoi Docker Compose pour Joomla en production ?
Docker Compose vous donne un cadre reproductible pour :
- isoler Joomla et la base de données
- persister les données via des volumes
- standardiser la terminaison TLS via un reverse proxy
- préparer une stratégie de sauvegarde + restauration
Si vous avez déjà fait ce type de déploiement pour un CMS, vous retrouverez les mêmes principes que dans Installer Drupal avec Docker Compose (prod) (HTTPS, DB, volumes).
Prérequis
- Un serveur Linux (VPS)
- Un nom de domaine pointant sur le serveur (DNS OK)
- Docker + Docker Compose
Pour aller plus vite sur l’opérationnel, vous pouvez comparer avec adgents.cloud (hébergement d’applications) : start/stop, facturation à l’heure, backups automatiques, rétention longue.
1) Arborescence recommandée
Créez un dossier de projet clair :
mkdir -p joomla-prod && cd joomla-prod
Dans ce guide on s’appuie sur des volumes Docker (souvent plus simple à maintenir qu’un bind-mount en production).
2) Exemple docker-compose.yml (Joomla + MySQL/MariaDB + volumes)
L’image officielle Joomla accepte des variables d’environnement pour se connecter à la base (et peut même pré-configurer l’admin).
Créez docker-compose.yml :
services:
db:
image: mysql:8.0
restart: unless-stopped
environment:
MYSQL_DATABASE: joomla_db
MYSQL_USER: joomla
MYSQL_PASSWORD: change-me
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db_data:/var/lib/mysql
joomla:
image: joomla:latest
restart: unless-stopped
depends_on:
- db
environment:
JOOMLA_DB_HOST: db
JOOMLA_DB_USER: joomla
JOOMLA_DB_PASSWORD: change-me
JOOMLA_DB_NAME: joomla_db
JOOMLA_SITE_NAME: "Mon site Joomla"
JOOMLA_ADMIN_USER: "Administrateur"
JOOMLA_ADMIN_USERNAME: admin
JOOMLA_ADMIN_PASSWORD: "change-me-too"
JOOMLA_ADMIN_EMAIL: [email protected]
volumes:
- joomla_data:/var/www/html
# À garder pour un test local uniquement (en prod, on passe par HTTPS via reverse proxy)
ports:
- "8080:80"
volumes:
db_data: {}
joomla_data: {}
Lancez :
docker compose up -d
Puis vérifiez que Joomla répond :
http://IP_SERVEUR:8080
Ensuite, passez à la mise en production propre (HTTPS + domaine).
3) HTTPS en production : ne pas exposer Joomla directement
En production, le pattern le plus robuste est :
- exposer uniquement le reverse proxy en 80/443
- garder Joomla en interne sur le réseau Docker
Option A — Traefik (Let’s Encrypt automatique)
Voici un exemple Traefik + Joomla + DB. Remplacez le domaine et l’email :
services:
traefik:
image: traefik:v3.2
command:
- --api.dashboard=false
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- [email protected]
- --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
- --certificatesresolvers.le.acme.httpchallenge=true
- --certificatesresolvers.le.acme.httpchallenge.entrypoint=web
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- traefik_letsencrypt:/letsencrypt
restart: unless-stopped
db:
image: mysql:8.0
restart: unless-stopped
environment:
MYSQL_DATABASE: joomla_db
MYSQL_USER: joomla
MYSQL_PASSWORD: change-me
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db_data:/var/lib/mysql
joomla:
image: joomla:latest
restart: unless-stopped
depends_on:
- db
environment:
JOOMLA_DB_HOST: db
JOOMLA_DB_USER: joomla
JOOMLA_DB_PASSWORD: change-me
JOOMLA_DB_NAME: joomla_db
volumes:
- joomla_data:/var/www/html
labels:
- traefik.enable=true
- traefik.http.routers.joomla.rule=Host(`joomla.exemple.fr`)
- traefik.http.routers.joomla.entrypoints=websecure
- traefik.http.routers.joomla.tls.certresolver=le
- traefik.http.services.joomla.loadbalancer.server.port=80
volumes:
db_data: {}
joomla_data: {}
traefik_letsencrypt: {}
Une fois démarré, Joomla est servi en HTTPS sur votre domaine.
Option B — Nginx Proxy Manager (plus “UI”)
Si vous préférez une configuration via interface web, Nginx Proxy Manager fait très bien le job pour publier Joomla en HTTPS et renouveler les certificats automatiquement. Le principe reste le même : ports 80/443 sur le proxy, Joomla en interne.
4) Volumes : ce qu’il faut persister (sinon, vous perdez vos données)
Deux zones sont critiques :
- La base de données (
/var/lib/mysql) - Les fichiers Joomla (
/var/www/html) : médias, extensions, configuration
Côté sauvegarde, ça implique généralement :
- un dump DB régulier
- une archive des fichiers
- au moins un test de restauration sur un environnement isolé
Si vous voulez éviter de bricoler tout ça, adgents.cloud peut automatiser les sauvegardes et proposer une rétention longue, tout en conservant une logique “application” (start/stop, scaling).
5) Sécurité et performance : les essentiels
Quelques points simples qui évitent beaucoup de problèmes :
- Mises à jour : Joomla + extensions (à cadence régulière)
- Extensions : réduire la surface en gardant le minimum utile
- Cache : activer les caches Joomla et surveiller la DB
- Logs : centraliser (au moins les erreurs) et mettre des alertes basiques
Pour une approche similaire sur un autre CMS, voyez aussi Héberger WordPress avec Docker Compose (prod) (HTTPS, perf, sauvegardes).
Tutoriel vidéo (FR) : Traefik et HTTPS
Pour comprendre le reverse proxy HTTPS (utile quel que soit le CMS) :
Conclusion
Avec Docker Compose, vous pouvez installer Joomla proprement en production : HTTPS via reverse proxy, DB persistante, volumes pour les fichiers, et une stratégie de sauvegarde réaliste.
Et si vous voulez gagner du temps sur l’exploitation, testez directement l’application Joomla sur adgents.cloud.

