← Tous les articles
Jeu. 25 juin 2026 · 4 min de lecture

🐳 Docker : les fondamentaux de la conteneurisation, pour de bon

Docker

📚 Introduction

« Ça marche sur ma machine. » Cette phrase, on l’a tous prononcĂ©e avant que le dĂ©ploiement ne parte en fumĂ©e. Docker existe prĂ©cisĂ©ment pour la faire disparaĂźtre : au lieu de dĂ©pendre de ce qui est installĂ© sur le serveur, on empaquette l’application et son environnement dans une unitĂ© portable qui tourne Ă  l’identique partout.

Docker est aujourd’hui la brique de base de l’infrastructure moderne. Avant de parler d’orchestration ou de Kubernetes, il faut maĂźtriser ses fondamentaux : ce qu’est une image, ce qu’est un conteneur, comment persister des donnĂ©es et faire communiquer plusieurs services. C’est l’objet de cet article — le mental model d’abord, les commandes ensuite.

🔎 Qu’est-ce qu’un conteneur, exactement ?

Un conteneur n’est pas une machine virtuelle lĂ©gĂšre, mĂȘme si la mĂ©taphore est tentante. Une VM Ă©mule un ordinateur complet, avec son propre noyau. Un conteneur, lui, partage le noyau de la machine hĂŽte et n’isole que l’espace applicatif : ses processus, son systĂšme de fichiers, son rĂ©seau.

ConcrĂštement, ça change tout. LĂ  oĂč une VM pĂšse plusieurs gigaoctets et dĂ©marre en dizaines de secondes, un conteneur pĂšse quelques mĂ©gaoctets et dĂ©marre quasi instantanĂ©ment. On peut en lancer des dizaines sur une machine modeste. C’est cette lĂ©gĂšretĂ© qui a rendu possible l’infrastructure Ă  base de microservices — et, plus tard, la nĂ©cessitĂ© de les orchestrer.

đŸ§± Images et conteneurs : le duo fondateur

C’est la distinction qui dĂ©bloque tout le reste. Une image est un modĂšle immuable, en lecture seule, qui contient l’application et ses dĂ©pendances, construit en couches empilĂ©es. Un conteneur est une instance en cours d’exĂ©cution de cette image, avec une fine couche d’écriture par-dessus.

Le parallùle avec la programmation objet est direct : l’image est la classe, le conteneur est l’instance. Une seule image postgres:17 peut donner naissance à autant de conteneurs qu’on veut.

On construit une image Ă  partir d’un Dockerfile, une recette Ă©tape par Ă©tape :

FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

Puis on la construit et on lance un conteneur :

docker build -t mon-app:1.0 .
docker run -d -p 8080:3000 --name web mon-app:1.0

Chaque instruction du Dockerfile crĂ©e une couche, mise en cache. C’est ce mĂ©canisme de couches qu’on optimise pour accĂ©lĂ©rer les builds — un sujet que je dĂ©taille dans le multi-stage build pour Laravel.

đŸ’Ÿ Persister les donnĂ©es avec les volumes

Voici l’erreur classique du dĂ©butant : Ă©crire des donnĂ©es dans le conteneur, puis les voir disparaĂźtre quand on le recrĂ©e. C’est normal — la couche d’écriture d’un conteneur meurt avec lui.

Pour persister, on utilise un volume, un espace de stockage géré par Docker qui vit indépendamment du conteneur :

docker volume create pgdata
docker run -d \
  -v pgdata:/var/lib/postgresql/data \
  -e POSTGRES_PASSWORD=secret \
  postgres:17

On peut aussi monter un dossier de l’hĂŽte directement (un « bind mount »), pratique en dĂ©veloppement pour Ă©diter le code sans rebuild :

docker run -v $(pwd):/app node:22-alpine

La rĂšgle d’or : le conteneur est jetable, le volume est prĂ©cieux. Tout ce qui doit survivre Ă  un redĂ©marrage — base de donnĂ©es, fichiers uploadĂ©s — passe par un volume.

🌐 RĂ©seaux et communication entre conteneurs

