Aller au contenu principal

Orchestrateurs - Compose

Docker compose​

Nous avons pu constater que lancer plusieurs conteneurs liés avec leur mapping réseau et les volumes liés implique des commandes assez lourdes. Cela devient ingérable si l'on a beaucoup d'applications microservice avec des réseaux et des volumes spécifiques.

Pour faciliter tout cela et dans l'optique d'Infrastructure as Code, Docker introduit un outil nommé docker-compose qui permet de décrire de applications multiconteneurs grùce à des fichiers YAML.

Pour bien comprendre qu'il s'agit au départ uniquement de convertir des options de commande Docker en YAML, un site vous permet de convertir une commande docker run en fichier Docker Compose : https://www.composerize.com/

Docker compose était un programme indépendant de Docker proposant un executable docker-compose à part. Depuis quelques temps cet outil a été intégré comme un plugin de la CLI Docker, le Compose Plugin.

On écrit maintenant les commandes compose comme une sous commande de docker: docker compose up


Le "langage" de Docker Compose​

Documentation


Syntaxe YAML​

  • Alignement ! (2 espaces !!)

  • ALIGNEMENT !! (comme en python)

  • ALIGNEMENT !!! (le dĂ©faut du YAML, pas de correcteur syntaxique automatique, c'est bĂȘte mais vous y perdrez forcĂ©ment quelques heures !

  • des listes (tirets)

  • des paires clĂ©: valeur

  • Un peu comme du JSON, avec cette grosse diffĂ©rence que le JSON se fiche de l'alignement et met des accolades et des points-virgules

  • les extensions Docker et YAML dans VSCode vous aident Ă  repĂ©rer des erreurs

  • Les erreurs courantes quotes, et deux-points :

titre: Un exemple: on va avoir des soucis
titre: "Un exemple: on va avoir des soucis"

Exemples de fichier Docker Compose​

Une belle source d'exemples +- officielle: https://github.com/docker/awesome-compose

Sans build : un wordpress sur le port 80​

version: '3.3'
services:
wordpress:
depends_on:
- mysqlpourwordpress
environment:
- "WORDPRESS_DB_HOST=mysqlpourwordpress:3306"
- WORDPRESS_DB_PASSWORD=monwordpress
- WORDPRESS_DB_USER=wordpress
networks:
- wordpress
ports:
- "80:80"
image: wordpress
volumes:
- wordpress_config:/var/www/html/

mysqlpourwordpress:
image: "mysql:5.7"
environment:
- MYSQL_ROOT_PASSWORD=motdepasseroot
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=monwordpress
networks:
- wordpress
volumes:
- wordpress_data:/var/lib/mysql/

networks:
wordpress:

volumes:
wordpress_config:
wordpress_data:

Avec build : un ruby on rails sur le port 80​

Un deuxiĂšme exemple :

version: '3.3'
services:
postgres:
image: postgres:10
environment:
POSTGRES_USER: rails_user
POSTGRES_PASSWORD: rails_password
POSTGRES_DB: rails_db
networks:
- back_end
redis:
image: redis:3.2-alpine
networks:
- back_end
rails:
build: .
depends_on:
- postgres
- redis
environment:
DATABASE_URL: "postgres://rails_user:rails_password@postgres:5432/rails_db"
REDIS_HOST: "redis:6379"
networks:
- front_end
- back_end
volumes:
- .:/app

nginx:
image: nginx:latest
networks:
- front_end
ports:
- 80:80
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro

networks:
front_end:
back_end:

Utiliser Docker compose​

Les commandes​

Les commandes suivantes sont couramment utilisĂ©es lorsque vous travaillez avec Compose. La plupart se passent d'explications et ont des Ă©quivalents Docker directs, mais il vaut la peine d'en ĂȘtre conscient·e :

  • build reconstruit toutes les images créées Ă  partir de Dockerfiles. La commande up ne construira pas une image Ă  moins qu'elle n'existe pas, donc utilisez cette commande Ă  chaque fois que vous avez besoin de mettre Ă  jour une image (quand vous avez Ă©ditĂ© un Dockerfile). On peut aussi faire docker compose up --build

  • up dĂ©marre tous les conteneurs dĂ©finis dans le fichier compose et agrĂšge la sortie des logs. Normalement, vous voudrez utiliser l'argument -d pour exĂ©cuter Compose en arriĂšre-plan.

  • run fait tourner un conteneur pour exĂ©cuter une commande unique. Cela aura aussi pour effet de faire tourner tout conteneur dĂ©crit dans depends_on, Ă  moins que l'argument --no-deps ne soit donnĂ©.

  • stop arrĂȘte les conteneurs sans les enlever.

  • ps fournit des informations sur le statut des conteneurs gĂ©rĂ©s par Compose.

  • logs affiche les logs. De façon gĂ©nĂ©rale la sortie des logs est colorĂ©e et agrĂ©gĂ©e pour les conteneurs gĂ©rĂ©s par Compose.

  • down dĂ©truit tous les conteneurs dĂ©finis dans le fichier Compose, ainsi que les rĂ©seaux. Pour dĂ©truire les volumes et ainsi rĂ©initialisĂ© toutes les donnĂ©es on peut ajouter l'option -v.

  • rm supprime les conteneurs Ă  l'arrĂȘt. On peut aussi utiliser l'argument -v pour supprimer tous les volumes gĂ©rĂ©s par Docker.

Le workflow de dĂ©veloppement Docker Compose​

Compose est un outil d'infrastructure as code declaratif : à chaque fois qu'on lance docker compose up seul les conteneurs ayant changé dans le code sont mis à jour en fonction de la description dans le docker-compose.yml

workflow de base:

  • lire/ecrire le code du docker-compose.yml
  • facultatif: docker compose build si besoin pour reconstruire les images docker ayant changĂ©
  • facultatif: exĂ©cuter les taches de prĂ©paration avec docker compose up <db> pour monter seulement certains conetenrus et docker compose run <conteneur> <commande> pour prĂ©parer par exemple une base de donnĂ©e. voir section usage non synchrone plus bas.
  • docker compose up -d va crĂ©er tous les conteneurs
  • docker compose ps et docker compose logs pour vĂ©rifier que tout se passe bien dans les conteneurs
  • docker compose down tout arrĂȘter quand on a fini de dĂ©velopper avec -v en plus si il faut nettoyer les donnĂ©es.

Usage non synchrone de docker-compose​

On peut également exécuter des tùches une par une dans les conteneurs du docker-compose sans démarrer tous les conteneurs simultanéement. Comme par exemple pour une migration de base de donnée. Exemple : https://docs.funkwhale.audio/installation/docker.html#start-funkwhale-service

On peut également exécuter des tùches une par une dans les conteneurs du docker-compose sans démarrer tous les conteneurs simultanéement. Comme par exemple pour une migration de base de donnée.

Exemple : https://docs.funkwhale.audio/administrator/installation/docker.html#set-up-funkwhale

Visualisation des applications microservice complexes​

Certaines applications microservice peuvent avoir potentiellement des dizaines de petits conteneurs spécialisés.

Le service devient alors difficile Ă  lire dans le compose file.

Il est possible de visualiser l'architecture d'un fichier Docker Compose en utilisant docker-compose-viz:

Cet outil peut ĂȘtre utilisĂ© dans un cadre d'intĂ©gration continue pour produire automatiquement la documentation pour une image en fonction du code.