Tools: Docker pour Débutants en 2026 : Guide Complet

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

Command

Copy

# 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