PRETIL - Wiki Interne

Docker Compose CLI — cours synthétique

1. À quoi sert Docker Compose ?

Docker Compose permet de définir et de gérer une application composée de plusieurs conteneurs à partir d'un fichier docker-compose.yaml.

Exemple d'architecture :

┌─────────────┐
│   frontend  │
└──────┬──────┘
       │
┌──────▼──────┐
│   backend   │
└──────┬──────┘
       │
┌──────▼──────┐
│ PostgreSQL  │
└─────────────┘

Exemple de docker-compose.yaml :

services:
  frontend:
    image: nginx

  backend:
    image: my-api

  database:
    image: postgres

Puis :

docker compose up

Idée clé : Docker compose orchestre plusieurs conteneurs qui appartiennent à une même application.


2. Le fichier docker-compose

Exemple réaliste :

services:

  app:
    image: nginx:alpine
    ports:
      - "8080:80"

  db:
    image: postgres:16
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: myapp
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

Structure principale :

services:
  service1:
    ...
  service2:
    ...

volumes:
  ...

Chaque entrée sous services représente un conteneur.


3. Démarrer l'application

Premier plan

docker compose up

Compose :

  1. lit docker-compose
  2. crée les réseaux
  3. crée les volumes
  4. crée les conteneurs
  5. démarre les services
  6. affiche les logs

Pour lancer en arrière-plan :

docker compose up -d

-d signifie detached.

C'est généralement la commande utilisée sur un serveur.


4. Arrêter l'application

docker compose down

Cela supprime :

Mais pas les volumes par défaut.

Les données PostgreSQL du volume restent donc présentes.

Supprimer également les volumes

docker compose down -v

⚠️ À utiliser avec précaution : cela peut supprimer les données persistantes.


5. Voir les conteneurs

docker compose ps

Exemple :

NAME             IMAGE          STATUS
myapp-app-1      nginx:alpine   Up
myapp-db-1       postgres:16    Up

Pour voir également les conteneurs arrêtés :

docker compose ps -a

6. Consulter les logs

Tous les services :

docker compose logs

Suivre les logs en temps réel :

docker compose logs -f

Logs d'un service précis :

docker compose logs app
docker compose logs db

Dernières lignes :

docker compose logs --tail=100 app

Très pratique :

docker compose logs -f --tail=100 app

Réflexe debugging : docker compose logs -f <service>.


7. Redémarrer un service

docker compose restart app

Ou tous les services :

docker compose restart

8. Arrêter / démarrer sans supprimer

Arrêter :

docker compose stop

Redémarrer :

docker compose start

Différence importante :

stop
 │
 └── arrête les conteneurs

down
 │
 └── arrête ET supprime les conteneurs/réseaux

Donc :

docker compose stop
docker compose start

conserve les conteneurs.


9. Exécuter une commande dans un conteneur

Une des commandes les plus importantes :

docker compose exec app bash

Tu obtiens un shell dans le conteneur.

Si bash n'existe pas, notamment avec Alpine :

docker compose exec app sh

Exécuter directement une commande :

docker compose exec app ls
docker compose exec db psql -U admin -d myapp

Différence avec docker exec

Avec Docker classique :

docker exec -it mycontainer bash

Avec Compose :

docker compose exec app bash

Compose retrouve automatiquement le bon conteneur à partir du nom du service.


10. Lancer un nouveau conteneur temporaire

Commande très utile :

docker compose run app bash

Contrairement à exec, run crée un nouveau conteneur basé sur le service.

À retenir

docker compose exec app bash

→ entre dans le conteneur existant.

docker compose run app bash

→ crée un conteneur temporaire.


11. Construire les images

Si ton docker-compose contient :

services:
  app:
    build: .

Tu peux construire l'image avec :

docker compose build

Pour un service :

docker compose build app

Forcer une reconstruction :

docker compose build --no-cache

12. Reconstruire et redémarrer

Très courant pendant le développement :

docker compose up -d --build

Cela signifie essentiellement :

build
  ↓
créer les nouvelles images
  ↓
up
  ↓
démarrer les services

C'est souvent la commande à utiliser après modification du Dockerfile.


13. Télécharger les images

docker compose pull

Télécharge les nouvelles versions des images définies dans le Compose.

Par exemple :

docker compose pull
docker compose up -d

14. Voir la configuration réellement interprétée

