Avant de commencer
- Docker installé (voir installer Docker sur Debian ou Ubuntu)
En clair
Une image, c'est un modèle figé, comme un plat surgelé : tout est déjà préparé à l'intérieur. Un conteneur, c'est ce plat une fois réchauffé et servi : une instance qui tourne, qu'on peut arrêter, relancer ou jeter, et dont on peut servir autant d'exemplaires qu'on veut à partir du même modèle. Les volumes sont les boîtes de conservation à part : ce qu'on y range survit quand on jette le conteneur. Retenez ce dernier point : tout ce qui est écrit dans un conteneur sans volume disparaît avec lui.
Dans les exemples, sudo est omis : il est nécessaire si votre compte n'appartient pas au groupe docker (voir installer Docker).
1. Le vocabulaire
| Terme | Définition |
|---|---|
| Image | Modèle en lecture seule : système minimal, application, dépendances. Exemple : nginx:stable-alpine |
| Conteneur | Une instance en cours d'exécution (ou arrêtée) d'une image |
| Tag | La version d'une image, après les deux-points : debian:13, postgres:17. Sans tag, Docker prend latest |
| Registre | Le serveur qui stocke les images : Docker Hub (par défaut), GitHub (ghcr.io), Quay, ou un registre privé |
| Volume | Espace de stockage géré par Docker, qui survit à la suppression du conteneur |
| Montage de dossier (bind mount) | Un dossier de l'hôte monté dans le conteneur |
| Réseau | Réseau virtuel qui relie les conteneurs entre eux |
| Dockerfile | Le fichier « recette » qui sert à construire une image |
2. Lancer un conteneur : docker run
docker run -d --name web \
--restart unless-stopped \
-p 127.0.0.1:8080:80 \
-v web-data:/usr/share/nginx/html \
nginx:stable-alpine
| Option | Rôle |
|---|---|
-d |
En arrière-plan (detached) ; sans elle, le conteneur occupe le terminal |
--name web |
Donne un nom ; sinon Docker en invente un |
--restart unless-stopped |
Redémarre le conteneur après un plantage ou un redémarrage du serveur |
-p 127.0.0.1:8080:80 |
Publie le port 80 du conteneur sur le port 8080 de l'hôte, ici uniquement en local |
-v web-data:/usr/share/nginx/html |
Monte le volume web-data dans le conteneur |
-e CLE=valeur |
Définit une variable d'environnement (configuration de l'application) |
--rm |
Supprime le conteneur dès qu'il s'arrête (tests, commandes ponctuelles) |
-it |
Mode interactif avec un terminal (pour un shell) |
-p 8080:80 publie sur toutes les interfaces
Sans adresse devant, le port est ouvert sur toutes les interfaces du serveur, en contournant ufw. Précisez 127.0.0.1: (accès local, derrière un reverse proxy) ou l'adresse du réseau local. Voir installer Docker, partie pare-feu.
Les politiques de redémarrage
| Politique | Comportement |
|---|---|
no (par défaut) |
Jamais de redémarrage automatique |
on-failure |
Seulement si le conteneur s'arrête en erreur |
always |
Toujours, même après un arrêt manuel, dès que le service Docker redémarre |
unless-stopped |
Toujours, sauf si vous l'avez arrêté vous-même : le choix le plus courant |
Tester une image sans rien laisser derrière
docker run --rm -it debian:13 bash
Vous obtenez un shell dans une Debian 13 toute neuve ; en tapant exit, le conteneur est supprimé.
3. Gérer les conteneurs
| Commande | Effet |
|---|---|
docker ps |
Conteneurs en cours d'exécution |
docker ps -a |
Tous les conteneurs, y compris arrêtés |
docker stop web |
Arrête proprement (signal d'arrêt, puis arrêt forcé après 10 secondes) |
docker start web |
Redémarre un conteneur arrêté |
docker restart web |
Arrête puis redémarre |
docker rm web |
Supprime un conteneur arrêté (-f pour le forcer s'il tourne) |
docker rename web site |
Renomme |
docker update --restart unless-stopped web |
Change la politique de redémarrage d'un conteneur existant |
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f2a9c1e7b44 nginx:stable-alpine "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 127.0.0.1:8080->80/tcp web
4. Observer et dépanner
| Commande | Effet |
|---|---|
docker logs web |
Journaux du conteneur |
docker logs -f --tail 50 web |
Les 50 dernières lignes, puis la suite en direct (Ctrl+C pour quitter) |
docker logs --since 1h web |
Les journaux de la dernière heure |
docker exec -it web sh |
Ouvre un shell dans le conteneur en cours (bash si l'image le contient) |
docker exec web cat /etc/nginx/nginx.conf |
Lance une seule commande dans le conteneur |
docker inspect web |
Toute la configuration en JSON : adresses IP, montages, variables |
docker stats |
Consommation processeur, mémoire, réseau et disque, en direct |
docker top web |
Processus qui tournent dans le conteneur |
docker cp web:/etc/nginx/nginx.conf ./ |
Copie un fichier du conteneur vers l'hôte (ou l'inverse) |
docker port web |
Ports publiés |
Extraire une information précise d'inspect :
docker inspect -f '{{.State.Status}} {{.RestartCount}}' web
running 0
Un RestartCount qui augmente signale un conteneur qui plante en boucle : regardez docker logs.
5. Les images
| Commande | Effet |
|---|---|
docker pull nginx:stable-alpine |
Télécharge une image |
docker images |
Images présentes sur la machine |
docker rmi nginx:stable-alpine |
Supprime une image (si aucun conteneur ne l'utilise) |
docker image prune |
Supprime les images « orphelines » (sans tag) |
docker image prune -a |
Supprime toutes les images non utilisées par un conteneur |
docker image history nginx:stable-alpine |
Couches qui composent l'image |
Choisir ses images
Préférez les images officielles (badge Docker Official Image sur Docker Hub) ou celles publiées par l'éditeur du logiciel. Fixez la version (postgres:17 plutôt que postgres:latest) pour éviter qu'une mise à jour majeure arrive sans prévenir. Pour vérifier les vulnérabilités connues d'une image, l'outil libre Trivy s'utilise en une commande : trivy image nginx:stable-alpine.
6. Les volumes et les montages
| Volume nommé | Montage de dossier (bind mount) | |
|---|---|---|
| Syntaxe | -v web-data:/chemin |
-v /srv/web:/chemin (chemin absolu) |
| Emplacement | Géré par Docker (/var/lib/docker/volumes/) |
Un dossier de votre choix sur l'hôte |
| Usage idéal | Bases de données, données d'application | Fichiers de configuration, contenus à éditer depuis l'hôte |
| Droits | Gérés par Docker | Attention aux propriétaires et permissions des fichiers |
| Commande | Effet |
|---|---|
docker volume ls |
Liste les volumes |
docker volume inspect web-data |
Détails, dont l'emplacement sur le disque |
docker volume create web-data |
Crée un volume |
docker volume rm web-data |
Supprime un volume (et ses données) |
docker volume prune |
Supprime les volumes anonymes non utilisés (-a : aussi les volumes nommés non utilisés) |
Ajouter :ro rend le montage en lecture seule dans le conteneur, ce qui est recommandé pour la configuration : -v /srv/web/nginx.conf:/etc/nginx/nginx.conf:ro.
Sauvegarder et restaurer un volume
Sauvegarde du volume web-data dans une archive du dossier courant :
docker run --rm -v web-data:/data:ro -v "$PWD":/sauvegarde \
debian:13 tar czf /sauvegarde/web-data.tar.gz -C /data .
Restauration dans un volume (vide ou nouveau) :
docker run --rm -v web-data:/data -v "$PWD":/sauvegarde \
debian:13 tar xzf /sauvegarde/web-data.tar.gz -C /data
Pour une base de données, arrêtez le conteneur avant, ou utilisez l'outil de sauvegarde de la base (pg_dump, mysqldump) : copier les fichiers d'une base en cours d'écriture donne une sauvegarde incohérente.
7. Les réseaux
| Commande | Effet |
|---|---|
docker network ls |
Liste les réseaux |
docker network create mon-reseau |
Crée un réseau |
docker run --network mon-reseau … |
Lance un conteneur dans ce réseau |
docker network connect mon-reseau web |
Ajoute un conteneur existant à un réseau |
docker network inspect mon-reseau |
Conteneurs connectés et adresses |
Dans un réseau créé par vous (ou par Compose), les conteneurs se joignent par leur nom : l'application contacte la base à l'adresse db:5432, sans publier de port sur l'hôte. Le réseau bridge par défaut, lui, ne fournit pas cette résolution de noms.
8. Faire le ménage
| Commande | Ce qu'elle supprime |
|---|---|
docker system df |
Rien : affiche l'espace occupé par images, conteneurs, volumes et cache |
docker container prune |
Les conteneurs arrêtés |
docker image prune -a |
Les images non utilisées |
docker builder prune |
Le cache de construction |
docker system prune |
Conteneurs arrêtés, réseaux inutilisés, images orphelines, cache |
docker volume prune -a
Par défaut, docker volume prune (et docker system prune --volumes) ne supprime que les volumes anonymes inutilisés. Avec -a, il supprime aussi les volumes nommés qui ne sont rattachés à aucun conteneur : si vous avez supprimé un conteneur en comptant le recréer plus tard, ses données partent avec. Vérifiez avec docker volume ls avant.
9. Construire sa première image
Un Dockerfile minimal qui sert une page web statique :
FROM nginx:stable-alpine
COPY site/ /usr/share/nginx/html/
EXPOSE 80
Construire, puis lancer :
docker build -t mon-site:1.0 .
docker run -d --name mon-site -p 127.0.0.1:8081:80 mon-site:1.0
| Instruction | Rôle |
|---|---|
FROM |
L'image de départ |
RUN |
Une commande exécutée pendant la construction (installer un paquet) |
COPY |
Copie des fichiers du projet dans l'image |
WORKDIR |
Le dossier de travail |
ENV |
Une variable d'environnement |
EXPOSE |
Documente le port utilisé (ne publie rien) |
USER |
L'utilisateur qui exécute l'application ; évitez root quand c'est possible |
CMD / ENTRYPOINT |
La commande lancée au démarrage du conteneur |
Ajoutez un fichier .dockerignore pour exclure du contexte de construction ce qui n'a rien à faire dans l'image (.git, fichiers .env, sauvegardes).
10. Antisèche
| Je veux… | Commande |
|---|---|
| Voir ce qui tourne | docker ps |
| Lire les journaux en direct | docker logs -f --tail 50 nom |
| Entrer dans un conteneur | docker exec -it nom sh |
| Redémarrer un service | docker restart nom |
| Mettre à jour une image | docker pull image:tag, puis recréer le conteneur |
| Voir la consommation | docker stats |
| Savoir ce qui occupe le disque | docker system df |
| Tester une image en jetable | docker run --rm -it image sh |
Dès que vous avez plus d'un conteneur, ou des options longues à retenir, passez à Docker Compose : la configuration est écrite dans un fichier et se relance en une commande.
À retenir
- Image = modèle, conteneur = instance, volume = données qui survivent au conteneur.
docker run -d --name … --restart unless-stopped -p 127.0.0.1:port:port -v volume:/chemin image:tag: le modèle de base.docker ps,docker logs -f,docker exec -it … sh,docker statspour suivre et dépanner.- Fixez les versions des images, préférez les images officielles, analysez-les avec Trivy.
- Sauvegardez les volumes, et méfiez-vous de
docker volume prune -a.