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 fichierdocker-compose.yml
Nommer le service redis
redis
et le service webappflask_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 instructionsvolumes
etnetworks
au même niveau queservices
avec le contenu nécessaire pour que la création du réseau et du volume soit automatisé.
Observation : Le fichierdocker-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.
Observation : Le tableau de bord Traefik est accessible sur le port 8080, et le reverse proxy est en fonctionnement.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
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