Docker pour débutants : images, conteneurs, Dockerfile et Compose expliqués pas à pas – illustration Docker

Docker pour débutants : images, conteneurs, Dockerfile et Compose expliqués pas à pas

Thématique
Systèmes, cloud & cybersécurité
Mis à jour
Lecture
13 min
Formation
Apprendre Docker de A à Z : la formation pratique et facile

L'essentiel en 30 secondes

  • Docker est une plateforme qui emballe une application et toutes ses dépendances dans un conteneur léger, qui s'exécute de la même façon sur n'importe quelle machine équipée de Docker.
  • Une image Docker est un modèle en lecture seule ; un conteneur est une instance en cours d'exécution de cette image.
  • Un Dockerfile décrit, instruction par instruction, comment construire une image à partir d'une image de base.
  • Docker Compose décrit dans un seul fichier YAML plusieurs conteneurs, leurs ports, leurs volumes et leurs réseaux, et les démarre avec une seule commande.
  • Les données écrites dans un conteneur disparaissent avec lui : il faut utiliser un volume ou un bind mount pour les conserver.
Sommaire de l'article
  1. Qu’est-ce que Docker et un conteneur Docker ?
  2. À quoi sert Docker ?
  3. Comment installer Docker ?
  4. Utiliser Docker : les étapes de base en ligne de commande
  5. Réseaux, registre et Docker Desktop : aller plus loin
  6. Bonnes pratiques pour des images Docker propres et sûres
  7. Les erreurs fréquentes avec Docker (et comment les éviter)
  8. Docker, Docker Compose, Kubernetes : quel outil pour quel besoin ?
  9. Comment apprendre Docker efficacement ?
  10. En résumé

Docker est une plateforme open source qui permet d’empaqueter une application avec tout ce dont elle a besoin (bibliothèques, runtime, configuration) dans un conteneur isolé, qui s’exécute de manière identique sur un poste de développeur, un serveur de test ou un cloud. C’est la réponse technique au fameux « ça marche sur ma machine ».

Ce guide s’adresse aux développeurs, administrateurs système, étudiants et curieux qui veulent comprendre Docker et s’en servir concrètement. À la fin, vous saurez installer Docker, manipuler images et conteneurs, publier des ports, conserver vos données avec des volumes, écrire un Dockerfile et lancer une application multi-conteneurs avec Docker Compose.

Qu’est-ce que Docker et un conteneur Docker ?

Docker est un ensemble d’outils qui crée, distribue et exécute des conteneurs. Un conteneur Docker est un processus isolé qui embarque son propre système de fichiers, ses dépendances et sa configuration réseau, tout en partageant le noyau du système hôte. Il est donc léger, rapide à démarrer et reproductible d’une machine à l’autre.

Pour bien débuter, retenez quatre notions :

  • Image Docker : un modèle en lecture seule, construit en couches superposées (système de base, dépendances, code). Exemple : nginx:latest ou python:3.12-slim.
  • Conteneur : une instance en cours d’exécution d’une image, avec une fine couche inscriptible par-dessus. Une même image peut lancer des dizaines de conteneurs.
  • Registre : un entrepôt d’images. Docker Hub est le registre public par défaut ; les entreprises utilisent souvent un registre privé.
  • Docker Engine : le moteur qui tourne en arrière-plan (le démon dockerd) et que vous pilotez avec la commande docker.

Conteneurs vs machines virtuelles

La comparaison avec la machine virtuelle est la meilleure façon de comprendre ce qu’apporte Docker.

CritèreMachine virtuelleConteneur Docker
Ce qui est virtualiséLe matériel completLe système d’exploitation (isolation de processus)
NoyauUn noyau par VMNoyau de l’hôte partagé
Taille typiquePlusieurs gigaoctetsDe quelques mégaoctets à quelques centaines
DémarrageDe l’ordre de la minuteDe l’ordre de la seconde
IsolationTrès forteForte, mais dépend du noyau partagé
Cas d’usageFaire tourner un autre OS, isoler fortementDéployer des applications et des services

Les deux ne s’opposent pas : en production, les conteneurs tournent très souvent… dans des machines virtuelles chez un fournisseur cloud. Si vous découvrez justement le cloud, notre guide pour apprendre AWS montre où Docker s’insère dans ces architectures.

À quoi sert Docker ?

