Ce qu'est vraiment une image, comment on l'écrit, comment on la construit, comment les conteneurs se parlent, et où passent les variables d'environnement.
Une machine virtuelle embarque un système d'exploitation entier. Un conteneur, lui, emprunte le noyau Linux de la machine hôte : il ne contient que l'application et ses dépendances. D'où le démarrage en une seconde.
Lourd, lent à démarrer, isolation maximale.
Quelques dizaines de Mo, démarrage instantané.
La confusion la plus fréquente en classe. L'image est le moule, en lecture seule ; le conteneur est le gâteau, jetable, qu'on peut refaire à l'identique.
La recette, versionnée avec le code.
Empilement de couches figées : app:v12.
L'image en train de tourner, avec sa couche d'écriture.
docker push / docker pull.FROML'image de départ. Toujours une version précise (node:22-alpine), jamais latest.WORKDIRLe dossier de travail à l'intérieur du conteneur.COPYCopie depuis le contexte de build vers l'image. On copie package.json avant le code : le cache de npm ci survit aux modifications de code.RUNExécuté pendant le build. Chaque RUN crée une couche.ENVVariable inscrite dans l'image. Uniquement pour du non-sensible.EXPOSEDocumentation du port. N'ouvre rien à lui seul — c'est -p qui publie.CMDExécuté au démarrage du conteneur. Un seul processus au premier plan.FROM compile, le second ne garde que le résultat. L'image finale n'embarque ni les outils de build ni le code source.node_modules, .git, .env. Sinon le contexte de build pèse des centaines de Mo et les secrets partent dans l'image.Chaque instruction produit une couche. Docker réutilise les couches inchangées — mais dès qu'une couche change, toutes celles du dessous sont refaites. C'est tout l'enjeu de l'ordre des lignes.
-t nomme l'image et lui donne un tag. Un tag = une version identifiable, donc un rollback possible.CMD node dist/server.jsmétadonnéeRUN npm run buildrefaite à chaque commitCOPY . .change souventRUN npm cien cacheCOPY package*.jsonen cacheFROM node:22-alpinebase-d
En arrière-plan
Le terminal est rendu. Sans -d, les logs défilent et Ctrl+C arrête le conteneur.
-p 8080:3000
Publier un port
hôte : conteneur. Toujours dans ce sens. Sans -p, le conteneur est injoignable de l'extérieur.
-v données:/app/data
Volume
Le stockage qui survit à la suppression du conteneur. Sans volume, la base de données disparaît au redéploiement.
Sur un réseau Docker personnalisé, chaque conteneur est joignable par son nom — Docker fournit le DNS interne. L'application appelle db:5432, pas une adresse IP.
-p 443:80
app-netbridge, créé par noushttp://api:3000db:5432, aucun port publiébridge par défaut n'a pas de résolution par nom : il faut créer son réseau (ou laisser Compose le faire).--env-fileLa même image doit tourner en local, en test et en production. Ce qui change n'est pas l'image : c'est l'environnement injecté au démarrage.
CLE=valeur par ligne, pas de guillemets, pas d'espaces autour du =, # pour commenter. Ce n'est pas un script shell — aucune expansion de variable.ENV du Dockerfile → --env-file → -e..env* dans .gitignore et .dockerignore.ENV du Dockerfile : il reste lisible dans les couches de l'image..env sur le serveur..env du dossier est lu automatiquement pour substituer ${VAR} dans le YAML ; pour les variables du conteneur, on déclare env_file: dans le service.Compose remplace la longue ligne de docker run par un fichier versionné. Il crée le réseau, les volumes et les conteneurs, et gère l'ordre de démarrage.
pull puis up -d.| Commande | Ce qu'elle fait |
|---|---|
docker build -t nom:tag . | construit une image depuis le Dockerfile du dossier courant |
docker images | liste les images locales et leur poids |
docker run -d -p 8080:3000 nom:tag | lance un conteneur en arrière-plan avec un port publié |
docker ps -a | conteneurs en cours, -a inclut les arrêtés |
docker logs -f web | suit la sortie du conteneur — le premier réflexe de débogage |
docker exec -it web sh | ouvre un shell dans le conteneur |
docker stop web && docker rm web | arrête puis supprime le conteneur |
docker network create / inspect | crée un réseau, ou liste ce qui y est branché |
docker volume ls | liste les volumes — les données persistantes |
docker system prune -a | libère l'espace disque : images et couches inutilisées |