Très utile pour comprendre les problèmes de YAML, variables, overrides, etc.

docker compose config

Compose affiche la configuration finale.

Tu peux notamment vérifier :


15. Variables d'environnement

On peut écrire :

services:
  app:
    image: myapp:${TAG}

Puis :

TAG=1.2.0 docker compose up -d

Ou utiliser un fichier .env :

TAG=1.2.0
POSTGRES_PASSWORD=secret

Puis :

services:
  app:
    image: myapp:${TAG}

  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}

Et simplement :

docker compose up -d

16. Choisir un fichier Compose

Par défaut :

docker compose up

cherche notamment un fichier Compose dans le répertoire courant.

Tu peux spécifier un fichier :

docker compose -f compose.prod.yaml up -d

Plusieurs fichiers peuvent être combinés :

docker compose \
  -f docker-compose \
  -f docker-compose.prod.yaml \
  up -d

Cela permet par exemple d'avoir :

docker-compose
docker-compose.dev.yaml
docker-compose.prod.yaml

17. Utiliser un projet Compose différent

Compose crée un nom de projet permettant d'isoler les ressources.

Tu peux le définir avec :

docker compose -p monprojet up -d

Par exemple :

docker compose -p dev up -d
docker compose -p prod up -d

Même si les deux utilisent le même docker-composeyaml, leurs ressources sont séparées.


18. Voir les images

docker compose images

19. Voir les processus

docker compose top

Permet de voir les processus exécutés dans les conteneurs.


20. Supprimer les conteneurs orphelins

Si tu as supprimé un service du docker-composeyaml, son ancien conteneur peut rester présent.

docker compose up -d --remove-orphans

21. Les commandes essentielles à mémoriser

Commande Rôle
docker compose up -d Démarrer l'application
docker compose down Arrêter + supprimer les conteneurs
docker compose ps Voir l'état
docker compose logs -f Suivre les logs
docker compose exec <service> sh Entrer dans un conteneur
docker compose restart Redémarrer
docker compose stop Arrêter sans supprimer
docker compose start Redémarrer les conteneurs arrêtés
docker compose build Construire les images
docker compose up -d --build Rebuild + démarrer
docker compose pull Télécharger les nouvelles images
docker compose config Voir la configuration finale
docker compose down -v Supprimer aussi les volumes

22. Le cycle de travail typique

Première installation

git clone ...
cd mon-projet

docker compose up -d

Vérifier :

docker compose ps

Voir les logs :

docker compose logs -f

Modification du Dockerfile

docker compose up -d --build

Problème avec l'application

docker compose ps
docker compose logs -f app

Puis :

docker compose exec app sh

Arrêt temporaire

docker compose stop

Puis :

docker compose start

Reset de l'environnement

docker compose down
docker compose up -d --build

Reset complet, données comprises :

docker compose down -v
docker compose up -d --build

⚠️ -v = attention aux données.


23. docker compose vs docker

Il faut bien comprendre la relation :

Docker
│
├── docker run
├── docker build
├── docker exec
├── docker logs
│
└── Docker Compose
    ├── docker compose up
    ├── docker compose down
    ├── docker compose exec
    └── docker compose logs

Docker CLI manipule principalement des conteneurs/images individuellement.

Docker Compose manipule une application multi-conteneurs décrite comme un ensemble.

Par exemple, sans Compose :

docker run -d --name db postgres
docker run -d --name redis redis
docker run -d --name app myapp

Avec Compose :

docker compose up -d

C'est précisément l'intérêt de Compose.


24. Le modèle mental à retenir

Pense à Compose comme à une application déclarative :

docker-composeyaml
     │
     ▼
docker compose up
     │
     ├── réseau
     ├── volumes
     ├── conteneur app
     ├── conteneur db
     └── conteneur redis

Les commandes principales correspondent à :

up       → créer + démarrer
down     → arrêter + supprimer
stop     → arrêter
start    → démarrer
restart  → redémarrer
build    → construire
pull     → télécharger
logs     → observer
exec     → entrer/exécuter
config   → inspecter

🧠 La règle des 5 commandes

Pour 80 % de l'utilisation quotidienne :

docker compose up -d
docker compose ps
docker compose logs -f
docker compose exec <service> sh
docker compose down

Et pour le développement :

docker compose up -d --build

C'est probablement la commande Compose la plus utile à connaître après up -d.