Docker s’est imposé parce qu’il résout des problèmes très concrets du quotidien des équipes techniques :

  • Des environnements identiques : le développeur, le testeur et le serveur de production utilisent exactement la même image.
  • Une installation en une commande : plus besoin d’installer PostgreSQL, Redis ou un serveur web sur votre poste, un docker run suffit.
  • Plusieurs versions côte à côte : Python 3.10 pour un projet, 3.12 pour un autre, sans conflit.
  • Des déploiements rapides et réversibles : on déploie une nouvelle image, et on revient à la précédente si besoin.
  • La base de l’intégration continue : les pipelines CI/CD construisent et testent des images à chaque modification du code.
  • Un point d’entrée vers Kubernetes : les orchestrateurs de conteneurs manipulent des images Docker (au format standard OCI).

Comment installer Docker ?

L’installation dépend de votre système. Dans tous les cas, suivez la documentation officielle sur docs.docker.com si une étape diffère de ce qui suit.

Sous Windows et macOS : Docker Desktop

Téléchargez Docker Desktop depuis le site officiel de Docker et lancez l’installeur. Sous Windows, activez l’option WSL 2 proposée pendant l’installation : Docker Desktop s’appuie sur le sous-système Windows pour Linux pour exécuter les conteneurs. Redémarrez si demandé, puis ouvrez Docker Desktop une première fois pour démarrer le moteur.

Sous Ubuntu : Docker Engine

Sous Linux, on installe directement Docker Engine depuis le dépôt officiel de Docker (plus à jour que le paquet docker.io des dépôts Ubuntu) :

sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Pour utiliser docker sans sudo, ajoutez votre utilisateur au groupe docker, puis déconnectez-vous et reconnectez-vous :

sudo usermod -aG docker $USER

Attention : appartenir au groupe docker revient à disposer de droits équivalents à root sur la machine. Réservez-le aux comptes de confiance. Si le terminal Linux vous est encore peu familier, commencez par notre sélection de commandes Linux essentielles.

Vérifier l’installation

docker version
docker run hello-world

Si le message de bienvenue s’affiche, Docker a téléchargé l’image hello-world depuis Docker Hub, créé un conteneur et l’a exécuté : tout fonctionne.

Utiliser Docker : les étapes de base en ligne de commande

Voici la progression que nous suivons en formation, de la première image jusqu’à une application complète.

Étape 1 — Télécharger et lister des images Docker

Une image se télécharge avec docker pull. Le tag (après les deux-points) précise la version ; sans tag, Docker utilise latest.

docker pull nginx:1.27
docker pull python:3.12-slim
docker images
docker image rm python:3.12-slim

Notre conseil : en dehors des tests, fixez toujours un tag précis. latest change au fil des publications et peut casser un projet du jour au lendemain.

Étape 2 — Lancer un conteneur en mode attaché, détaché ou interactif

# Mode attaché : la sortie s'affiche dans le terminal, Ctrl+C arrête le conteneur
docker run nginx:1.27

# Mode détaché (-d) : le conteneur tourne en arrière-plan
docker run -d --name web nginx:1.27

# Mode interactif (-it) : ouvre un shell dans un conteneur Ubuntu, supprimé à la sortie (--rm)
docker run -it --rm ubuntu:24.04 bash

L’option --name donne un nom lisible au conteneur ; sans elle, Docker en génère un au hasard. L’option --rm supprime automatiquement le conteneur à son arrêt, pratique pour les essais.

Étape 3 — Gérer le cycle de vie des conteneurs

Ces commandes couvrent l’essentiel du quotidien :

docker ps                  # conteneurs en cours d'exécution
docker ps -a               # tous les conteneurs, y compris arrêtés
docker logs -f web         # suivre les logs du conteneur "web"
docker exec -it web sh     # ouvrir un shell dans un conteneur qui tourne
docker stop web            # arrêter proprement
docker start web           # redémarrer
docker rm web              # supprimer (le conteneur doit être arrêté)
docker inspect web         # tout le détail technique au format JSON

Distinguez bien docker run (crée et démarre un nouveau conteneur à partir d’une image) et docker start (redémarre un conteneur existant). Relancer docker run à chaque fois crée des conteneurs en double, une erreur classique.

Étape 4 — Publier des ports

Un conteneur est isolé du réseau de l’hôte. Pour accéder à un service web, on associe un port de la machine à un port du conteneur avec -p port_hôte:port_conteneur :

docker run -d --name web -p 8080:80 nginx:1.27

