Lexique · DevOps / Cloud / Data

Docker : définition, Dockerfile et bonnes pratiques

La plateforme qui a popularisé les conteneurs : son histoire, son architecture, l'écriture d'un Dockerfile multi-stage, les commandes essentielles et les bonnes pratiques pour des images légères et sûres.

Par Équipe Blent· Mis à jour le · 15 min de lecture· Niveau débutant

Docker en bref

Type
Plateforme de conteneurisation
Éditeur
Docker Inc. (anciennement dotCloud)
Créateur
Solomon Hykes
Lancement
2013
Langage
Go
Licence
Apache 2.0 pour Docker Engine (projet Moby)
Composants
Engine, CLI, Dockerfile, Docker Hub, Desktop

Définition : Docker

Docker est une plateforme open source qui permet de construire, partager et exécuter des applications sous forme de conteneurs. Le développeur décrit dans un fichier texte, le Dockerfile, les étapes pour assembler une image : système de base, dépendances, code et commande de démarrage. Docker Engine construit cette image en couches réutilisables, la publie dans un registre comme Docker Hub, puis lance des conteneurs isolés à partir d'elle sur n'importe quelle machine équipée de Docker. Lancé en 2013 par la société dotCloud, devenue Docker Inc., l'outil a démocratisé la conteneurisation et reste la référence pour packager une application.

En une phrase : Docker transforme une application et ses dépendances en une image portable, puis l'exécute en conteneur avec quelques commandes.

Dans cette définition

Qu'est-ce que Docker ?

Docker est à la fois un logiciel et une entreprise. Le logiciel permet de construire des images, de les partager et de lancer des conteneurs à partir d'elles ; l'entreprise, Docker Inc., le développe et commercialise des services autour.

Son histoire commence chez dotCloud, une start-up de plateforme d'hébergement (PaaS) fondée par Solomon Hykes. Pour ses propres besoins, l'équipe avait développé un outil interne de gestion de conteneurs Linux. Solomon Hykes le présente publiquement à la PyCon de mars 2013 et le publie en open source dans la foulée. Le succès est tel que la société se renomme Docker Inc. dès la fin de la même année. Docker s'appuyait au départ sur LXC, puis sur sa propre bibliothèque écrite en Go. Docker Inc. a ensuite donné runc à l'Open Container Initiative et containerd à la CNCF : une partie du cœur de Docker est ainsi devenue le socle commun de tout l'écosystème.

Docker n'a pas inventé le conteneur, dont les briques existaient dans le noyau Linux. Il a apporté ce qui manquait pour une adoption massive : un format d'image simple, une CLI accessible, un fichier de description lisible et un registre public pour partager les images. Notre article Docker, à quoi ça sert ? revient sur ces usages.

À retenir : le conteneur est le concept, Docker est l'outil qui l'a rendu populaire. Les images qu'il produit respectent les standards OCI et s'exécutent avec d'autres outils.

Comment fonctionne Docker ?

Le cycle de travail avec Docker tient en cinq étapes, du fichier de description jusqu'au conteneur en production.

  1. Écrire un Dockerfile

    Un fichier texte liste les instructions pour assembler l'image : FROM pour l'image de base, COPY pour le code, RUN pour installer les dépendances, CMD pour la commande de démarrage.

  2. Construire l'image

    La commande docker build exécute les instructions avec BuildKit. Chaque instruction qui modifie le système de fichiers produit une couche, mise en cache pour accélérer les builds suivants.

  3. Taguer et publier

    L'image reçoit un nom et un tag (mon-api:1.0), puis docker push l'envoie vers un registre : Docker Hub, un registre Cloud ou un registre privé.

  4. Lancer un conteneur

    docker run tire l'image si besoin et demande au démon de créer un conteneur. Docker Engine délègue l'exécution à containerd, qui s'appuie sur runc pour isoler le processus.

  5. Exploiter et nettoyer

    docker logs, docker exec et docker stats servent au diagnostic ; docker stop et docker rm arrêtent et suppriment le conteneur, sans toucher à l'image.

L'architecture de Docker

Docker suit une architecture client-serveur. Quand vous tapez une commande, plusieurs composants interviennent.

  • La CLI (docker) est le client. Elle traduit chaque commande en appel à l'API REST du démon, en local par un socket Unix ou à distance.
  • Docker Engine (dockerd) est le démon. Il gère les images, les réseaux, les volumes et orchestre la construction des images avec BuildKit.
  • containerd prend le relais pour le cycle de vie des conteneurs et le stockage des images.
  • runc crée enfin le processus isolé, avec ses namespaces et ses cgroups.

Les couches d'image

