Docker Compose
Qu'est ce qu'un fichier Compose ?
Un Docker Compose permet de lancer l'exécution de plusieurs conteneurs nécessaires au fonctionnement d'une application. Il permet aussi de configurer l'environnement nécessaire à cette application (volumes, connexions, variables d'environnement,...)
Un fichier Docker Compose est écrit en YAML et s'appelle par défaut docker-compose.yml
Il contient le nom des images à exécuter ainsi que leur version (par défaut latest)
Installation de Docker Compose
plugin
Docker Compose est un plugin de Docker
du coup, en CLI, docker compose est une option de la commande docker :
$ docker compose --help
Dans d'anciennes versions, avant 2023, Docker Compose était un programme à part et on le lançait avec la commande : docker-compose
Exemple simple
Nous allons maintenant illuster avec un exemple simple de fichier Docker Compose.
Un fichier docker-compose.yml est un fichier avec une structure hiérarchique qui permet de définir ce qui est global à l'environnement de l'application puis ce qui est spécificque à chaque conteneur.
Il y a plusieurs attributs de haut-niveau à définir, dont :
-
services : la liste des conteneurs à créer lors de l'exécution du Docker Compose
-
volumes : la liste des volumes Docker à créer (si ils sont utilisés)
-
networks : le type de driver utilisé (dans le cas où vous souhaitez faire communiquer les conteneurs directement entre eux)
fichier docker-compose.yml basique
Si vous utilisez des montages sur des dossiers locaux ainsi que des réseaux "bridge", seule l'attribut services peut être utilisé (voir exemple ci-dessous)
Note: il existe également d'autres attributs (configs, secrets,...)
Pour chaque conteneur à lancer, donc à définir dans services, on ajoute les attributs suivants :
-
image
-
ports
-
volumes
services:
webserver:
image: nginx
container_name: nginx_webserver
ports:
- "80:80"
volumes:
- /data/CT_logs:/var/log/nginx
- ./www:/usr/share/nginx/html
- ./nginx/conf:/etc/nginx/conf.d
database:
image: postgres:13
container_name: pg_database
ports:
- "5432:5432"
environment:
POSTGRES_DB: softdb
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- ./pgdata:/var/lib/postgresql/data
- ./postgres_datadb/postgresql.conf:/etc/postgresql/postgresql.conf
- /data/CT_logs:/var/log/postgresql
Nous voyons ici que nous avons utilisé des variables d'environnement ${POSTGRES_USER}
et ${POSTGRES_PASSWORD}
, par défaut, docker compose
va chercher ces variables dans un ficher .env
situé au même endroit que là où on exécute la commande compose.
Ici on aura comme contenu du fichier .env
:
POSTGRES_USER=monuser
POSTGRES_PASSWORD=monpwd
Manipulation de Docker Compose
Pour exécuter le fichier docker-compose et créer nos 2 conteneurs :
$ docker compose up -d
L'option -d permet de lancer les conteneurs en taches de fond (tout comme lorsque vous créez un conteneur à partir d'une seule image avec docker run -d
).
Exemple réel : utiliser le Docker Compose d'Airflow
Pour faire tourner Airflow il faut au minimum :
-
les services de base d'Airflow (webserver, scheduler et worker)
-
une base de données (par ex PostgreSQL)
-
un service Celery (pour la gestion des jobs en attente)
-
un service de bus de message (broker)
De plus, il faut un volume de données commun à ces services (voir le contenu du fichier docker-compose.yaml d'Airflow)
Grâce à ce fichier, l'installation s'effectue en 3 étapes simples :
1) Téléchargez le fichier docker-compose.yaml dans la version que vous souhaitez :
curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.10.2/docker-compose.yaml'
2) Créez les dossiers pour DAGs et scripts :
mkdir -p ./dags ./logs ./plugins ./config
2) Initialisez la meta-database Airflow et créez le premier utilisateur par défaut (airflow/airflow)
docker compose up airflow-init
3) puis créez les instances
docker compose up -d
Pour tester, ouvrez votre navigateur et taper l'URL :
http://localhost:8080
Le bonus 2 détaille un peu plus le contenu du fichier docker-compose.yml d'Airflow.
Gestion des mises à jour
Avec Docker et Docker Compose, il est très simple de mettre à jour ces services.
Supposons que vous souhaitiez mettre à jour PostgreSQL en version 14 (rappelez vous qu'on a utilisé l'image en version 13)
Cela se fait en 4 étapes très simples :
1) Stoppez votre conteneur PostgreSQL :
docker compose stop database
2) Modifiez le nom de l'image dans votre fichier docker-compose.yml :
```yml
...
database:
image: postgres:14
...
```
3) [option] Récupérez la nouvelle image :
docker compose pull postgres:14
Vous pouvez omettre cette étape car par défaut lorsqu'on exécute docker compose
le programme va télécharger les images demandées dans le fichier yml et qui ne sont pas disponibles sur l'hôte.
4) Recréez le nouveau conteneur PostgreSQl avec la version 14 :
docker-compose up -d --build postgres
Et c'est reparti !