Déploiement d'une application web complète avec Docker Compose

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

Étiquettes: Docker docker-compose MySQL nginx Java

Publié le 30 juillet à 23h16