Tools: Docker pour Débutants en 2026 : Guide Complet
C'est quoi Docker et pourquoi ça change tout
Différence entre Container et VM
Installation
Concepts fondamentaux
Commandes essentielles
Votre premier Dockerfile
Optimiser le Dockerfile
Docker Compose — Orchestrer plusieurs services
Workflow de développement avec Docker
Pour aller plus loin Docker pour Débutants en 2026 : Comprendre et Utiliser les Containers Docker est devenu incontournable dans le développement modern. En 2026, la quasi-totalité des entreprises utilisent des containers pour déployer leurs applications. Ce guide vous explique Docker de zéro, avec des exemples pratiques. Docker permet de "containeriser" vos applications : mettre votre code + ses dépendances + sa configuration dans un package portable qui tourne de la même façon partout. Le problème que Docker résout : "Ça marche sur ma machine mais pas sur le serveur". Avec Docker, votre container contient TOUT ce dont votre app a besoin. Elle tournera exactement pareil en développement, staging, et production. Docker Compose permet de définir et démarrer plusieurs containers en une commande. Parfait pour une stack complète (app + base de données + cache). Une fois les bases maîtrisées, explorez : → Déployer votre app Docker gratuitement → Créer une API REST avec Node.js Templates let you quickly answer FAQs or store snippets for re-use. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse
# Linux (Ubuntu/Debian)
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">update
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install -weight: 500;">docker.io -weight: 500;">docker-compose-plugin
-weight: 600;">sudo usermod -aG -weight: 500;">docker $USER # Utiliser Docker sans -weight: 600;">sudo
# Déconnectez-vous et reconnectez-vous # Mac / Windows : Docker Desktop
# https://www.-weight: 500;">docker.com/products/-weight: 500;">docker-desktop # Vérifier l'installation
-weight: 500;">docker --version
-weight: 500;">docker run hello-world # Test complet
# Linux (Ubuntu/Debian)
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">update
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install -weight: 500;">docker.io -weight: 500;">docker-compose-plugin
-weight: 600;">sudo usermod -aG -weight: 500;">docker $USER # Utiliser Docker sans -weight: 600;">sudo
# Déconnectez-vous et reconnectez-vous # Mac / Windows : Docker Desktop
# https://www.-weight: 500;">docker.com/products/-weight: 500;">docker-desktop # Vérifier l'installation
-weight: 500;">docker --version
-weight: 500;">docker run hello-world # Test complet
# Linux (Ubuntu/Debian)
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">update
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install -weight: 500;">docker.io -weight: 500;">docker-compose-plugin
-weight: 600;">sudo usermod -aG -weight: 500;">docker $USER # Utiliser Docker sans -weight: 600;">sudo
# Déconnectez-vous et reconnectez-vous # Mac / Windows : Docker Desktop
# https://www.-weight: 500;">docker.com/products/-weight: 500;">docker-desktop # Vérifier l'installation
-weight: 500;">docker --version
-weight: 500;">docker run hello-world # Test complet
# Lancer un container
-weight: 500;">docker run nginx # Lance nginx en foreground
-weight: 500;">docker run -d nginx # En background (detached)
-weight: 500;">docker run -d -p 8080:80 nginx # Exposer le port 80 → 8080
-weight: 500;">docker run -d --name mon-nginx nginx # Nommer le container # Gérer les containers
-weight: 500;">docker ps # Containers actifs
-weight: 500;">docker ps -a # Tous (incluant arrêtés)
-weight: 500;">docker -weight: 500;">stop mon-nginx # Arrêter
-weight: 500;">docker -weight: 500;">start mon-nginx # Démarrer
-weight: 500;">docker rm mon-nginx # Supprimer
-weight: 500;">docker rm -f mon-nginx # Force -weight: 500;">stop + delete # Gérer les images
-weight: 500;">docker images # Lister les images
-weight: 500;">docker pull node:20 # Télécharger une image
-weight: 500;">docker rmi node:20 # Supprimer une image # Logs et debug
-weight: 500;">docker logs mon-nginx # Voir les logs
-weight: 500;">docker logs -f mon-nginx # Suivre les logs en live
-weight: 500;">docker exec -it mon-nginx bash # Shell dans un container actif # Nettoyage
-weight: 500;">docker system prune # Supprimer tout ce qui est inutilisé
# Lancer un container
-weight: 500;">docker run nginx # Lance nginx en foreground
-weight: 500;">docker run -d nginx # En background (detached)
-weight: 500;">docker run -d -p 8080:80 nginx # Exposer le port 80 → 8080
-weight: 500;">docker run -d --name mon-nginx nginx # Nommer le container # Gérer les containers
-weight: 500;">docker ps # Containers actifs
-weight: 500;">docker ps -a # Tous (incluant arrêtés)
-weight: 500;">docker -weight: 500;">stop mon-nginx # Arrêter
-weight: 500;">docker -weight: 500;">start mon-nginx # Démarrer
-weight: 500;">docker rm mon-nginx # Supprimer
-weight: 500;">docker rm -f mon-nginx # Force -weight: 500;">stop + delete # Gérer les images
-weight: 500;">docker images # Lister les images
-weight: 500;">docker pull node:20 # Télécharger une image
-weight: 500;">docker rmi node:20 # Supprimer une image # Logs et debug
-weight: 500;">docker logs mon-nginx # Voir les logs
-weight: 500;">docker logs -f mon-nginx # Suivre les logs en live
-weight: 500;">docker exec -it mon-nginx bash # Shell dans un container actif # Nettoyage
-weight: 500;">docker system prune # Supprimer tout ce qui est inutilisé
# Lancer un container
-weight: 500;">docker run nginx # Lance nginx en foreground
-weight: 500;">docker run -d nginx # En background (detached)
-weight: 500;">docker run -d -p 8080:80 nginx # Exposer le port 80 → 8080
-weight: 500;">docker run -d --name mon-nginx nginx # Nommer le container # Gérer les containers
-weight: 500;">docker ps # Containers actifs
-weight: 500;">docker ps -a # Tous (incluant arrêtés)
-weight: 500;">docker -weight: 500;">stop mon-nginx # Arrêter
-weight: 500;">docker -weight: 500;">start mon-nginx # Démarrer
-weight: 500;">docker rm mon-nginx # Supprimer
-weight: 500;">docker rm -f mon-nginx # Force -weight: 500;">stop + delete # Gérer les images
-weight: 500;">docker images # Lister les images
-weight: 500;">docker pull node:20 # Télécharger une image
-weight: 500;">docker rmi node:20 # Supprimer une image # Logs et debug
-weight: 500;">docker logs mon-nginx # Voir les logs
-weight: 500;">docker logs -f mon-nginx # Suivre les logs en live
-weight: 500;">docker exec -it mon-nginx bash # Shell dans un container actif # Nettoyage
-weight: 500;">docker system prune # Supprimer tout ce qui est inutilisé
# Dockerfile pour une app Node.js
FROM node:20-alpine # Créer le dossier de travail
WORKDIR /app # Copier les fichiers de dépendances
COPY package*.json ./ # Installer les dépendances
RUN -weight: 500;">npm ci --only=production # Copier le reste du code
COPY . . # Builder TypeScript (si applicable)
RUN -weight: 500;">npm run build # Exposer le port
EXPOSE 3000 # Commande de démarrage
CMD ["node", "dist/index.js"]
# Dockerfile pour une app Node.js
FROM node:20-alpine # Créer le dossier de travail
WORKDIR /app # Copier les fichiers de dépendances
COPY package*.json ./ # Installer les dépendances
RUN -weight: 500;">npm ci --only=production # Copier le reste du code
COPY . . # Builder TypeScript (si applicable)
RUN -weight: 500;">npm run build # Exposer le port
EXPOSE 3000 # Commande de démarrage
CMD ["node", "dist/index.js"]
# Dockerfile pour une app Node.js
FROM node:20-alpine # Créer le dossier de travail
WORKDIR /app # Copier les fichiers de dépendances
COPY package*.json ./ # Installer les dépendances
RUN -weight: 500;">npm ci --only=production # Copier le reste du code
COPY . . # Builder TypeScript (si applicable)
RUN -weight: 500;">npm run build # Exposer le port
EXPOSE 3000 # Commande de démarrage
CMD ["node", "dist/index.js"]
# Construire l'image
-weight: 500;">docker build -t mon-app:latest .
-weight: 500;">docker build -t mon-app:v1.0 . # Lancer le container
-weight: 500;">docker run -d -p 3000:3000 --name mon-app mon-app:latest # Tester
-weight: 500;">curl http://localhost:3000/health
# Construire l'image
-weight: 500;">docker build -t mon-app:latest .
-weight: 500;">docker build -t mon-app:v1.0 . # Lancer le container
-weight: 500;">docker run -d -p 3000:3000 --name mon-app mon-app:latest # Tester
-weight: 500;">curl http://localhost:3000/health
# Construire l'image
-weight: 500;">docker build -t mon-app:latest .
-weight: 500;">docker build -t mon-app:v1.0 . # Lancer le container
-weight: 500;">docker run -d -p 3000:3000 --name mon-app mon-app:latest # Tester
-weight: 500;">curl http://localhost:3000/health
# Dockerfile optimisé avec multi-stage build
# Stage 1 : Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN -weight: 500;">npm ci
COPY . .
RUN -weight: 500;">npm run build # Stage 2 : Production (image finale plus petite)
FROM node:20-alpine AS production
WORKDIR /app
COPY package*.json ./
RUN -weight: 500;">npm ci --only=production
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/index.js"] # .dockerignore — équivalent du .gitignore
node_modules/
.env
dist/
*.log
.-weight: 500;">git/
# Dockerfile optimisé avec multi-stage build
# Stage 1 : Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN -weight: 500;">npm ci
COPY . .
RUN -weight: 500;">npm run build # Stage 2 : Production (image finale plus petite)
FROM node:20-alpine AS production
WORKDIR /app
COPY package*.json ./
RUN -weight: 500;">npm ci --only=production
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/index.js"] # .dockerignore — équivalent du .gitignore
node_modules/
.env
dist/
*.log
.-weight: 500;">git/
# Dockerfile optimisé avec multi-stage build
# Stage 1 : Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN -weight: 500;">npm ci
COPY . .
RUN -weight: 500;">npm run build # Stage 2 : Production (image finale plus petite)
FROM node:20-alpine AS production
WORKDIR /app
COPY package*.json ./
RUN -weight: 500;">npm ci --only=production
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/index.js"] # .dockerignore — équivalent du .gitignore
node_modules/
.env
dist/
*.log
.-weight: 500;">git/
# -weight: 500;">docker-compose.yml
version: '3.9' services: app: build: . ports: - "3000:3000" environment: - NODE_ENV=production - DATABASE_URL=postgresql://user:password@db:5432/mydb depends_on: - db - redis -weight: 500;">restart: unless-stopped db: image: postgres:16-alpine volumes: - postgres_data:/var/lib/postgresql/data environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=password - POSTGRES_DB=mydb -weight: 500;">restart: unless-stopped redis: image: redis:7-alpine -weight: 500;">restart: unless-stopped volumes: postgres_data:
# -weight: 500;">docker-compose.yml
version: '3.9' services: app: build: . ports: - "3000:3000" environment: - NODE_ENV=production - DATABASE_URL=postgresql://user:password@db:5432/mydb depends_on: - db - redis -weight: 500;">restart: unless-stopped db: image: postgres:16-alpine volumes: - postgres_data:/var/lib/postgresql/data environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=password - POSTGRES_DB=mydb -weight: 500;">restart: unless-stopped redis: image: redis:7-alpine -weight: 500;">restart: unless-stopped volumes: postgres_data:
# -weight: 500;">docker-compose.yml
version: '3.9' services: app: build: . ports: - "3000:3000" environment: - NODE_ENV=production - DATABASE_URL=postgresql://user:password@db:5432/mydb depends_on: - db - redis -weight: 500;">restart: unless-stopped db: image: postgres:16-alpine volumes: - postgres_data:/var/lib/postgresql/data environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=password - POSTGRES_DB=mydb -weight: 500;">restart: unless-stopped redis: image: redis:7-alpine -weight: 500;">restart: unless-stopped volumes: postgres_data:
# Commandes Docker Compose
-weight: 500;">docker compose up -d # Démarrer tous les services en background
-weight: 500;">docker compose down # Arrêter et supprimer les containers
-weight: 500;">docker compose logs -f # Voir les logs de tous les services
-weight: 500;">docker compose ps # État des services
-weight: 500;">docker compose -weight: 500;">restart app # Redémarrer un -weight: 500;">service
-weight: 500;">docker compose exec app bash # Shell dans un -weight: 500;">service
# Commandes Docker Compose
-weight: 500;">docker compose up -d # Démarrer tous les services en background
-weight: 500;">docker compose down # Arrêter et supprimer les containers
-weight: 500;">docker compose logs -f # Voir les logs de tous les services
-weight: 500;">docker compose ps # État des services
-weight: 500;">docker compose -weight: 500;">restart app # Redémarrer un -weight: 500;">service
-weight: 500;">docker compose exec app bash # Shell dans un -weight: 500;">service
# Commandes Docker Compose
-weight: 500;">docker compose up -d # Démarrer tous les services en background
-weight: 500;">docker compose down # Arrêter et supprimer les containers
-weight: 500;">docker compose logs -f # Voir les logs de tous les services
-weight: 500;">docker compose ps # État des services
-weight: 500;">docker compose -weight: 500;">restart app # Redémarrer un -weight: 500;">service
-weight: 500;">docker compose exec app bash # Shell dans un -weight: 500;">service
# -weight: 500;">docker-compose.dev.yml
version: '3.9' services: app: build: context: . target: development ports: - "3000:3000" volumes: - .:/app # Hot reload : votre code local monté - /app/node_modules # Exclure node_modules du montage command: -weight: 500;">npm run dev environment: - NODE_ENV=development db: image: postgres:16-alpine ports: - "5432:5432" # Accessible depuis votre machine environment: - POSTGRES_PASSWORD=dev
# -weight: 500;">docker-compose.dev.yml
version: '3.9' services: app: build: context: . target: development ports: - "3000:3000" volumes: - .:/app # Hot reload : votre code local monté - /app/node_modules # Exclure node_modules du montage command: -weight: 500;">npm run dev environment: - NODE_ENV=development db: image: postgres:16-alpine ports: - "5432:5432" # Accessible depuis votre machine environment: - POSTGRES_PASSWORD=dev
# -weight: 500;">docker-compose.dev.yml
version: '3.9' services: app: build: context: . target: development ports: - "3000:3000" volumes: - .:/app # Hot reload : votre code local monté - /app/node_modules # Exclure node_modules du montage command: -weight: 500;">npm run dev environment: - NODE_ENV=development db: image: postgres:16-alpine ports: - "5432:5432" # Accessible depuis votre machine environment: - POSTGRES_PASSWORD=dev - VM : un OS complet virtualisé (lourd, slow, 1-10 GB)
- Container : partage le kernel de l'OS hôte, isole juste le processus (léger, fast, 10-100 MB) - Image : template en lecture seule (recette de cuisine)
- Container : instance en cours d'exécution d'une image (le plat cuisiné)
- Dockerfile : fichier texte qui décrit comment construire une image
- Registry : dépôt d'images (Docker Hub, GitHub Container Registry)
- Volume : stockage persistant pour les containers - Kubernetes (K8s) : orchestration de containers à grande échelle
- Docker Hub : partager vos images publiquement
- GitHub Container Registry (GHCR) : images privées liées à votre repo
- Fly.io, Railway, Render : plateformes qui déploient directement depuis Docker