Table des matières

Docker compose

Docker compose est à la fois un programme docker compose et à la fois un fichier de configuration (en YAML).
L'idée est d'avoir une recette de cuisine contenue dans un fichier pour créer un service (qui peut faire appel à plusieurs containers : serveur web, bdd, … avec des montages de volumes bien définis). ça évite de faire des commandes CLI à rallonge.

Et ça épouse bien le cycle de vie d'un service sous Docker, qui consiste à séparer les données (volumes) de l'application (image), en faisant des containers qui suivent des cycles de création à partir de la dernière image de l'app dispo sur le web et de destruction du container, tout en conservant les données dans les volumes pour avoir une persistance de celles-ci.

Cela permet la manipulation de nombreux container en une simple commande (il faut suivre la recette du Compose file).

Fichier de configuration

doc officielle

Contient les règles pour décrire le service que l'on souhaite. Il peut être composé de plusieurs containers, de volumes et de networks.

Traditionnellement, le nom du fichier est (par ordre de préférence) : compose.yaml, compose.yml, docker-compose.yaml ou docker-compose.yml. L'emploi d'un de ces noms permet d'omettre le Compose file à utiliser lorsqu'on écrit des CLI comme docker compose up.

Il est conseillé d'avoir un dossier avec un Compose file pour chaque application (ensemble de services visant une fonctionnalité, par exemple un serveur web intranet, une station météo auront chacun leur dossier contenant leur Compose file).

On trouve plusieurs infos sur la structure d'un Compose file. La spécification a évoluée, et certains directives (comme top-level version) sont obsolètes. Je ne vais lister ici que ce qui est à jour à la date de création de cet article (2/08/2025).

Elements de config

(/!\ orthographe et casse)

Top-level :

Exemple

name: nom_de_mon_application

services:
    nom_container_1:
        image: example/webapp
        networks:
            - network_name_1
        secrets:
            - secret_name_1
    
    nom_container_2:
        image: example/backapp
        volumes:
            - volume_name_1:/mount/path/inside/container
        ports:
              - "3000"
              - "3000-3005"
              - "8000:8000"
              - "9090-9091:8080-8081"
              - "127.0.0.1:8001:8001"
              - "6060:6060/udp"    

    nom_container_3:
        image: example/mon-image
        links:
            - nom_container_1
        restart: always 

networks:
    network_name_1:
    
volumes:
    volume_name_1:
        external: true

secrets:
    secret_name_1:
        file: /path/to/file

Docker compose CLI

Les versions

La première version était un executable à part, docker-compose.

Depuis, les fonctionnalités ont été intégrées à l'executable docker (écrit en Go ?), on a donc docker compose.
Etant donné que c'est la version référencée dans les docs officielles de docker, nous utiliserons celle-ci pour la suite).

CLI

# Executer les recettes du fichier dpcker-compose.yml du dossier actuel
# Créer et démarrer les containers
docker compose up --detach
# --detach pour lancer en arrière plan
 
# Stop and remove containers, networks
docker compose down
 
# Pour voir le statut des services définis dans le Compose file
docker compose ps
 
# Start/stop services
docker compose start
docker compose stop
 
# -f : pour spécifier un ou plusieurs Compose files
docker compose -f compose_file_1.yaml -f compose_file_2.yml 
 
# -dry-run : pour voir ce que ça donne sans tout exectuer pour de vrai
docker compose --dry-run up

De nombreuses commande de docker sont aussi présentes pour docker compose, elles s'appliquent aux image/container/volume/network listés dans le Compose file (si j'ai bien compris). On listera : ls, logs, rm, volumes etc.

Définir des variables d'environnement

Parfois, certaines valeurs du docker compose file sont reprises à plusieurs endroits, et il fait sens de regrouper ces valeurs dans un fichier .venv. Ainsi, la modification est centralisée. Il s'agit souvent de variables d'environnement qu'on souhaite passer au container (pas seulement au docker compose).

Fichier .venv

Le fichier .venv est placé dans le même dossier que le fichier de configuration compose.yml.\ Le contenu du fichier est une liste de paramètres, format ini ou properties :

# Des lignes commentaires précédées d'un "#"
#
TAG=15-slim
OPENPROJECT_HTTPS=false
OPENPROJECT_HOST__NAME=localhost
PORT=127.0.0.1:8080
PGDATA="/var/lib/postgresql/data"

L'utilisation dans le compose.yml se fait via des variables ${PORT} dont le nom doit correspondre à celui dans le fichier .venv :

web:
  environment:
    - DEBUG=${DEBUG}

Note: Dans la version docker CLI, on passe les variables avec l'argument -e DEBUG=1

Interpolation

L'interpolation permet de définir des variables et des comportements (par défaut, alternative, etc.) [https://docs.docker.com/compose/how-tos/environment-variables/variable-interpolation/#interpolation-syntax|source]: