Cycle de vie des conteneurs
Lancer un conteneur en mode interactif (shell)
docker run -it --name myapp ubuntu /bin/bash
Lancer un conteneur en arrière-plan (détaché)
docker run -d --name web -p 8080:80 nginx
Lancer avec variables d'environnement
docker run -d -e MYSQL_ROOT_PASSWORD=secret -e MYSQL_DATABASE=app mysql:8
Lancer avec redémarrage automatique
docker run -d --restart unless-stopped --name app myimage
Stopper / Démarrer / Redémarrer un conteneur
docker stop myapp docker start myapp docker restart myapp
Supprimer un conteneur (forcer si running)
docker rm myapp docker rm -f myapp
Exécuter une commande dans un conteneur actif
docker exec -it myapp /bin/bash docker exec myapp cat /etc/hosts
Lister les conteneurs (actifs / tous)
docker ps docker ps -a docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
Copier fichiers entre hôte et conteneur
docker cp myapp:/var/log/app.log ./app.log docker cp ./config.yml myapp:/etc/app/
Renommer un conteneur
docker rename old_name new_name
Images
Télécharger une image depuis un registry
docker pull nginx:alpine docker pull registry.example.com/myapp:v2
Construire une image depuis un Dockerfile
docker build -t myapp:v1 . docker build -t myapp:v1 -f Dockerfile.prod . docker build --no-cache -t myapp:latest .
Lister / Supprimer des images
docker images docker images --filter "dangling=true" docker rmi myapp:v1 docker rmi -f $(docker images -q)
Taguer et pousser une image
docker tag myapp:v1 registry.io/myapp:v1 docker push registry.io/myapp:v1
Sauvegarder / Charger une image (archive tar)
docker save -o myapp.tar myapp:v1 docker load -i myapp.tar
Voir l'historique des couches d'une image
docker history myapp:v1 docker history --no-trunc myapp:v1
Réseau
Lister / Créer / Supprimer des réseaux
docker network ls docker network create mynet docker network create --driver bridge --subnet 172.20.0.0/16 mynet docker network rm mynet
Connecter / Déconnecter un conteneur d'un réseau
docker network connect mynet myapp docker network disconnect mynet myapp
Inspecter un réseau (voir les conteneurs connectés)
docker network inspect mynet docker network inspect bridge --format '{{range .Containers}}{{.Name}} {{end}}'
Publication de ports (mapping)
# hôte:conteneur docker run -p 8080:80 nginx # seulement localhost docker run -p 127.0.0.1:8080:80 nginx # port aléatoire docker run -P nginx
Volumes & Bind Mounts
Créer / Lister / Supprimer des volumes
docker volume create mydata docker volume ls docker volume rm mydata docker volume inspect mydata
Monter un volume nommé
docker run -d -v mydata:/var/lib/mysql mysql:8
Bind mount (répertoire hôte)
docker run -d -v $(pwd)/html:/usr/share/nginx/html:ro nginx # syntaxe --mount (plus explicite) docker run --mount type=bind,src=$(pwd)/html,dst=/usr/share/nginx/html,readonly nginx
tmpfs mount (RAM, pas de persistence)
docker run -d --tmpfs /tmp:rw,size=100m myapp
Inspection & Debug
Voir les logs d'un conteneur
docker logs myapp docker logs -f myapp # follow docker logs --tail 100 myapp # 100 dernières lignes docker logs --since 10m myapp # 10 dernières minutes
Inspecter un conteneur (JSON complet)
docker inspect myapp docker inspect --format '{{.NetworkSettings.IPAddress}}' myapp docker inspect --format '{{.State.Status}}' myapp
Statistiques temps réel (CPU, RAM, I/O)
docker stats docker stats myapp docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
Voir les processus dans un conteneur
docker top myapp
Voir les changements filesystem d'un conteneur
docker diff myapp
Voir les événements Docker en temps réel
docker events docker events --filter "type=container" docker system df # espace disque
Docker Compose
Lancer / Stopper la stack
docker compose up -d docker compose up -d --build # rebuild images docker compose down docker compose down -v # + suppr volumes
Voir les logs / statut des services
docker compose logs -f docker compose logs -f web docker compose ps docker compose top
Exécuter une commande dans un service
docker compose exec web /bin/bash docker compose run web python manage.py migrate
Scaler un service / Restart
docker compose up -d --scale web=3 docker compose restart web docker compose pull # update images
Valider et afficher la config finale
docker compose config docker compose -f docker-compose.prod.yml config
docker-compose.yml
Template type avec web + db + volumes + réseau
services: web: build: ./app ports: - "8080:80" environment: - DB_HOST=db - DB_PORT=5432 volumes: - ./app:/var/www/html depends_on: db: condition: service_healthy networks: - frontend - backend restart: unless-stopped db: image: postgres:16-alpine environment: - POSTGRES_PASSWORD_FILE=/run/secrets/db_pass - POSTGRES_DB=app volumes: - pgdata:/var/lib/postgresql/data networks: - backend healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s retries: 5 restart: unless-stopped secrets: - db_pass volumes: pgdata: networks: frontend: backend: secrets: db_pass: file: ./secrets/db_password.txt
Dockerfile — Instructions clés
FROM — Image de base
FROM ubuntu:24.04 FROM node:20-alpine AS builder
RUN — Exécuter pendant le build
RUN apt-get update && apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*
COPY vs ADD — Copier des fichiers
COPY package*.json ./ # préféré COPY --chown=1000:1000 . /app ADD https://example.com/file.tar.gz /tmp/ # auto-extract
WORKDIR, USER, EXPOSE
WORKDIR /app USER 1000 EXPOSE 8080
CMD vs ENTRYPOINT
# CMD = commande par défaut (overridable) CMD ["node", "server.js"] # ENTRYPOINT = commande fixe + CMD = args par défaut ENTRYPOINT ["python"] CMD ["app.py"]
ENV, ARG, VOLUME, HEALTHCHECK
ENV NODE_ENV=production ARG VERSION=1.0 # build-time only VOLUME /data HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://localhost/ || exit 1
Dockerfile (multi-stage)
Build optimisé — image finale minimale
# ── Stage 1 : Build ── FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . RUN npm run build # ── Stage 2 : Production ── FROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/html EXPOSE 80 HEALTHCHECK --interval=30s CMD wget -qO- http://localhost/ || exit 1
Sécurité & Bonnes pratiques
Lancer en read-only avec capabilities limitées
docker run --read-only --tmpfs /tmp --cap-drop ALL --cap-add NET_BIND_SERVICE myapp
Limiter les ressources (CPU, RAM)
docker run -d --memory 512m --cpus 1.5 --pids-limit 100 myapp
Lancer en tant qu'utilisateur non-root
docker run --user 1000:1000 myapp # dans Dockerfile : RUN useradd -r -u 1000 appuser USER appuser
Pas de nouveau privilège + seccomp
docker run --security-opt no-new-privileges:true myapp
Scanner les vulnérabilités d'une image
docker scout cves myapp:latest docker scout quickview myapp:latest
Nettoyage
Nettoyage global (images, conteneurs, réseaux, cache)
docker system prune # conteneurs stoppés + images dangling docker system prune -a # + toutes images non utilisées docker system prune -a --volumes # + volumes orphelins
Nettoyage ciblé par type
docker container prune # conteneurs stoppés docker image prune -a # images non utilisées docker volume prune # volumes orphelins docker network prune # réseaux inutilisés docker builder prune # build cache
Supprimer tous les conteneurs stoppés
docker rm $(docker ps -aq -f status=exited)
Voir l'espace disque utilisé par Docker
docker system df docker system df -v # détail par image/volume/conteneur