Guide de référence complet pour Docker: images, containers, networks, volumes et Docker Compose.
1. Images
Gestion des Images
Action
Commande
Description
Lister images
docker images ou docker image ls
Afficher toutes les images locales
Pull image
docker pull <image>:<tag>
Télécharger une image du registry
Build image
docker build -t <nom>:<tag> .
Construire une image depuis un Dockerfile
Tag image
docker tag <image> <nouveau-nom>:<tag>
Renommer/créer un alias d'image
Push image
docker push <image>:<tag>
Envoyer une image vers un registry
Remove image
docker rmi <image>
Supprimer une image
Inspecter image
docker inspect <image>
Détails complets de l'image
Historique
docker history <image>
Voir les layers de l'image
# Télécharger une imagedockerpullnginx:latest
dockerpullubuntu:22.04
dockerpullpostgres:15-alpine
# Build une image avec tagdockerbuild-tmyapp:v1.0.
dockerbuild-tmyapp:latest-fDockerfile.prod.
# Build avec argumentsdockerbuild--build-argVERSION=1.0-tmyapp:v1.0.
# Build sans cachedockerbuild--no-cache-tmyapp:latest.
# Tag et push vers un registrydockertagmyapp:v1.0registry.example.com/myapp:v1.0
dockerpushregistry.example.com/myapp:v1.0
# Sauvegarder une image dans un fichierdockersavenginx:latest>nginx.tar
dockersave-onginx.tarnginx:latest
# Charger une image depuis un fichierdockerload<nginx.tar
dockerload-inginx.tar
Recherche & Registry
# Rechercher une image sur Docker Hubdockersearchnginx
dockersearchpostgres--limit5# Se connecter à un registrydockerlogin
dockerloginregistry.example.com-uusername
# Se déconnecterdockerlogoutdockerlogoutregistry.example.com
# Voir les tags disponibles (nécessite curl)curl-shttps://registry.hub.docker.com/v2/repositories/library/nginx/tags|jq'.results[].name'
2. Containers
Cycle de Vie des Containers
Action
Commande
Description
Run
docker run <image>
Créer et démarrer un container
Run détaché
docker run -d <image>
Démarrer en arrière-plan
Run interactif
docker run -it <image> /bin/bash
Mode interactif avec shell
Run temporaire
docker run --rm <image>
Auto-suppression après arrêt
Start
docker start <container>
Démarrer un container arrêté
Stop
docker stop <container>
Arrêter proprement (SIGTERM)
Kill
docker kill <container>
Arrêter brutalement (SIGKILL)
Restart
docker restart <container>
Redémarrer un container
Pause
docker pause <container>
Suspendre les processus
Unpause
docker unpause <container>
Reprendre les processus
Remove
docker rm <container>
Supprimer un container arrêté
Force remove
docker rm -f <container>
Supprimer même si en cours
# Lancer un container simpledockerrunnginx
# Lancer en arrière-plan avec nomdockerrun-d--namewebnginx
# Lancer avec port mappingdockerrun-d-p8080:80--namewebnginx
# Lancer avec variables d'environnementdockerrun-d-eMYSQL_ROOT_PASSWORD=secret-eMYSQL_DATABASE=mydbmysql:8
# Lancer avec volumedockerrun-d-v/host/path:/container/pathnginx
# Lancer avec limite de ressourcesdockerrun-d--memory="512m"--cpus="1.5"nginx
# Lancer avec restart policydockerrun-d--restart=always--namewebnginx
# Container temporaire pour testerdockerrun--rm-italpinesh
# Exécuter une commande sans créer de container persistantdockerrun--rmubuntu:22.04cat/etc/os-release
Listing & Inspection
# Lister les containers actifsdockerps
dockercontainerls
# Lister tous les containers (actifs + arrêtés)dockerps-a
dockercontainerls-a
# Lister seulement les IDsdockerps-q
dockerps-aq
# Format personnalisédockerps--format"table {{.ID}}\t{{.Names}}\t{{.Status}}"# Voir les containers avec leur tailledockerps-s
# Filtrer les containersdockerps-f"status=running"dockerps-f"name=web"dockerps-f"ancestor=nginx"# Inspecter un containerdockerinspect<container>
dockerinspect<container>|jq'.[0].NetworkSettings.IPAddress'# Statistiques en temps réeldockerstats
dockerstats--no-stream
# Processus dans un containerdockertop<container>
3. Logs & Debugging
Logs
Action
Commande
Voir logs
docker logs <container>
Follow logs
docker logs -f <container>
Dernières N lignes
docker logs --tail 100 <container>
Logs depuis X temps
docker logs --since 1h <container>
Logs avec timestamps
docker logs -t <container>
# Voir les logsdockerlogsweb
# Suivre les logs en temps réeldockerlogs-fweb
# Dernières 100 lignesdockerlogs--tail100web
# Logs depuis 1 heuredockerlogs--since1hweb
dockerlogs--since2024-01-01T10:00:00web
# Logs avec timestampsdockerlogs-tweb
# Combiner plusieurs optionsdockerlogs-f--tail50--since10mweb
Exec & Attach
# Ouvrir un shell dans un container actifdockerexec-itwebbash
dockerexec-itwebsh# Si bash n'est pas disponible# Exécuter une commandedockerexecwebls-la/var/www/html
dockerexecwebpsaux
dockerexecwebenv
# Exécuter en tant qu'utilisateur spécifiquedockerexec-urootwebwhoami
# Attacher à un container actif (voir stdout/stderr)dockerattachweb
# Copier des fichiers depuis/vers un containerdockercpweb:/var/log/nginx/access.log./access.log
dockercpconfig.yamlweb:/etc/app/config.yaml
Debugging
# Voir les changements du filesystemdockerdiff<container>
# Événements Dockerdockerevents
dockerevents--filter"type=container"dockerevents--since1h
# Voir les ports mappésdockerport<container>
# Informations détailléesdockerinspect<container>
# Voir les processus du containerdockertop<container>
# Export filesystem d'un containerdockerexport<container>>container-backup.tar
# Import d'un container depuis un tarballdockerimportcontainer-backup.tarmyimage:backup
4. Networks
Gestion des Réseaux
Action
Commande
Lister networks
docker network ls
Créer network
docker network create <nom>
Inspecter network
docker network inspect <nom>
Connecter container
docker network connect <network> <container>
Déconnecter
docker network disconnect <network> <container>
Supprimer network
docker network rm <nom>
Cleanup networks
docker network prune
# Lister les réseauxdockernetworkls
# Créer un network bridgedockernetworkcreatemynetwork
dockernetworkcreate--driverbridgemynetwork
# Créer un network avec subnet spécifiquedockernetworkcreate--subnet=172.20.0.0/16mynetwork
# Inspecter un networkdockernetworkinspectbridge
dockernetworkinspectmynetwork
# Lancer un container sur un networkdockerrun-d--nameweb--networkmynetworknginx
dockerrun-d--namedb--networkmynetworkmysql:8
# Connecter un container existant à un networkdockernetworkconnectmynetworkweb
# Déconnecter un containerdockernetworkdisconnectmynetworkweb
# Supprimer un networkdockernetworkrmmynetwork
# Nettoyer les networks non utilisésdockernetworkprune-f
Types de Networks
# Bridge (défaut): Réseau isolé sur l'hôtedockernetworkcreate--driverbridgeapp-network
# Host: Partage le réseau de l'hôtedockerrun-d--networkhostnginx
# None: Pas de réseaudockerrun-d--networknonealpine
# Overlay: Communication entre hôtes Docker Swarmdockernetworkcreate--driveroverlaymy-overlay-net
Communication Entre Containers
# Créer un réseau pour l'applicationdockernetworkcreatewebapp
# Lancer une base de donnéesdockerrun-d\--namepostgres\--networkwebapp\-ePOSTGRES_PASSWORD=secret\postgres:15
# Lancer l'application (peut accéder à postgres via son nom)dockerrun-d\--nameapp\--networkwebapp\-eDATABASE_HOST=postgres\myapp:latest
# Test de connectivitédockerexecapppingpostgres
dockerexecappnslookuppostgres
5. Volumes & Storage
Gestion des Volumes
Action
Commande
Lister volumes
docker volume ls
Créer volume
docker volume create <nom>
Inspecter volume
docker volume inspect <nom>
Supprimer volume
docker volume rm <nom>
Cleanup volumes
docker volume prune
# Créer un volumedockervolumecreatemydata
# Lister les volumesdockervolumels
# Inspecter un volumedockervolumeinspectmydata
# Utiliser un volume avec un containerdockerrun-d-vmydata:/var/lib/mysql--namedbmysql:8
# Bind mount (lier un dossier de l'hôte)dockerrun-d-v/host/path:/container/pathnginx
dockerrun-d-v$(pwd):/appnode:18
# Bind mount en lecture seuledockerrun-d-v/host/path:/container/path:ronginx
# Volume temporaire (tmpfs)dockerrun-d--tmpfs/tmp:size=100mnginx
# Supprimer un volumedockervolumermmydata
# Nettoyer les volumes non utilisésdockervolumeprune-f
Types de Montage
# 1. Named Volume (géré par Docker, recommandé pour la persistance)dockerrun-d-vmysql-data:/var/lib/mysqlmysql:8
# 2. Bind Mount (lier un dossier de l'hôte)dockerrun-d-v/home/user/data:/datanginx
# 3. tmpfs Mount (en mémoire, non persistant)dockerrun-d--tmpfs/cache:rw,size=100mnginx
# Format moderne (--mount, plus verbeux mais plus clair)dockerrun-d\--mounttype=volume,source=mysql-data,target=/var/lib/mysql\mysql:8
dockerrun-d\--mounttype=bind,source=/host/path,target=/app\nginx
6. Docker Compose
Commandes de Base
Action
Commande
Description
Start
docker compose up
Démarrer les services
Start détaché
docker compose up -d
Démarrer en arrière-plan
Stop
docker compose stop
Arrêter les services
Down
docker compose down
Arrêter et supprimer
Down + volumes
docker compose down -v
Supprimer aussi les volumes
Logs
docker compose logs
Voir les logs
Follow logs
docker compose logs -f
Suivre les logs
Liste services
docker compose ps
Lister les containers
Build
docker compose build
Build les images
Pull
docker compose pull
Pull les images
Exec
docker compose exec <service> <cmd>
Exécuter une commande
Restart
docker compose restart
Redémarrer les services
# Démarrer les servicesdockercomposeup
dockercomposeup-d# Détaché# Démarrer des services spécifiquesdockercomposeupwebdb
# Build et startdockercomposeup--build
# Voir les logsdockercomposelogs
dockercomposelogs-f# Followdockercomposelogs-fweb# Logs d'un service# Lister les containersdockercomposeps
dockercomposeps-a
# Exécuter une commandedockercomposeexecwebbash
dockercomposeexecdbpsql-Upostgres
# Stopper les servicesdockercomposestop
dockercomposestopweb# Un service spécifique# Redémarrerdockercomposerestart
dockercomposerestartweb
# Arrêter et supprimer toutdockercomposedown
dockercomposedown-v# Avec les volumesdockercomposedown--rmiall# Avec les images# Scaler un servicedockercomposeup-d--scaleweb=3# Voir la config finale (après merge des fichiers)dockercomposeconfig
# Valider le fichier composedockercomposeconfig--quiet
Exemple docker-compose.yml
version:'3.8'services:# Service web (Nginx)web:image:nginx:latestports:-"80:80"-"443:443"volumes:-./html:/usr/share/nginx/html:ro-./nginx.conf:/etc/nginx/nginx.conf:rodepends_on:-appnetworks:-frontendrestart:unless-stopped# Service application (Node.js)app:build:context:./appdockerfile:Dockerfileargs:NODE_ENV:productionenvironment:-DATABASE_HOST=db-DATABASE_PORT=5432-DATABASE_NAME=myapp-DATABASE_USER=postgres-DATABASE_PASSWORD=secretvolumes:-./app:/usr/src/app-/usr/src/app/node_modules# Volume anonyme pour node_modulesdepends_on:-db-redisnetworks:-frontend-backendrestart:unless-stopped# Service base de données (PostgreSQL)db:image:postgres:15-alpineenvironment:POSTGRES_DB:myappPOSTGRES_USER:postgresPOSTGRES_PASSWORD:secretvolumes:-postgres-data:/var/lib/postgresql/data-./init.sql:/docker-entrypoint-initdb.d/init.sqlnetworks:-backendrestart:unless-stoppedhealthcheck:test:["CMD-SHELL","pg_isready-Upostgres"]interval:10stimeout:5sretries:5# Service cache (Redis)redis:image:redis:7-alpinevolumes:-redis-data:/datanetworks:-backendrestart:unless-stoppedcommand:redis-server --appendonly yesvolumes:postgres-data:redis-data:networks:frontend:backend:
Commandes Avancées
# Utiliser plusieurs fichiers compose (override)dockercompose-fdocker-compose.yml-fdocker-compose.prod.ymlup-d
# Variables d'environnement depuis un fichierdockercompose--env-file.env.productionup-d
# Forcer la recréation des containersdockercomposeup-d--force-recreate
# Recréer seulement si changementsdockercomposeup-d--no-recreate
# Build sans cachedockercomposebuild--no-cache
# Pull les dernières imagesdockercomposepull
# Voir les images utiliséesdockercomposeimages
# Voir les volumesdockercomposevolumels
# Top des processusdockercomposetop
# Événements en temps réeldockercomposeevents
# Pause/Unpausedockercomposepause
dockercomposeunpause
7. Cleanup & Maintenance
Nettoyage des Ressources
# Supprimer tous les containers arrêtésdockercontainerprune
dockercontainerprune-f# Sans confirmation# Supprimer toutes les images non utiliséesdockerimageprune
dockerimageprune-a# Incluant les images non taguées# Supprimer tous les volumes non utilisésdockervolumeprune
dockervolumeprune-f
# Supprimer tous les networks non utilisésdockernetworkprune
dockernetworkprune-f
# Nettoyage complet (ATTENTION!)dockersystemprune
dockersystemprune-a# Inclut toutes les imagesdockersystemprune-a--volumes# Inclut aussi les volumes# Voir l'espace disque utilisédockersystemdf
dockersystemdf-v# Détaillé
Gestion de l'Espace
# Voir l'utilisation du disquedockersystemdf
# Exemple de sortie:# TYPE TOTAL ACTIVE SIZE RECLAIMABLE# Images 15 5 2.5GB 1.2GB (48%)# Containers 10 3 500MB 300MB (60%)# Local Volumes 8 2 1GB 800MB (80%)# Build Cache 20 0 3GB 3GB (100%)# Supprimer les images non utilisées depuis X joursdockerimageprune-a--filter"until=720h"# 30 jours# Supprimer containers arrêtés depuis X tempsdockercontainerprune--filter"until=24h"# Voir les layers d'une imagedockerhistorynginx:latest
# Cleanup build cachedockerbuilderprune
dockerbuilderprune-a-f# Tout supprimer
8. Build & Dockerfile
Commandes de Build
# Build basiquedockerbuild-tmyapp:latest.
# Build avec un Dockerfile spécifiquedockerbuild-fDockerfile.prod-tmyapp:prod.
# Build avec argumentsdockerbuild--build-argVERSION=1.0--build-argENV=prod-tmyapp:v1.
# Build sans cachedockerbuild--no-cache-tmyapp:latest.
# Build avec target (multi-stage)dockerbuild--targetproduction-tmyapp:prod.
# Build avec secret (BuildKit)dockerbuild--secretid=mysecret,src=./secret.txt-tmyapp.
# Build pour une plateforme spécifiquedockerbuild--platformlinux/amd64-tmyapp:amd64.
dockerbuildxbuild--platformlinux/amd64,linux/arm64-tmyapp:multi.
# Voir le build cachedockerbuilderls
Exemple Dockerfile Multi-stage
# Stage 1: BuildFROMnode:18-alpineASbuilderWORKDIR/appCOPYpackage*.json./
RUNnpmci--only=production
COPY..
RUNnpmrunbuild
# Stage 2: ProductionFROMnode:18-alpineASproductionWORKDIR/app# Créer un utilisateur non-rootRUNaddgroup-g1001-Snodejs&&\adduser-Snodejs-u1001# Copier seulement le nécessaire depuis le builderCOPY--from=builder--chown=nodejs:nodejs/app/dist./dist
COPY--from=builder--chown=nodejs:nodejs/app/node_modules./node_modules
COPY--from=builder--chown=nodejs:nodejs/app/package*.json./
USERnodejsEXPOSE3000HEALTHCHECK--interval=30s--timeout=3s--start-period=5s--retries=3\CMDnodehealthcheck.js
CMD["node","dist/index.js"]
Best Practices Dockerfile
# 1. Utiliser des images de base officielles et spécifiquesFROMnode:18.17-alpine3.18# 2. Définir le working directoryWORKDIR/app# 3. Copier package.json en premier (cache layer)COPYpackage*.json./
# 4. Installer les dépendancesRUNnpmci--only=production&&\npmcacheclean--force
# 5. Copier le code sourceCOPY..
# 6. Utiliser un utilisateur non-rootRUNaddgroup-Sappgroup&&adduser-Sappuser-Gappgroup
USERappuser# 7. Exposer le portEXPOSE3000# 8. Health checkHEALTHCHECKCMDcurl--failhttp://localhost:3000/health||exit1# 9. CMD avec format exec (recommandé)CMD["node","server.js"]
9. Registry & Distribution
Docker Hub
# Logindockerlogin
dockerlogin-uusername-ppassword
# Tag pour Docker Hubdockertagmyapp:latestusername/myapp:latest
dockertagmyapp:latestusername/myapp:v1.0
# Push vers Docker Hubdockerpushusername/myapp:latest
dockerpushusername/myapp:v1.0
# Logoutdockerlogout
Registry Privé
# Lancer un registry localdockerrun-d-p5000:5000--nameregistryregistry:2
# Tag pour registry privédockertagmyapp:latestlocalhost:5000/myapp:latest
dockertagmyapp:latestregistry.example.com/myapp:latest
# Push vers registry privédockerpushlocalhost:5000/myapp:latest
dockerpushregistry.example.com/myapp:latest
# Pull depuis registry privédockerpulllocalhost:5000/myapp:latest
# Login vers registry privédockerloginregistry.example.com-uusername
10. Security & Best Practices
Sécurité
# Scanner une image pour les vulnérabilités (avec Docker Scout)dockerscoutcvesnginx:latest
dockerscoutcvesmyapp:latest
# Scan avec Trivytrivyimagenginx:latest
trivyimage--severityHIGH,CRITICALmyapp:latest
# Voir les capabilities d'un containerdockerinspect<container>|jq'.[0].HostConfig.CapAdd'# Limiter les ressourcesdockerrun-d\--memory="512m"\--memory-swap="1g"\--cpus="1.5"\--pids-limit=100\nginx
# Lancer en mode read-onlydockerrun-d--read-only--tmpfs/tmpnginx
# Utiliser user namespace remapping# Dans /etc/docker/daemon.json:# {# "userns-remap": "default"# }# Ne pas lancer en rootdockerrun-d--user1000:1000nginx
Best Practices
# 1. Toujours utiliser des tags spécifiques (pas :latest)dockerpullnginx:1.25.3-alpine
# 2. Minimiser les layers (combiner les RUN)# MAUVAIS:# RUN apt-get update# RUN apt-get install -y curl# RUN apt-get install -y vim# BON:# RUN apt-get update && apt-get install -y \# curl \# vim \# && rm -rf /var/lib/apt/lists/*# 3. Utiliser .dockerignorecat>.dockerignore<< EOFnode_modules.git.env*.logEOF# 4. Ne pas stocker de secrets dans les images# Utiliser docker secrets ou variables d'environnement au runtime# 5. Limiter les privilègesdockerrun-d--cap-drop=ALL--cap-add=NET_BIND_SERVICEnginx
# 6. Utiliser health checksdockerrun-d\--health-cmd="curl -f http://localhost/ || exit 1"\--health-interval=30s\--health-timeout=3s\--health-retries=3\nginx
11. Tips & Aliases
Aliases Utiles
# Ajouter dans ~/.bashrc ou ~/.zshrc# Docker shortcutsaliasd='docker'aliasdc='docker compose'aliasdps='docker ps'aliasdpsa='docker ps -a'aliasdi='docker images'aliasdex='docker exec -it'aliasdlogs='docker logs -f'# Cleanup aliasesaliasdclean='docker system prune -af'aliasdcleanv='docker system prune -af --volumes'aliasdrmi='docker rmi $(docker images -q)'aliasdrm='docker rm $(docker ps -aq)'# Quick runaliasdrun='docker run --rm -it'aliasdrunb='docker run --rm -it busybox'aliasdruna='docker run --rm -it alpine sh'# Statsaliasdstats='docker stats --no-stream'aliasdsystem='docker system df'
One-liners Utiles
# Stopper tous les containersdockerstop$(dockerps-q)# Supprimer tous les containersdockerrm$(dockerps-aq)# Supprimer toutes les imagesdockerrmi$(dockerimages-q)# Supprimer images danglingdockerrmi$(dockerimages-f"dangling=true"-q)# Logs de tous les containersdockerps-q|xargs-L1dockerlogs
# Obtenir l'IP d'un containerdockerinspect-f'{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}'<container>
# Voir les ports mappésdockerinspect-f'{{range $p, $conf := .NetworkSettings.Ports}}{{$p}} -> {{(index $conf 0).HostPort}}{{end}}'<container>
# Exec bash dans tous les containers actifsdockerps-q|xargs-I{}dockerexec-it{}bash
# Copier un fichier vers tous les containers d'une imagedockerps-q--filterancestor=nginx|xargs-I{}dockercpconfig.yaml{}:/etc/nginx/