kubenow
Se connecterCommencer gratuitement

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.

Contenu aligné sur les programmes publiés par la CNCF (KCNA, CKAD, CKA, CKS), par le Linux Professional Institute (LPIC-1) et par Cisco (CCNA 200-301). KubeNow n'est ni affilié ni approuvé par la CNCF, la Linux Foundation, le LPI ou Cisco ; CKA, CKAD, CKS et KCNA sont des marques de la Linux Foundation, LPIC-1 est une marque du Linux Professional Institute, Cisco et CCNA sont des marques de Cisco Systems.