Ouvrez http://localhost:8080 dans votre navigateur : la page d’accueil de Nginx s’affiche. Le port 80 du conteneur est accessible via le port 8080 de votre machine.

Étape 5 — Conserver les données avec volumes et bind mounts

Tout ce qui est écrit dans un conteneur disparaît quand on le supprime. Deux solutions permettent de conserver les données :

# Bind mount : un dossier de votre machine est monté dans le conteneur
docker run -d --name site -p 8080:80 -v "$(pwd)/html:/usr/share/nginx/html:ro" nginx:1.27

# Volume nommé : Docker gère lui-même l'emplacement de stockage
docker volume create pgdata
docker run -d --name db -e POSTGRES_PASSWORD=motdepasse -v pgdata:/var/lib/postgresql/data postgres:16
docker volume ls

Le bind mount est idéal en développement : vous modifiez un fichier sur votre poste, le conteneur le voit immédiatement. Le volume nommé est préférable pour les bases de données, car il est indépendant de l’arborescence de l’hôte et plus simple à sauvegarder.

Étape 6 — Écrire un Dockerfile et construire son image

Le Dockerfile est un fichier texte qui décrit comment construire votre propre image. Prenons une petite application Python avec un fichier app.py et un fichier requirements.txt :

# Image de base officielle et légère
FROM python:3.12-slim

# Dossier de travail dans l'image
WORKDIR /app

# On copie d'abord les dépendances pour profiter du cache
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Puis le code de l'application
COPY . .

# Port documenté et commande de démarrage
EXPOSE 5000
CMD ["python", "app.py"]

Construisez puis lancez l’image :

docker build -t mon-app:1.0 .
docker run -d --name app -p 5000:5000 mon-app:1.0

L’ordre des instructions compte : chaque instruction crée une couche, et Docker réutilise les couches inchangées. En copiant requirements.txt avant le reste du code, vous évitez de réinstaller toutes les dépendances à chaque modification d’une ligne de code.

Étape 7 — Orchestrer plusieurs conteneurs avec Docker Compose

Dès qu’une application combine plusieurs services (une API et une base de données, par exemple), les lancer un par un devient pénible. Docker Compose les décrit dans un fichier compose.yaml :

services:
  web:
    build: .
    ports:
      - "5000:5000"
    environment:
      DATABASE_URL: postgresql://app:secret@db:5432/app
    depends_on:
      - db
  db:
    image: postgres:16
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: app
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:

Puis, dans le dossier du projet :

docker compose up -d      # construit si besoin et démarre tous les services
docker compose ps         # état des services
docker compose logs -f    # logs de tous les services
docker compose down       # arrête et supprime les conteneurs (le volume est conservé)

Compose crée automatiquement un réseau commun : le service web joint la base simplement avec le nom d’hôte db. Les mots de passe écrits en clair ci-dessus conviennent pour un environnement local ; en production, utilisez un fichier .env exclu du dépôt Git ou un gestionnaire de secrets.

Réseaux, registre et Docker Desktop : aller plus loin

Comprendre les réseaux sous Docker

Par défaut, les conteneurs lancés avec docker run rejoignent le réseau bridge. Sur ce réseau par défaut, ils ne peuvent pas se joindre par leur nom. Créez un réseau dédié pour bénéficier de la résolution de noms :

docker network create mon-reseau
docker run -d --name db --network mon-reseau -e POSTGRES_PASSWORD=motdepasse postgres:16
docker run -it --rm --network mon-reseau postgres:16 psql -h db -U postgres
docker network ls

Les principaux pilotes à connaître : bridge (réseau isolé sur l’hôte, le cas courant), host (le conteneur utilise directement le réseau de l’hôte, sous Linux) et none (aucun réseau).

Publier une image sur Docker Hub

Pour partager une image, on la renomme avec votre identifiant de registre, puis on la pousse :

docker login
docker tag mon-app:1.0 votre-identifiant/mon-app:1.0
docker push votre-identifiant/mon-app:1.0

N’importe quelle machine autorisée peut ensuite la récupérer avec docker pull votre-identifiant/mon-app:1.0. Ne publiez jamais une image contenant des secrets (clés d’API, fichiers .env) dans un dépôt public.

Docker Desktop : l’interface graphique

