Authentification à deux facteurs requise

Pour renforcer la sécurité de votre compte, veuillez activer l'authentification à deux facteurs (2FA). Cette fonctionnalité est obligatoire pour protéger vos données.

DevOups
Entreprise
Retour à la documentation

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.

bash
# 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 interne
⚙️

Installation & 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

bash
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/null

Installer Docker Engine + CLI

Inclut Buildx et docker compose v2 (commande intégrée docker compose).

bash
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Post-installation

Ajoute l'utilisateur courant au groupe docker pour exécuter les commandes sans sudo. Reconnectez-vous si besoin.

bash
sudo usermod -aG docker $USER
newgrp docker

Service systemd

Vérifie que le démon écoute (dockerd) et que containerd est opérationnel.

bash
sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl status docker --no-pager
📦

Gestion 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.

bash
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.

bash
docker images
docker image inspect registry.devoups.com/api:1.0.0

Tag & push vers un registre

docker login stocke un token local (~/.docker/config.json). Toujours pousser des tags immuables.

bash
docker login registry.devoups.com
docker tag api:latest registry.devoups.com/api:1.0.1
docker push registry.devoups.com/api:1.0.1

Nettoyage

Supprime les images dangling (sans tag) ou anciennes (>7 jours). Utilisez avec précaution sur les serveurs de build.

bash
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.

bash
docker run -d \
  --name api \
  -p 8080:8080 \
  -e NODE_ENV=production \
  --restart unless-stopped \
  registry.devoups.com/api:1.0.1

Inspecter les logs et ressources

logs -f suit la sortie STDOUT/ERR. stats affiche CPU/RAM en live. top montre les processus internes.

bash
docker logs -f api
docker stats api
docker top api

Cycle de vie

docker rm supprime définitivement le conteneur (utiliser -f pour forcer un stop + delete).

bash
docker stop api
docker start api
docker restart api
docker rm api

Exécuter une commande ponctuelle

Ouvre un shell interactif à l'intérieur du conteneur pour le debugging. Utilisez -u root pour forcer l'utilisateur.

bash
docker exec -it api /bin/bash
💾

Volumes & 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.

bash
docker volume create pgdata

Monter un volume dans un conteneur

La donnée reste disponible même si le conteneur est supprimé.

bash
docker run -d --name postgres \
  -e POSTGRES_PASSWORD=secret \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16-alpine

Cré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.

bash
docker network create --driver bridge devoups-net

Connecter un conteneur existant

Utile pour rattacher dynamiquement un service à un réseau (logs, monitoring, etc.).

bash
docker network connect devoups-net api
🧩

Docker 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.

bash
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.

bash
docker compose up -d
docker compose ps
docker compose logs -f api
docker compose down --remove-orphans

Override par environnement

Fusionne plusieurs fichiers (base + overrides). Idéal pour différencier dev/staging/prod.

bash
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
🚢

CI/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.

bash
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.

bash
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.

bash
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 -f
🩺

Diagnostic & 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).

bash
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.

bash
docker events --since 10m

Analyser 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).

bash
docker system df
docker system prune -a

Debug réseau

Inspect montre les conteneurs attachés et leurs IP. curl teste la connectivité via DNS interne.

bash
docker network inspect devoups-net
docker exec api apk add --no-cache curl
docker exec api curl http://db:5432