Docker
Conteneurs reproductibles, images versionnées et workflows DevOps/CI-CD pour livrer rapidement vos services.
Introduction à Docker
Concepts clés : images immuables, conteneurs légers et isolation par namespace/cgroups.
Docker fournit un format d'image standardisé et un runtime léger pour exécuter des applications de façon isolée, reproductible et portable. Une image est un snapshot en lecture seule décrivant tout ce qu'il faut (OS, dépendances, code) pour faire tourner un service.
Cycle de vie : construire une image (docker build), la stocker dans un registre (Docker Hub, GHCR, registry privé) puis lancer des conteneurs (docker run). Chaque conteneur est éphémère par design : persistance via volumes et configuration via variables/env files.
Récapitulatif des objets Docker et de leurs rôles dans une pile applicative.
Vocabulaire essentiel
Garder cette terminologie claire facilite la conception d'environnements reproductibles.
# Image : modèle immuable versionné (tag)
# Container : instance en cours d'exécution d'une image
# Registry : dépôt d'images (public/privé)
# Volume : stockage persistant monté dans un container
# Network : couche d'isolation et de résolution DNS interneInstallation & configuration
Installer Docker Engine, activer le service et configurer l'utilisateur courant.
Docker nécessite un démon systemd (dockerd). Sur Ubuntu, installez depuis le dépôt officiel pour bénéficier des dernières versions. Ajoutez votre utilisateur au groupe docker pour éviter sudo.
Pré-requis APT
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullInstaller Docker Engine + CLI
Inclut Buildx et docker compose v2 (commande intégrée docker compose).
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginPost-installation
Ajoute l'utilisateur courant au groupe docker pour exécuter les commandes sans sudo. Reconnectez-vous si besoin.
sudo usermod -aG docker $USER
newgrp dockerService systemd
Vérifie que le démon écoute (dockerd) et que containerd est opérationnel.
sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl status docker --no-pagerGestion des images
Construire, taguer, pousser et nettoyer les images Docker locales.
Une image est identifiée par son nom (repository) et son tag (version). Par défaut, le tag latest est appliqué, mais il vaut mieux versionner explicitement pour la traçabilité.
Construire depuis Dockerfile
La commande lit le Dockerfile du répertoire courant. Utilisez des tags explicites pour éviter les collisions.
docker build -t registry.devoups.com/api:1.0.0 .Lister / inspecter les images
inspect fournit les métadonnées (layers, variables, exposés). Idéal pour auditer la taille ou la configuration.
docker images
docker image inspect registry.devoups.com/api:1.0.0Tag & push vers un registre
docker login stocke un token local (~/.docker/config.json). Toujours pousser des tags immuables.
docker login registry.devoups.com
docker tag api:latest registry.devoups.com/api:1.0.1
docker push registry.devoups.com/api:1.0.1Nettoyage
Supprime les images dangling (sans tag) ou anciennes (>7 jours). Utilisez avec précaution sur les serveurs de build.
docker image prune -f
docker image prune -a --filter "until=168h"Gestion des conteneurs
Créer, démarrer, arrêter et surveiller les conteneurs applicatifs.
docker run crée et démarre un conteneur en une étape. docker create + docker start séparent la création et l'exécution. Les conteneurs stoppés conservent leur filesystem tant qu'ils ne sont pas supprimés.
Lancer un service détaché
--restart unless-stopped relance automatiquement après reboot. Mappez explicitement les ports.
docker run -d \
--name api \
-p 8080:8080 \
-e NODE_ENV=production \
--restart unless-stopped \
registry.devoups.com/api:1.0.1Inspecter les logs et ressources
logs -f suit la sortie STDOUT/ERR. stats affiche CPU/RAM en live. top montre les processus internes.
docker logs -f api
docker stats api
docker top apiCycle de vie
docker rm supprime définitivement le conteneur (utiliser -f pour forcer un stop + delete).
docker stop api
docker start api
docker restart api
docker rm apiExécuter une commande ponctuelle
Ouvre un shell interactif à l'intérieur du conteneur pour le debugging. Utilisez -u root pour forcer l'utilisateur.
docker exec -it api /bin/bashVolumes & réseaux
Persistance des données et communication sécurisée entre services.
Les volumes Docker stockent les fichiers hors du cycle de vie du conteneur. Les réseaux bridge créent un DNS interne pour que les services se résolvent par leur nom.
Créer un volume nommé
Les volumes résident dans /var/lib/docker/volumes/pgdata/_data. Utilisez docker volume inspect pour obtenir le chemin.
docker volume create pgdataMonter un volume dans un conteneur
La donnée reste disponible même si le conteneur est supprimé.
docker run -d --name postgres \
-e POSTGRES_PASSWORD=secret \
-v pgdata:/var/lib/postgresql/data \
postgres:16-alpineCréer un réseau applicatif
Les conteneurs connectés au même réseau peuvent se joindre via leur nom. Bridge = isolé depuis l'hôte sauf ports exposés.
docker network create --driver bridge devoups-netConnecter un conteneur existant
Utile pour rattacher dynamiquement un service à un réseau (logs, monitoring, etc.).
docker network connect devoups-net apiDocker Compose
Définir des stacks multi-services avec un fichier unique versionné.
docker compose (plugin v2) lit par défaut docker-compose.yml. Il orchestre le build, la création de réseaux/volumes et le démarrage coordonné des services.
Exemple de stack de base
Structure standard : services, networks, volumes. Utilisez des variables d'environnement pour paramétrer les ports.
version: "3.9"
services:
api:
build: ./api
image: registry.devoups.com/api:latest
env_file: .env
ports:
- "8080:8080"
depends_on:
- db
db:
image: postgres:16-alpine
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:Commandes Compose courantes
down supprime les conteneurs, réseaux et volumes anonymes. Ajoutez --volumes pour tout nettoyer.
docker compose up -d
docker compose ps
docker compose logs -f api
docker compose down --remove-orphansOverride par environnement
Fusionne plusieurs fichiers (base + overrides). Idéal pour différencier dev/staging/prod.
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -dCI/CD & registries
Automatiser les builds, pousser vers un registre sécurisé et déployer.
Les pipelines CI doivent produire des images versionnées basées sur Git SHA ou tags semver, les pousser dans un registre privé puis déclencher le déploiement sur les serveurs via docker pull + docker compose.
Build multi-plateforme avec Buildx
buildx build --push permet de publier directement des manifest lists multi-arch.
docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 \
-t registry.devoups.com/api:1.0.0 \
-t registry.devoups.com/api:latest \
--push .CI GitHub Actions (extrait)
Montre comment authentifier le pipeline et pousser une image taguée par SHA.
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
registry: registry.devoups.com
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_TOKEN }}
- run: docker buildx build -t registry.devoups.com/api:${{ github.sha }} --push .Stratégie de déploiement rolling
Actualise uniquement le service `api` sans interrompre les autres conteneurs. --no-deps évite de recréer les dépendances.
docker pull registry.devoups.com/api:1.0.1
docker tag registry.devoups.com/api:1.0.1 api:current
docker compose up -d --no-deps api
docker image prune -fDiagnostic & dépannage
Identifier les problèmes de build, de réseau ou de performance.
Les outils docker system events, docker inspect et les métriques cgroup permettent de comprendre les comportements anormaux. En cas de blocage, capturez un support bundle avant d'arrêter les conteneurs.
Inspecter un conteneur en détail
Affiche toutes les configurations appliquées (volumes, limites CPU/mémoire, réseaux).
docker inspect api | jq '.[0].HostConfig'Événements en temps réel
Utile pour voir les restart loops, les erreurs de pull ou les changements réseau.
docker events --since 10mAnalyser l'utilisation disque
system df liste la taille occupée par images/containers/volumes. prune -a supprime toutes les ressources inutilisées (dangereux en prod).
docker system df
docker system prune -aDebug réseau
Inspect montre les conteneurs attachés et leurs IP. curl teste la connectivité via DNS interne.
docker network inspect devoups-net
docker exec api apk add --no-cache curl
docker exec api curl http://db:5432