Docker Desktop ajoute une interface graphique au-dessus du moteur. Elle est pratique pour visualiser ce que font vos commandes :

  • l’onglet Containers liste les conteneurs, avec boutons démarrer, arrêter, supprimer et accès direct aux logs, au terminal et aux fichiers ;
  • l’onglet Images permet de lancer une image en précisant ports, volumes et variables d’environnement via un formulaire ;
  • l’onglet Volumes affiche le contenu des volumes et l’espace qu’ils occupent ;
  • l’analyse de sécurité des images (Docker Scout) liste les vulnérabilités connues des paquets qu’elles contiennent.

La même analyse est disponible en ligne de commande avec docker scout quickview mon-app:1.0 ou docker scout cves mon-app:1.0, selon votre installation. Notre conseil : apprenez d’abord les commandes, puis servez-vous de Docker Desktop pour inspecter et vérifier. L’inverse vous laisse démuni sur un serveur Linux sans interface.

Bonnes pratiques pour des images Docker propres et sûres

  • Partir d’une image officielle et légère : les variantes -slim ou -alpine réduisent la taille et la surface d’attaque (Alpine utilise musl au lieu de glibc, ce qui peut poser problème avec certaines bibliothèques Python).
  • Ajouter un fichier .dockerignore pour exclure .git, node_modules, les fichiers .env et les dossiers de build du contexte envoyé au moteur.
  • Ne pas exécuter en root : créez un utilisateur dédié dans le Dockerfile et basculez dessus avec l’instruction USER.
  • Regrouper les commandes RUN liées et nettoyer les caches dans la même instruction pour limiter le nombre et le poids des couches.
  • Utiliser des builds multi-étapes (plusieurs FROM dans le même Dockerfile) pour compiler dans une image complète et ne livrer que le résultat dans une image minimale.
  • Faire le ménage régulièrement : docker system df affiche l’espace consommé, docker system prune supprime les conteneurs arrêtés, les réseaux inutilisés et les images orphelines.

La sécurité des conteneurs s’inscrit dans une démarche plus large de protection du système d’information. Pour en poser les bases, consultez notre guide pour apprendre la cybersécurité.

Les erreurs fréquentes avec Docker (et comment les éviter)

En formation, les mêmes blocages reviennent chez presque tous les débutants.

Erreur ou symptômeCause probableSolution
permission denied while trying to connect to the Docker daemon socketL’utilisateur n’est pas dans le groupe dockersudo usermod -aG docker $USER, puis se reconnecter
Cannot connect to the Docker daemonLe moteur n’est pas démarréLancer Docker Desktop, ou sudo systemctl start docker sous Linux
port is already allocatedLe port de l’hôte est déjà utiliséChoisir un autre port hôte (-p 8081:80) ou arrêter l’autre service
Le conteneur s’arrête immédiatementLe processus principal s’est terminé ou a plantéLire docker logs nom, vérifier la commande CMD
Les données ont disparuAucun volume n’était montéMonter un volume nommé sur le dossier de données
Le site n’est pas joignable depuis le navigateurPort non publié ou application qui écoute sur 127.0.0.1 dans le conteneurAjouter -p, faire écouter l’application sur 0.0.0.0
Le disque se remplitImages et conteneurs obsolètes accumulésdocker system df puis docker system prune
The container name "/web" is already in useUn conteneur arrêté porte déjà ce nomdocker rm web ou docker start web

Docker, Docker Compose, Kubernetes : quel outil pour quel besoin ?

Ces outils sont complémentaires et correspondent à des niveaux de complexité différents.

BesoinOutil adapté
Lancer un service isolé (base de données, serveur web) sur son postedocker run
Construire l’image de votre applicationDockerfile + docker build
Faire tourner une application de plusieurs services en local ou sur un serveurDocker Compose
Gérer visuellement conteneurs, images et volumesDocker Desktop
Déployer des dizaines de services sur plusieurs serveurs avec haute disponibilitéKubernetes (ou un service managé du cloud)

Pour la plupart des projets personnels, des environnements de développement et des petits déploiements, Docker et Compose suffisent largement. Kubernetes n’a de sens qu’une fois ces bases parfaitement acquises.

Comment apprendre Docker efficacement ?