Par dĂ©faut, Docker isole les conteneurs, mais leur permet de communiquer via des rĂ©seaux virtuels. Quand plusieurs conteneurs partagent un mĂȘme rĂ©seau, ils se joignent par leur nom :

docker network create app-net
docker run -d --network app-net --name db postgres:17
docker run -d --network app-net --name api mon-app:1.0

Depuis le conteneur api, la base est joignable Ă  l’adresse db:5432. Pas besoin d’IP en dur : Docker fournit une rĂ©solution DNS interne. C’est cette mĂ©canique qui rend les applications multi-conteneurs Ă©lĂ©gantes — et qui prĂ©figure la dĂ©couverte de services de Kubernetes.

🧰 Docker Compose : orchestrer sans se compliquer

Lancer trois conteneurs Ă  la main avec les bons flags, c’est vite pĂ©nible. Docker Compose dĂ©crit toute l’application dans un fichier compose.yaml :

services:
  api:
    build: .
    ports:
      - '8080:3000'
    depends_on:
      - db
  db:
    image: postgres:17
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - pgdata:/var/lib/postgresql/data
 
volumes:
  pgdata:

Et on dĂ©marre tout d’une commande :

docker compose up -d

Compose est aujourd’hui intĂ©grĂ© Ă  Docker sous la forme docker compose (avec un espace) — plus besoin d’installer un binaire sĂ©parĂ©. Pour un seul serveur, Compose couvre l’écrasante majoritĂ© des besoins : c’est souvent tout ce dont on a besoin avant de basculer vers Kubernetes.

⚠ Quelques prĂ©cautions

  • N’écrivez jamais de secrets en dur dans une image. Une image est distribuable ; un mot de passe committĂ© dedans est un mot de passe fuitĂ©. Passez par des variables d’environnement ou un gestionnaire de secrets.
  • Épinglez vos tags. postgres:latest change sans prĂ©venir ; postgres:17 reste prĂ©visible. Le latest en production est une source de surprises.
  • Un processus par conteneur. Ne transformez pas un conteneur en mini-serveur avec dix services dedans. Un conteneur = une responsabilitĂ©.
  • Nettoyez rĂ©guliĂšrement. Images et volumes orphelins s’accumulent. docker system prune fait le mĂ©nage — mais vĂ©rifiez ce que vous supprimez.

🎉 Conclusion

Docker tient sur quatre idĂ©es : les images (le modĂšle), les conteneurs (l’instance), les volumes (la persistance) et les rĂ©seaux (la communication). Une fois ce socle en tĂȘte, Docker Compose suffit Ă  faire tourner une application complĂšte sur un seul serveur, proprement et de façon reproductible.

C’est aussi la fondation indispensable pour la suite. Un conteneur Docker est exactement ce que Kubernetes va orchestrer Ă  grande Ă©chelle, et un runtime comme FrankenPHP se distribue justement sous forme d’image Docker. MaĂźtrisez Docker d’abord : tout le reste s’y appuie.

🔗 Liens utiles

/faq

Questions fréquentes

Quelle est la différence entre une image et un conteneur Docker ?

+

Une image est un modĂšle immuable en lecture seule qui contient l'application et ses dĂ©pendances. Un conteneur est une instance en cours d'exĂ©cution de cette image, avec une couche d'Ă©criture par-dessus. Une mĂȘme image peut lancer autant de conteneurs qu'on veut, comme une classe et ses instances.

Les données d'un conteneur Docker sont-elles perdues au redémarrage ?

+

Oui si elles sont Ă©crites dans le conteneur lui-mĂȘme : sa couche d'Ă©criture disparaĂźt quand on le supprime. Pour persister des donnĂ©es (base de donnĂ©es, uploads), il faut monter un volume Docker ou un bind mount, qui vit indĂ©pendamment du cycle de vie du conteneur.

Docker Compose remplace-t-il Docker ?

+

Non, il le complÚte. Docker lance des conteneurs un par un ; Docker Compose décrit une application multi-conteneurs dans un fichier compose.yaml et la démarre en une commande. Compose est désormais intégré à Docker sous la forme « docker compose », sans installation séparée.