đł Docker : les fondamentaux de la conteneurisation, pour de bon
đ 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.0Chaque 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:17On 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-alpineLa 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.0Depuis 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 -dCompose 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:latestchange sans prévenir ;postgres:17reste prévisible. Lelatesten 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 prunefait 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.