Ce guide détaille la mise en place d'une pile applicative web complète en utilisant Docker Compose. Les configurations fournies sont directement utilisables.
Configuration du conteneur de base de données MySQL
Le fichier docker-compose-mysql.yml définit le service de base de données.
version: "3.8"
services:
database:
image: mysql:5.7
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
# Mot de passe racine pour l'initialisation. Une fois défini, la modification via cette variable ne sera pas prise en compte.
# Pour modifier le mot de passe, utilisez des commandes SQL ou supprimez les données du volume.
MYSQL_ROOT_PASSWORD: SuPeRsEcReT123!
ports:
- "3306:3306"
volumes:
# Persistance des données de la base de données. Remplacez '/chemin/vers/volume/mysql' par le chemin réel sur votre hôte.
- /chemin/vers/volume/mysql:/var/lib/mysql
# Optionnel: Adminer pour la gestion de la base de données via le navigateur.
# adminer:
# image: adminer
# restart: always
# ports:
# - 9999:8080
Configuration du conteneur de l'application
La structure du projet et les fichiers nécessaires pour l'application sont présentés ci-dessous.
Dockerfile pour l'application
Ce fichier Dockerfile spécifie comment construire l'image de l'application.
FROM openjdk:8-jre-slim
WORKDIR /app
ENV LANG C.UTF-8
COPY target/mon-app.jar app.jar
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
VOLUME /data
CMD ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
EXPOSE 8081
Fichier docker-compose-app.yml
Ce fichier orchestre le déploiement du conteneur de l'application.
version: "3.8"
services:
application:
build:
context: ./mon-app
dockerfile: ./Dockerfile
volumes:
# Persistance des données de l'application et des fichiers uploadés.
- /chemin/vers/volume/app:/data
- /chemin/vers/volume/uploads:/data/upload-address
ports:
- "8081:8081"
depends_on:
- database
# Utilisation d'un réseau défini pour la communication inter-conteneurs si nécessaire
# networks:
# - app-network
# networks:
# app-network:
# driver: bridge
Note: Lors du déploiement de plusieurs conteneurs basés sur la même image, l'exposition des ports (ports) peut entraîner des conflits. Utilisez des techniques alternatives comme la gestion du réseau interne de Docker pour la communication.
Configuraton du conteneur Nginx
La configuration de Nginx nécessite des fichiers de configuration et des certificats SSL.
Structure du répertoire Nginx
Assurez-vous que les fichiers de configuration et les certificats sont présents dans le répertoire spécifié.
/chemin/vers/nginx/conf/
├── certs/
│ ├── mon-domaine.com.crt
│ └── mon-domaine.com.key
├── nginx.conf
└── sites-available/
└── mon-app.conf
Fichier docker-compose-nginx.yml
Ce fichier définit le service Nginx et ses configurations.
version: "3.8"
services:
webserver:
image: nginx:latest
volumes:
# Montage des fichiers de configuration Nginx
- /chemin/vers/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- /chemin/vers/nginx/conf/sites-available/mon-app.conf:/etc/nginx/conf.d/default.conf
# Montage des fichiers uploadés
- /chemin/vers/volume/uploads:/usr/share/nginx/html/uploads
# Montage des certificats SSL
- /chemin/vers/nginx/conf/certs/mon-domaine.com.crt:/etc/nginx/ssl/mon-domaine.com.crt
- /chemin/vers/nginx/conf/certs/mon-domaine.com.key:/etc/nginx/ssl/mon-domaine.com.key
ports:
- "80:80"
- "443:443"
depends_on:
- application
# Utilisation du même réseau que l'application pour la communication
# networks:
# - app-network
# networks:
# app-network:
# external: true # Si le réseau est défini ailleurs
Fichier de configuration Nginx (mon-app.conf)
Ce fichier configure Nginx pour agir comme proxy inverse vers l'application.
# Configuration du serveur pour le trafic HTTP
server {
listen 80;
server_name votre-domaine.com; # Remplacez par votre nom de domaine
location / {
proxy_pass http://application:8081; # 'application' est le nom du service dans docker-compose-app.yml
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /uploads/ {
alias /usr/share/nginx/html/uploads/;
}
}
# Configuration du serveur pour le trafic HTTPS
server {
listen 443 ssl;
server_name votre-domaine.com; # Remplacez par votre nom de domaine
ssl_certificate /etc/nginx/ssl/mon-domaine.com.crt;
ssl_certificate_key /etc/nginx/ssl/mon-domaine.com.key;
# Autres configurations SSL recommandées (cipher suites, protocols, etc.)
location / {
proxy_pass http://application:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /uploads/ {
alias /usr/share/nginx/html/uploads/;
}
}
Visualisation des conteneurs en cours d'exécution
La commande docker ps permet de vérifier l'état des conteneurs.
docker ps
L'outil Docker Compose nomme les conteneurs en suivant le format : <dossier_compose>_<nom_service>_<id_instance>.
Scripts de démarrage
Des scripts shell simplifient le processus de déploiement et de redémarrage.
Script de démarrage MySQL
#!/bin/bash
docker-compose -f /chemin/vers/docker-compose-mysql.yml up -d
Script de démarrage de l'application
#!/bin/bash
# Arrêter et reconstruire l'application pour s'assurer d'avoir la dernière version
docker-compose -f /chemin/vers/docker-compose-app.yml down
docker-compose -f /chemin/vers/docker-compose-app.yml --build up -d
# Pour déployer plusieurs instances de l'application :
# docker-compose -f /chemin/vers/docker-compose-app.yml scale application=3 --build up -d
Script de démarrage Nginx
#!/bin/bash
# Arrêter et reconstruire le conteneur Nginx
docker-compose -f /chemin/vers/docker-compose-nginx.yml down
docker-compose -f /chemin/vers/docker-compose-nginx.yml --build up -d
Permissions d'exécution des scripts
Rendez les scripts exécutables.
chmod +x start_mysql.sh
chmod +x start_app.sh
chmod +x start_nginx.sh