Docker s’apprend par la pratique, commande après commande. Voici le parcours que nous recommandons :

  1. Prérequis utiles (quelques heures) : savoir naviguer dans un terminal. Si vous n’avez jamais utilisé Linux, notre guide pour apprendre Linux vous aide à installer une distribution dans une machine virtuelle. Sous Windows, les bases de PowerShell suffisent pour démarrer.
  2. Première session (1 à 2 heures) : installation, docker run, modes attaché et détaché, ports, docker ps, docker logs, docker exec.
  3. Deuxième session (1 à 2 heures) : volumes et bind mounts, premier Dockerfile, construction et publication d’une image.
  4. Troisième session : Docker Compose avec une application et sa base de données, puis les réseaux.
  5. Ensuite : conteneurisez un de vos propres projets. C’est là que les vraies questions apparaissent (variables d’environnement, taille d’image, droits sur les fichiers).

Pour suivre ce parcours avec un formateur, la formation Docker pratique d’EspritAcadémique couvre l’essentiel en 2 h 10, sans prérequis en DevOps. Chaque notion y est d’abord expliquée, puis exécutée sur votre machine. Le programme aborde notamment :

  • la différence entre conteneurs et machines virtuelles, et l’installation sur Windows, Mac et Ubuntu ;
  • les commandes indispensables, les modes détaché et interactif et le rôle des tags ;
  • le mapping de ports, les bind mounts et la gestion des volumes ;
  • le fonctionnement du Docker Engine, les réseaux et la publication sur Docker Hub ;
  • une introduction à Docker Compose pour relier plusieurs conteneurs ;
  • la prise en main de Docker Desktop et l’analyse de sécurité des images.

Vous pouvez consulter le détail du programme de ce cours Docker avant de vous inscrire.

En résumé

Docker emballe une application et ses dépendances dans un conteneur léger et reproductible. Les images sont les modèles, les conteneurs leurs instances, le Dockerfile la recette de construction et Docker Compose le chef d’orchestre des applications à plusieurs services. Maîtrisez d’abord run, ps, logs, exec, les ports et les volumes, puis écrivez vos Dockerfile : en quelques sessions de pratique, vous serez capable de conteneuriser vos propres projets.

Questions fréquentes

Quelle est la différence entre Docker et une machine virtuelle ?

Une machine virtuelle embarque un système d'exploitation complet avec son propre noyau, géré par un hyperviseur. Un conteneur Docker partage le noyau de la machine hôte et n'isole que les processus, le système de fichiers et le réseau de l'application. Résultat : un conteneur démarre en quelques secondes, pèse beaucoup moins lourd et permet d'en faire tourner bien davantage sur le même serveur.

Docker est-il gratuit ?

Docker Engine, le moteur en ligne de commande utilisé sous Linux, est open source et gratuit. Docker Desktop, l'application graphique pour Windows et macOS, est gratuit pour un usage personnel, l'éducation, les projets open source et les petites entreprises, mais soumis à un abonnement payant au-delà de certains seuils. Consultez la page tarifs officielle de Docker pour connaître les conditions en vigueur.

Faut-il connaître Linux pour apprendre Docker ?

Ce n'est pas obligatoire pour démarrer, mais c'est un vrai avantage. La plupart des images Docker reposent sur une distribution Linux, et vous serez amené à ouvrir un shell dans un conteneur, lire des logs ou écrire des commandes RUN dans un Dockerfile. Connaître les commandes de base du terminal (cd, ls, cat, apt) vous fera gagner beaucoup de temps.

Combien de temps faut-il pour apprendre Docker ?

Deux à trois heures de pratique suffisent pour lancer des conteneurs, gérer les ports et les volumes et écrire un premier Dockerfile. Comptez ensuite quelques jours d'utilisation sur vos propres projets pour être à l'aise avec Docker Compose, les réseaux et l'optimisation des images. L'orchestration à grande échelle, avec Kubernetes, est une étape distincte qui demande plusieurs semaines.

Quelle différence entre docker compose et docker-compose ?

docker-compose (avec un tiret) est l'ancien outil autonome écrit en Python, aujourd'hui abandonné. docker compose (avec un espace) est la version 2, intégrée à la CLI Docker sous forme de plugin. Les fichiers compose.yaml restent compatibles : utilisez simplement la commande avec un espace sur toute installation récente.

Docker fonctionne-t-il sous Windows ?

Oui. Sous Windows 10 et 11, on installe Docker Desktop, qui s'appuie sur WSL 2 (le sous-système Windows pour Linux) pour exécuter des conteneurs Linux. Il faut que la virtualisation soit activée dans le BIOS ou l'UEFI de la machine. Les commandes docker s'utilisent ensuite normalement depuis PowerShell, l'invite de commandes ou un terminal WSL.