Aller au contenu principal

TP 4 Docker compose

Objectif

On va passer à une configuration docker compose pour notre webapp persistée.

On va donc convertir la configuration Docker de l'application Flask et Redis en un fichier Docker Compose, ajouter un reverse proxy Traefik pour gérer le trafic, et configurer des certificats SSL/TLS pour le domaine example.com.


Étapes

  • Action : Utiliser le site https://www.composerize.com/ pour convertir vos commandes docker run du TP précédent en un fichier docker-compose.yml

    Nommer le service redis redis et le service webapp flask_app.

    Observation : Le fichier docker-compose.yml est créé et décrit la configuration de l'application Flask et de Redis avec un volume et un réseau partagés mais il n'est pas encore utilisable.


  • Action : Ajouter au docker-compose.yml des instructions volumes et networks au même niveau que services avec le contenu nécessaire pour que la création du réseau et du volume soit automatisé.
    Observation : Le fichier docker-compose.yml est autonome.

  • Action : Créer, utiliser, stopper, détruire et recréer le service pour confirmer la persistance.
    Observation : Les données sont conservées à la destruction.

  • Action : Ajouter un volume et un service Traefik au fichier docker-compose.yml, monter le socket Docker, et exposer le tableau de bord Traefik en utilisant la configuration suivante.

    Attention : il faut changer l'adresse mail par xxx@ votre domaine de virtual lab.
    Il faut également surveiller les ports qui vont être exposés

    Observation : Le tableau de bord Traefik est accessible sur le port 8080, et le reverse proxy est en fonctionnement.
  traefik:
image: traefik:v2.9
command:
- "--api.insecure=true"
- "--providers.docker"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.myresolver.acme.tlschallenge=true"
- "--certificatesresolvers.myresolver.acme.email=<EMAIL_CHANGE_ME>"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- traefik_data:/letsencrypt
networks:
- my_app


  • Action : ajouter les labels suivants pour le service de l'application dans le fichier docker-compose.yml pour obtenir des certificats SSL/TLS et servir le service Flask sur le domaine de votre lab virtuel.

    Attention : il faut changer le domaine par celui de votre lab virtuel.

    Observation : Le service Flask est disponible en HTTPS sur le domaine demandé, avec un certificat SSL/TLS est valide.

    labels:
- "traefik.enable=true"
- "traefik.http.routers.flask_app.rule=Host(`DOMAINE_CHANGE_ME`)"
- "traefik.http.routers.flask_app.entrypoints=websecure"
- "traefik.http.routers.flask_app.tls.certresolver=myresolver"

Avancé

  • Vérifier la configuration SSL/TLS avec des outils comme SSL Labs.
  • Tester le comportement du service en cas de redémarrage de Traefik ou des autres conteneurs.

Solution

Afficher
  • Créer un fichier docker-compose.yml :

    version: '3.8'

    services:
    redis:
    image: redis
    volumes:
    - redis_data:/data
    networks:
    - my_app

    flask_app:
    image: myfirstapp:1.0
    environment:
    - REDIS_HOST=redis
    networks:
    - my_app
    labels:
    - "traefik.enable=true"
    - "traefik.http.routers.flask_app.rule=Host(`example.com`)"
    - "traefik.http.routers.flask_app.entrypoints=websecure"
    - "traefik.http.routers.flask_app.tls.certresolver=myresolver"
    depends_on:
    - redis

    traefik:
    image: traefik:v2.9
    command:
    - "--api.insecure=true"
    - "--providers.docker"
    - "--entrypoints.web.address=:80"
    - "--entrypoints.websecure.address=:443"
    - "--certificatesresolvers.myresolver.acme.tlschallenge=true"
    - "--certificatesresolvers.myresolver.acme.email=support@example.com"
    - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
    ports:
    - "80:80"
    - "443:443"
    - "8080:8080"
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - traefik_data:/letsencrypt
    networks:
    - my_app

    volumes:
    redis_data:
    traefik_data:

    networks:
    my_app:
  • Lancer tous les services avec Docker Compose :

    docker-compose up -d