docker --version
docker compose version
## Configuration du fichier `docker-compose.yml`
Le cœur de notre déploiement repose sur le fichier `docker-compose.yml`. Ce fichier, écrit en YAML, décrit les services que nous souhaitons déployer, ainsi que leurs configurations respectives.
Voici un exemple complet de fichier `docker-compose.yml` pour déployer MySQL et phpMyAdmin :
version: '3.8'
services:
db:
image: mysql:8.0
container_name: mysql-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: ma_base_de_donnees
MYSQL_USER: user
MYSQL_PASSWORD: mon_mot_de_passe
volumes:
- ./mysql/db:/var/lib/mysql
networks:
- app_network
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
restart: unless-stopped
environment:
PMA_HOST: db
PMA_PORT: 3306
ports:
- "5081:80"
networks:
- app_network
networks:
app_network:
driver: bridge
### Explication des services
Analysons ensemble les services définis dans notre fichier `docker-compose.yml` :
- **Service `db`** : Utilise l'image `mysql:8.0`. Il configure une base de données MySQL avec un mot de passe root, crée une base de données par défaut et ajoute un utilisateur avec des privilèges.
- **Service `phpmyadmin`** : Utilise l'image `phpmyadmin/phpmyadmin`. Ce service fournit une interface web pour interagir avec notre base de données MySQL.
La configuration des **réseaux** permet aux conteneurs de communiquer entre eux tout en étant isolés du reste du monde.
## Bonnes pratiques
Lors de l'utilisation de Docker Compose pour déployer des services, il est crucial de suivre certaines bonnes pratiques pour assurer la sécurité et la performance de votre système.
### Utilisation des variables d'environnement
Les mots de passe et autres informations sensibles ne devraient jamais être en dur dans le fichier `docker-compose.yml`. Utilisez plutôt des variables d'environnement pour les injecter au moment du démarrage du conteneur.
export MYSQL_ROOT_PASSWORD=rootpassword
export MYSQL_DATABASE=ma_base_de_donnees
export MYSQL_USER=user
export MYSQL_PASSWORD=mon_mot_de_passe
docker-compose up -d
### Sécurisation des données
Utilisez des volumes pour persister les données MySQL sur le disque de votre VPS. Cela garantit que vos données ne sont pas perdues lors de la recréation ou de la mise à jour des conteneurs.
## Pièges courants
Même avec Docker Compose, certains pièges peuvent survenir si vous n'êtes pas attentif.
### Port de connexion
Assurez-vous que le port que vous mappez pour phpMyAdmin (dans notre cas, 5081) n'est pas utilisé par un autre service. Cela éviterait des conflits de port.
### Mises à jour des images
Ne négligez pas la mise à jour régulière des images Docker pour bénéficier des dernières mises à jour de sécurité et fonctionnalités. Vous pouvez le faire en exécutant :
docker-compose pull
docker-compose up -d
## Cas d'usage réels
Docker Compose est largement utilisé dans les environnements de développement et de production pour simplifier la gestion des services multi-conteneurs. Voici quelques scénarios typiques :
- **Développement local** : Les développeurs peuvent utiliser Docker Compose pour configurer rapidement un environnement de développement local qui reflète l'environnement de production.
- **Tests d'intégration** : Les équipes peuvent déployer des environnements de test isolés pour exécuter des tests d'intégration, assurant ainsi que les modifications n'affectent pas les services en production.
- **Environnements de staging** : Avant la mise en production, un environnement de staging peut être mis en place pour tester les nouvelles fonctionnalités.
## Comparaison avec d'autres outils
Docker Compose n'est pas le seul outil de gestion de conteneurs. Voici une comparaison avec d'autres solutions populaires :
| Outil | Usage principal | Complexité |
|---|---|---|
| Docker Compose | Orchestration de conteneurs multi-services | Modérée |
| Kubernetes | Orchestration à grande échelle | Élevée |
| Swarm | Orchestration native Docker | Modérée |
En suivant ce guide, vous devriez maintenant être bien équipé pour déployer MySQL et phpMyAdmin sur votre VPS avec Docker Compose, prêt à répondre aux besoins de votre application web.Conseil pro : Automatisez vos déploiements avec des scripts pour réduire les erreurs humaines et gagner du temps lors de la mise à jour ou de la réinitialisation de vos environnements.
Configurer des volumes persistants avec Docker Compose
Par défaut, les données MySQL disparaissent quand le conteneur est supprimé. Les volumes Docker permettent de persister les données entre les redémarrages et mises à jour.
version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootsecret
MYSQL_DATABASE: portfolio
MYSQL_USER: portfolio
MYSQL_PASSWORD: secret
volumes:
- mysql_data:/var/lib/mysql # Volume nommé (persistant)
- ./init.sql:/docker-entrypoint-initdb.d/init.sql # Script d'init
ports:
- "3306:3306"
phpmyadmin:
image: phpmyadmin:latest
depends_on:
- mysql
environment:
PMA_HOST: mysql
PMA_USER: portfolio
PMA_PASSWORD: secret
ports:
- "8080:80"
volumes:
mysql_data: # Volume nommé géré par Docker
Commandes essentielles Docker Compose
# Démarrer tous les services en arrière-plan
docker compose up -d
# Voir les logs en temps réel
docker compose logs -f mysql
# Arrêter sans supprimer les volumes
docker compose stop
# Supprimer les conteneurs ET les volumes (attention : données perdues)
docker compose down -v
# Redémarrer uniquement un service
docker compose restart mysql
# Exécuter une commande dans un conteneur
docker compose exec mysql mysql -u portfolio -p
Conseil pro : En production, ne mappez jamais phpMyAdmin sur un port public (80/443). Limitez l'accès via un tunnel SSH :
ssh -L 8080:localhost:8080 ubuntu@serveur, puis accédez àhttp://localhost:8080depuis votre machine locale.
Sécuriser phpMyAdmin en production
| Mesure | Description | Priorité |
|---|---|---|
| Accès SSH tunnel | Exposer uniquement en local via SSH | 🔴 Critique |
| Authentification forte | Mot de passe complexe, 2FA si possible | 🔴 Critique |
| Restriction IP | Nginx : allow uniquement votre IP | 🟡 Recommandé |
| URL personnalisée | Changer /phpmyadmin en URL aléatoire | 🟡 Recommandé |
| Logs d'accès | Surveiller les tentatives de connexion | 🟢 Optionnel |
Optimiser les performances de MySQL dans Docker
MySQL dans Docker utilise une configuration par défaut qui n'est pas optimisée pour la production. Quelques ajustements dans le fichier de configuration permettent d'améliorer significativement les performances.
# Créer un fichier de configuration MySQL personnalisé
# mysql/conf.d/custom.cnf
[mysqld]
innodb_buffer_pool_size = 256M # Augmenter selon la RAM disponible
innodb_log_file_size = 64M
max_connections = 100
query_cache_size = 32M
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1 # Logger les requêtes > 1 seconde
# Monter le fichier dans docker-compose.yml
volumes:
- ./mysql/conf.d:/etc/mysql/conf.d
- mysql_data:/var/lib/mysql
Sauvegarder la base de données automatiquement
#!/bin/bash
# backup-mysql.sh - Sauvegarde automatique quotidienne
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/var/backups/mysql"
mkdir -p $BACKUP_DIR
# Dump via Docker
docker exec portfolio-mysql mysqldump -u portfolio -pPortfolioSecure2026! --single-transaction --routines --triggers portfolio | gzip > $BACKUP_DIR/portfolio_$DATE.sql.gz
# Supprimer les sauvegardes de plus de 7 jours
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "Sauvegarde créée : portfolio_$DATE.sql.gz"
# Ajouter au cron (tous les jours à 3h du matin)
# crontab -e
# 0 3 * * * /home/ubuntu/backup-mysql.sh
Conseil pro : Testez régulièrement la restauration de vos sauvegardes dans un environnement de test. Une sauvegarde non testée est une sauvegarde dont vous ne pouvez pas garantir l'intégrité. La commande de restauration est :
gunzip -c backup.sql.gz | docker exec -i portfolio-mysql mysql -u portfolio -p portfolio