---
title: Déploiement avec Docker
description: Construire les images, les publier puis les exécuter sur le serveur.
---

Une fois l'application dockerisée, le déploiement suit une chaîne simple :

```text
build des images
      ↓
push vers un registry
      ↓
pull sur le serveur
      ↓
docker compose up
```

Une CI/CD, par exemple GitHub Actions, automatise cette chaîne.

## CI : garder la branche saine

Sur chaque push vers la branche principale :

| Job | Contenu |
| --- | --- |
| `backend-checks` | lint, build, tests unitaires et tests e2e |
| `frontend-checks` | lint, build et tests |
| `build-images` | construction des images avec le fichier Compose de production |

Le job de build vérifie que les Dockerfiles continuent de produire des images valides.

## CD : publier une version

Lorsqu'un tag de version est poussé :

| Job | Contenu |
| --- | --- |
| Vérifications | Les mêmes contrôles que la CI |
| `build-and-push` | Build des images et push vers Docker Hub, GHCR ou un autre registry |
| `deploy` | Copie de la configuration puis connexion SSH au serveur |

## Build une fois, run partout

Le serveur ne recompile rien. Il récupère exactement l'image construite et testée par la CI :

```bash
docker compose pull
docker compose up -d --no-build
docker image prune -f
```

`--no-build` garantit que le serveur lance les images récupérées sans reconstruire depuis le code source.

## image et build dans le Compose de production

```yaml
services:
  backend:
    image: registry.example.com/mon-app/backend:${IMAGE_TAG:-latest}
    build:
      context: ./backend
      dockerfile: Dockerfile
```

Dans la CI, `build:` sert à construire puis pousser l'image. En production, le serveur utilise `image:` et `--no-build` pour exécuter le tag déjà publié.

Le serveur n'a besoin ni du code source, ni de Node.js, ni du toolchain de compilation. Il lui faut seulement Docker, le fichier Compose et un accès au registry.

## Ce que Docker apporte

- **Reproductibilité** : l'image testée par la CI est celle qui tourne en production.
- **Rollback simple** : revenir en arrière revient à redéployer le tag précédent.
- **Serveur minimal** : toutes les versions et dépendances vivent dans les images.
- **Immutabilité** : on remplace une image complète au lieu de modifier le serveur en place.

<Callout title="Principe de livraison" type="success">
  Construis une fois et exécute partout. Une image versionnée est l'unité de livraison ; le tag identifie précisément la version déployée.
</Callout>
