C.1 · Construire et distribuer des images
Docker au quotidien : run, exec, logs, volumes, réseaux
Leçon théorique · questionnaire de validation · gratuit, dans le navigateur
La leçon 0.3 a expliqué ce qu'est un conteneur (namespaces, cgroups, images). Celle-ci est le mode d'emploi de Docker, l'outil qui a popularisé les conteneurs et qu'on trouve sur la plupart des postes de développeurs et des serveurs de CI. Elle est théorique : votre machine de lab n'a pas de moteur de conteneurs. Les mêmes commandes fonctionnent avec Podman (leçon C.3).
Ce que vous saurez à la fin : lancer, observer et arrêter des conteneurs, entrer dedans, lire leurs journaux, garder des données avec des volumes, faire communiquer des conteneurs sur un réseau, et décrire une petite application avec Docker Compose.
1. Le cycle de vie d'un conteneur
docker run -d --name web -p 8080:80 nginx:1.27-alpine # -d : en arrière-plan ; -p : port de la machine → port du conteneur
docker ps # les conteneurs en cours ; docker ps -a : tous, y compris arrêtés
docker stop web # arrêt propre (signal TERM, puis KILL après 10 s)
docker start web
docker rm web # supprime (docker rm -f : même s'il tourne)
docker run --rm -it ubuntu:24.04 bash # conteneur jetable et interactif, supprimé à la sortie
Un conteneur arrêté existe encore (avec ses fichiers modifiés) jusqu'à docker rm. Une image est le modèle en lecture seule ; un conteneur en est une instance.
2. Observer et entrer
docker logs -f web # la sortie du processus principal, en direct
docker exec -it web sh # un shell dans le conteneur qui tourne
docker inspect web # toute la configuration, en JSON
docker stats # CPU et mémoire en direct
docker top web # les processus du conteneur
3. Garder des données : les volumes
Le système de fichiers d'un conteneur disparaît avec lui. Pour garder des données :
docker volume create donnees
docker run -d --name base -v donnees:/var/lib/postgresql/data -e POSTGRES_PASSWORD=… postgres:17 # volume nommé, géré par Docker
docker run -d -v "$PWD/site":/usr/share/nginx/html:ro -p 8080:80 nginx:1.27-alpine # montage d'un dossier de la machine, en lecture seule
C'est la même idée que les volumes de Kubernetes (leçon 2.7).
4. Réseaux
docker network create appli
docker run -d --name base --network appli … postgres:17
docker run -d --name api --network appli -e DB_HOST=base … mon-api:1.0
Sur un réseau créé par l'utilisateur, les conteneurs se joignent par leur nom (DNS intégré) : api contacte base. Seuls les ports publiés avec -p sont accessibles depuis l'extérieur de la machine.
5. Plusieurs conteneurs : Docker Compose
# compose.yaml
services:
base:
image: postgres:17
environment: {POSTGRES_PASSWORD: exemple}
volumes: [donnees:/var/lib/postgresql/data]
api:
image: mon-api:1.0
environment: {DB_HOST: base}
ports: ["8080:8080"]
depends_on: [base]
volumes:
donnees:
docker compose up -d
docker compose logs -f api
docker compose down # down -v supprime aussi les volumes
Compose est parfait sur un poste ou un petit serveur. Au-delà d'une machine (haute disponibilité, mise à l'échelle, mises à jour sans coupure), c'est le rôle de Kubernetes.
6. Faire le ménage
docker system df # place occupée par les images, conteneurs, volumes
docker image prune -a # supprime les images inutilisées
docker system prune # conteneurs arrêtés, réseaux et caches inutilisés
7. Une question de sécurité
Le démon Docker tourne en root, et quiconque peut lui parler (membre du groupe docker, ou accès à /var/run/docker.sock) a, en pratique, les droits root sur la machine : docker run -v /:/hote … monte tout le disque. Ne montez jamais la socket Docker dans un conteneur sans en mesurer les conséquences. C'est l'une des raisons d'être de Podman, sans démon et sans root (leçon C.3).
Validez la leçon avec le questionnaire.