Une image n'est pas un bloc monolithique. Chaque instruction du Dockerfile qui modifie le système de fichiers (RUN, COPY, ADD) produit une couche en lecture seule, identifiée par son empreinte. Les couches sont superposées par le pilote de stockage overlay2, et partagées entre images : dix images basées sur python:3.12-slim ne stockent cette base qu'une fois.

Ce découpage alimente le cache de build. Si une instruction et ses fichiers d'entrée n'ont pas changé, Docker réutilise la couche existante. Dès qu'une couche change, toutes les suivantes sont reconstruites : l'ordre des instructions a donc un impact direct sur la vitesse des builds.

Docker Hub et les registres

Docker Hub est le registre public de Docker Inc. Il héberge les images officielles (python, node, postgres, nginx…), maintenues et mises à jour régulièrement, ainsi que les images publiées par les éditeurs et la communauté. En entreprise, on utilise souvent un registre privé, Cloud (Amazon ECR, Google Artifact Registry, Azure Container Registry) ou auto-hébergé comme Harbor.

Exemple : un Dockerfile Python multi-stage

Cette image empaquette une API Python servie par Uvicorn. Le build se fait en deux étapes : la première installe les outils de compilation et les dépendances dans un environnement virtuel, la seconde ne récupère que cet environnement et le code. Les compilateurs ne finissent pas dans l'image livrée.

dockerfile
# syntax=docker/dockerfile:1

