aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Outils & DevOps

Docker, c'est quoi ? Conteneurs et images expliqués

La réponse la plus courte à la question Docker, c'est quoi est celle-ci : c'est un outil qui empaquette ton application avec tout ce dont elle a besoin pour fonctionner (code, bibliothèques, environnement d'exécution, outils système) dans un seul paquet portable. Ce paquet s'exécute dans un conteneur, et il se comporte de la même façon sur ta machine, sur un serveur, sur l'ordinateur portable d'un collègue ou chez un fournisseur cloud. Le fameux problème « ça marchait chez moi mais pas sur le serveur » disparaît en grande partie.

Docker, c'est quoi, et pourquoi est-il apparu ?

La manière classique de déployer une application consiste à installer les dépendances une par une sur le serveur : la bonne version de PHP, la bonne version de Node.js, les bonnes bibliothèques, les bonnes variables d'environnement. C'est lent et source d'erreurs. Quand deux projets ont besoin de versions différentes, tout devient vite confus.

Docker résout cela par la standardisation. Tu empaquettes ton application et ses dépendances dans une image, puis tu lances autant de conteneurs que tu veux à partir de cette image. Chaque conteneur s'exécute dans son propre espace isolé, tout en partageant le même noyau du système d'exploitation. Le résultat : un démarrage rapide, une faible consommation de ressources et une cohérence dans tous les environnements.

La différence entre conteneurs et machines virtuelles

Les deux assurent l'isolation, mais à des couches différentes. Une machine virtuelle (VM) exécute un système d'exploitation complet au-dessus d'un hyperviseur qui émule le matériel. Chaque VM possède son propre noyau, elle peut donc occuper plusieurs gigaoctets et mettre des minutes à démarrer.

Un conteneur, en revanche, n'exécute pas un système d'exploitation distinct ; il partage le noyau Linux de l'hôte et n'isole que la couche applicative. L'isolation repose sur les fonctionnalités du noyau Linux que sont les namespaces (séparation de ce qu'un processus peut voir) et les cgroups (limitation des ressources).

  • Taille : les conteneurs se mesurent généralement en mégaoctets, les VM en gigaoctets.
  • Démarrage : un conteneur démarre en quelques secondes, souvent en millisecondes ; une VM est bien plus lente.
  • Isolation : les VM offrent une isolation plus forte, au niveau matériel ; les conteneurs sont plus légers mais partagent le noyau.

En pratique, ce ne sont pas des rivaux : on exécute souvent les conteneurs à l'intérieur d'une VM. Sur macOS et Windows, Docker utilise déjà une petite VM Linux en arrière-plan, car les conteneurs ont besoin d'un noyau Linux pour fonctionner.

Images, conteneurs et le modèle de couches

Il est important de ne pas confondre deux notions. Une image est un modèle en lecture seule : le système de fichiers, les dépendances et la commande de démarrage y sont figés. Un conteneur est une instance en cours d'exécution de cette image. Pense à une classe et un objet : à partir d'une seule image, tu peux produire des dizaines de conteneurs.

Les images sont construites à partir de couches. Chaque instruction d'un Dockerfile ajoute une nouvelle couche, et ces couches sont mises en cache. Les projets qui utilisent la même image de base partagent ces couches, ce qui économise à la fois l'espace disque et le temps de téléchargement. Quand tu modifies quelque chose, seules les couches situées après ce point sont reconstruites.

Ton premier Dockerfile : un petit exemple Node.js

Voyons comment définir une image. Pour une application Node.js simple, un Dockerfile pourrait ressembler à ceci :

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

Ligne par ligne : FROM choisit l'image de base (ici Node 20 léger, basé sur Alpine). WORKDIR définit le répertoire de travail. Copier d'abord uniquement les fichiers package.json et exécuter npm ci avant le reste est une technique délibérée pour exploiter le cache des couches : même si ton code change, cette couche n'est pas reconstruite tant que les dépendances restent les mêmes. EXPOSE documente le port, et CMD est la commande exécutée au démarrage du conteneur.

Commandes Docker essentielles

Voici les commandes que tu utiliseras le plus au quotidien :

# Construire l'image depuis le Dockerfile de ce dossier et l'étiqueter
docker build -t mon-app .

# Lancer un conteneur depuis l'image, en mappant le port 3000 vers l'hôte
docker run -p 3000:3000 mon-app

# Lister les conteneurs en cours d'exécution
docker ps

# Arrêter un conteneur
docker stop <container-id>

# Suivre les journaux d'un conteneur
docker logs -f <container-id>

Quand tu veux gérer plusieurs services ensemble (par exemple une application et une base de données), Docker Compose entre en jeu. Tu définis tous les services dans un seul fichier compose.yaml et tu les démarres avec docker compose up.

Quand faut-il utiliser Docker ?

Docker n'est pas toujours nécessaire, mais il est très utile dans des cas comme ceux-ci :

  • Environnements cohérents : quand tu veux que toute l'équipe et le serveur utilisent les mêmes versions.
  • Déploiement facile : tu peux envoyer la même image en test, en préproduction et en production sans la modifier.
  • Microservices : exécuter chaque service dans son propre conteneur clarifie les responsabilités.
  • Tests rapides : tu peux lancer une base de données ou un outil en une commande, puis le supprimer.

Pour un simple site statique, Docker peut ajouter une complexité inutile ; choisis l'outil selon le problème qu'il résout réellement.

Questions fréquentes

Faut-il connaître Linux pour apprendre Docker ?

Ce n'est pas obligatoire, mais cela aide beaucoup. Comme les conteneurs reposent sur le noyau Linux, connaître les commandes de base du terminal, les permissions de fichiers et les variables d'environnement te facilite grandement la tâche. Sur Windows et macOS, Docker Desktop fournit un environnement Linux en arrière-plan, ce qui suffit pour débuter.

Les conteneurs sont-ils sécurisés ?

Bien configurés, ils sont assez sûrs, mais comme ils partagent le noyau, l'isolation n'est pas aussi forte que celle d'une VM. Pour exécuter du code non fiable, de bonnes habitudes consistent à utiliser des images de base officielles, à exécuter le conteneur avec un utilisateur non root et à maintenir les images à jour.

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

Une image est un modèle en lecture seule (comme une classe), tandis qu'un conteneur est une instance en cours d'exécution de cette image (comme un objet). Tu peux lancer autant de conteneurs que tu veux à partir d'une seule image, et chacun s'exécute indépendamment.

Tu veux migrer ton projet vers des conteneurs ? Pour empaqueter ton application avec Docker, automatiser ton processus de déploiement ou organiser ton infrastructure, contacte-moi — concevons ensemble une installation simple et durable.

Devamı için