Docker: Le Guide Complet de la Containerisation en 2026
Docker a révolutionné le déploiement d'applications. Voici comment le maîtriser complètement.
## 1. Les Concepts Fondamentaux
### Image vs Conteneur
Une **image** est un blueprint, un **conteneur** est une instance en cours d'exécution.
```bash
# Créer une image
docker build -t mon-app:1.0 .
# Lancer un conteneur
docker run -d --name mon-conteneur mon-app:1.0
Dockerfile Simple
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "app.py"]
Images et Registries
# Pull une image
docker pull ubuntu:22.04
# Créer une image custom
docker build -t myapp:latest .
# Tagger une image
docker tag myapp:latest monregistre/myapp:1.0
# Pusher vers Docker Hub
docker login
docker push monregistre/myapp:1.0
# Voir les images
docker images
Conteneurs - Gestion Complète
# Lancer un conteneur
docker run -d \
--name mon-app \
-p 8000:8000 \
-e DATABASE_URL=postgres://... \
-v /data:/app/data \
mon-app:latest
# Voir les conteneurs en cours
docker ps
# Voir tous les conteneurs
docker ps -a
# Logs
docker logs mon-app
docker logs -f mon-app # Suivi en direct
# Accéder au conteneur
docker exec -it mon-app bash
# Arrêter/Démarrer
docker stop mon-app
docker start mon-app
# Supprimer
docker rm mon-app
Volumes - Persistance des Données
# Dockerfile avec volume
FROM postgres:15
VOLUME /var/lib/postgresql/data
EXPOSE 5432
# Créer un volume
docker volume create mon-volume
# Utiliser un volume
docker run -d \
--name postgres \
-v mon-volume:/var/lib/postgresql/data \
postgres:15
# Voir les volumes
docker volume ls
# Inspecter un volume
docker volume inspect mon-volume
Réseaux Docker
# Créer un réseau
docker network create mon-reseau
# Lancer des conteneurs sur le même réseau
docker run -d \
--name web \
--network mon-reseau \
-p 8000:8000 \
mon-app:latest
docker run -d \
--name db \
--network mon-reseau \
postgres:15
# Les conteneurs peuvent se parler par nom!
# Dans web: connection à db via "db:5432"
Docker Compose - Orchestration Simple
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
environment:
DATABASE_URL: postgres://db:5432/myapp
depends_on:
- db
volumes:
- ./:/app
db:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_PASSWORD: secret
volumes:
- db_data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
db_data:
networks:
default:
name: mon-reseau
# Démarrer tous les services
docker-compose up -d
# Voir les logs
docker-compose logs -f web
# Arrêter
docker-compose down
# Rebuild les images
docker-compose build
Bonnes Pratiques pour les Dockerfile
# Mauvais: Gros Dockerfile, dépendances inutiles
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y \
python3 python3-pip git curl wget \
build-essential npm nodejs ...
RUN pip install -r requirements.txt
COPY . /app
WORKDIR /app
# Bon: Multi-stage build, optimisé
FROM python:3.11-slim as builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt
FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
EXPOSE 8000
CMD ["gunicorn", "app:app"]
Docker en Production
# Production-ready Dockerfile
FROM node:20-alpine as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage de production
FROM node:20-alpine
WORKDIR /app
# Security: ne pas utiliser root
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
COPY --from=builder --chown=nextjs:nodejs /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
CMD ["node", "server.js"]
Debugging et Performance
# Voir l'utilisation des ressources
docker stats
# Inspecter un conteneur
docker inspect mon-app
# Voir les layers d'une image
docker history mon-app
# Réduire la taille des images
docker image prune -a
# Voir l'usage disque
docker system df
Déploiement avec Docker
# Sur AWS/Heroku
docker build -t monapp:latest .
docker tag monapp:latest registry.heroku.com/myapp/web:latest
docker push registry.heroku.com/myapp/web:latest
heroku container:release web
# Avec Docker Swarm
docker swarm init
docker service create --name web mon-app:latest
# Avec Kubernetes
kubectl create deployment myapp --image=myapp:latest
Ressources
Docker Hub: https://hub.docker.com
Documentation: https://docs.docker.com
Best Practices: https://docs.docker.com/develop/dev-best-practices/
Aucun commentaire pour le moment. Soyez le premier !