# Étape 1 : installation des dépendances
FROM python:3.12-slim AS builder
RUN apt-get update \
    && apt-get install -y --no-install-recommends build-essential \
    && rm -rf /var/lib/apt/lists/*
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH" \
    PIP_NO_CACHE_DIR=1 \
    PIP_DISABLE_PIP_VERSION_CHECK=1
COPY requirements.txt .
RUN pip install -r requirements.txt

# Étape 2 : image d'exécution minimale
FROM python:3.12-slim
ENV PATH="/opt/venv/bin:$PATH" \
    PYTHONUNBUFFERED=1
RUN useradd --create-home --uid 1000 app
WORKDIR /app
COPY --from=builder /opt/venv /opt/venv
COPY --chown=app:app src/ ./src/
USER app
EXPOSE 8000
CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000"]

Le fichier requirements.txt est copié avant le code : tant que les dépendances ne changent pas, la couche pip install reste en cache, même si le code évolue à chaque commit. Les commandes du quotidien :

bash
# Construire l'image et la taguer
docker build -t mon-api:1.0 .

# Lancer un conteneur en arrière-plan, port 8000 publié sur l'hôte
docker run -d --name mon-api -p 8000:8000 --env-file .env mon-api:1.0

# Observer et diagnostiquer
docker ps
docker logs -f mon-api
docker exec -it mon-api sh

# Publier dans un registre privé
docker tag mon-api:1.0 registry.example.com/equipe/mon-api:1.0
docker push registry.example.com/equipe/mon-api:1.0

# Arrêter et supprimer le conteneur (l'image est conservée)
docker stop mon-api && docker rm mon-api

Dès que l'application a besoin d'une base de données ou d'un cache, enchaîner les docker run devient fastidieux : c'est le rôle de Docker Compose.

À quoi sert Docker ?

Docker intervient à chaque étape du cycle de vie d'une application, du poste de développement jusqu'à la production.

  • Environnement de développement

    Lancer une base PostgreSQL, un Redis ou un service tiers en une commande, sans rien installer sur sa machine.

  • Packager une application

    Livrer une API, un front-end ou un worker sous forme d'image versionnée, identique en test et en production.

  • Intégration continue

    Construire, tester et scanner les images dans un pipeline, puis les publier automatiquement dans un registre.

  • Servir un modèle de ML

    Figer un modèle, son code d'inférence et ses bibliothèques dans une image prête à déployer.

  • Moderniser une application

    Conteneuriser une application existante pour la rendre portable avant une migration vers le Cloud.

  • Former et démontrer

    Distribuer un environnement complet de TP ou de démonstration qui fonctionne partout à l'identique.

Quels sont les avantages de Docker ?

Docker doit son succès à sa simplicité : il a rendu accessibles des mécanismes du noyau jusque-là réservés aux spécialistes.

  • Une CLI simple et cohérente, devenue un standard de fait que d'autres outils imitent.
  • Le Dockerfile, format lisible et versionnable pour décrire une image de façon reproductible.
  • Un cache de couches qui accélère les builds et réduit les transferts réseau.
  • Docker Hub, un catalogue d'images officielles prêtes à l'emploi pour la plupart des langages et logiciels.
  • Des images au format OCI, exécutables par Kubernetes, Podman ou les services Cloud de conteneurs.
  • Un écosystème complet : Docker Compose, Docker Desktop, BuildKit, intégrations CI/CD et IDE.

Quelles sont les limites de Docker ?

Docker reste un outil centré sur une machine, avec des choix d'architecture qui ont leurs contreparties.

  • Un démon central qui s'exécute par défaut avec les privilèges root ; le mode rootless existe mais demande une configuration.
  • L'accès au socket Docker équivaut en pratique à un accès root sur l'hôte.
  • Aucune orchestration multi-machines avancée : la haute disponibilité passe par Kubernetes.
  • Docker Desktop est payant pour les entreprises au-delà d'une certaine taille.
  • Des images vite volumineuses et vulnérables si les bonnes pratiques ne sont pas appliquées.

Les bonnes pratiques Docker

Quelques règles font la différence entre une image de 1,5 Go pleine de vulnérabilités et une image de 150 Mo prête pour la production.

  1. Choisir une base minimale et officielle : variantes slim, Alpine ou distroless, et une version précise plutôt que latest. Pour une reproductibilité totale, épinglez l'image par son digest.
  2. Ordonner les instructions pour le cache : ce qui change rarement (dépendances système, fichier de dépendances) en haut, le code en bas.
  3. Utiliser le multi-stage pour séparer outils de build et image d'exécution.
  4. Ajouter un .dockerignore pour exclure .git, les environnements virtuels, les données et les fichiers de secrets du contexte de build.
  5. Ne pas exécuter en root : créez un utilisateur dédié et basculez dessus avec USER.
  6. Ne jamais intégrer de secret dans l'image : utilisez les secrets de build de BuildKit (RUN --mount=type=secret) et injectez les secrets d'exécution par variables d'environnement ou par l'orchestrateur.
  7. Un processus principal par conteneur, écrit en forme exec (CMD ["..."]) pour recevoir correctement les signaux d'arrêt.
  8. Scanner les images avec Docker Scout ou Trivy, et automatiser build, scan et publication dans un pipeline CI/CD.

Docker ou Podman : quelles différences ?

Podman, développé par Red Hat, est l'alternative la plus courante à Docker. Les deux produisent et exécutent des images OCI et partagent l'essentiel de la syntaxe de la CLI.

CritèreDockerPodman
ArchitectureDémon central (dockerd)Sans démon, un processus par conteneur
Privilèges par défautDémon root, mode rootless optionnelRootless par défaut
CLIdockerpodman, largement compatible avec docker
Multi-conteneursDocker Composepodman compose, notion de pods
Lien avec KubernetesImages OCIImages OCI, génération de manifestes Kubernetes
Poste de travailDocker DesktopPodman Desktop
Point fortÉcosystème, documentation, adoptionSécurité, intégration systemd

Dans les deux cas, l'image produite est la même : le choix porte sur le poste de travail et la politique de sécurité, pas sur la production, où Kubernetes prend le relais.

Quand utiliser Docker ?

Docker est le point d'entrée naturel de la conteneurisation. La question est plutôt de savoir quand il ne suffit plus, ou quand une alternative convient mieux.

Pertinent si

Docker est adapté

  • Vous voulez packager une application et ses dépendances.
  • L'équipe a besoin d'environnements de développement identiques.
  • Vos pipelines CI doivent produire des images versionnées.
  • L'application tourne sur une seule machine ou un petit nombre de serveurs.
Moins adapté si

Un autre outil s'impose

  • Vous devez orchestrer des conteneurs sur un cluster : Kubernetes.
  • Un démon root est exclu par votre politique de sécurité : Podman.
  • Les nœuds d'un cluster n'ont besoin que d'un runtime : containerd ou CRI-O.
  • Le besoin se limite à exécuter une fonction ponctuelle : une offre serverless.

Outils de l'écosystème Docker

Docker s'entoure d'outils pour composer, construire, stocker et orchestrer les conteneurs, et se compare à quelques alternatives.

Les concepts à connaître pour comprendre Docker

Docker est un outil ; ces notions expliquent ce qu'il manipule et où il s'insère.

Ressources pour approfondir Docker

Trois articles du blog Blent pour bien démarrer avec Docker et son écosystème.

Questions fréquentes

Questions fréquentes

Docker Engine et la CLI sont open source et gratuits, y compris en production. Docker Desktop est gratuit pour un usage personnel, l'enseignement, les projets open source et les petites entreprises ; les organisations plus grandes doivent souscrire un abonnement payant. Docker Hub propose une offre gratuite avec des limites de téléchargement.

Expertise

À propos de l'auteur

Équipe Blent

Les ingénieurs et mentors Blent conçoivent, automatisent et mettent en production des infrastructures Cloud, et forment chaque année des centaines de professionnels au DevOps.

Sources et méthodologie

  • Documentation officielle Docker : Docker Engine, Dockerfile reference, BuildKit
  • Spécifications de l'Open Container Initiative
  • Solomon Hykes, présentation « The future of Linux Containers », PyCon US 2013
  • Retours d'expérience des projets et formations Blent