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 composeva 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 !