Une pièce vide. Un miroir sans tain. Le conteneur est la cellule. Toi, tu es le gardien. Tu le crées, tu le fais parler, tu le supprimes. Rien ne dure. Tout est éphémère. Comme un témoin qui disparaît après avoir parlé.
2.1 Cycle de Vie d'un Conteneur – La Courte Vie d'une Ombre
Un conteneur ne naît pas, il est instancié.
Il ne meurt pas, il est terminé.
Entre les deux, une existence brève. Prévisible. Contrôlée.
Les 5 États – Les 5 Visages d'un Prisonnier
-
Créé (
created)
Le dossier est ouvert. Le nom est écrit.
Mais personne n'est encore dans la cellule.
docker create– Tu prépares la chambre. -
En cours d'exécution (
running)
Le processus respire. Le coeur bat.
Le PID 1 fait son travail.
C'est là qu'il sert. Ou qu'il avoue. -
En pause (
paused)
Le temps s'arrête. Les processus sont gelés.
Comme une balle au ralenti.
docker pause– Tu mets le monde en suspens. -
Arrêté (
exited)
Le processus est mort. Le corps est encore là.
Les fichiers sont intacts. La cellule est fermée.
docker stop– Tu fermes la porte. Doucement. -
Supprimé (
dead)
Plus de trace. Le conteneur n'a jamais existé.
Seule l'image reste. Le fantôme du fantôme.
docker rm– Tu brûles le dossier.
Les Commandes – Les Gestes du Gardien
# Créer sans démarrer. Comme charger un revolver.
docker create --name suspect nginx:alpine
# Démarrer. Appuyer sur la gâchette.
docker start suspect
# Créer et démarrer d'un coup. La méthode rapide.
docker run --name temoin -d nginx:alpine
# Arrêt gracieux. On frappe à la porte d'abord.
docker stop temoin
# SIGTERM (poliment), puis SIGKILL (sinon)
# Arrêt immédiat. On enfonce la porte.
docker kill temoin
# SIGKILL direct. Pas de discussion.
# Suspendre. Mettre en pause la cassette.
docker pause suspect
docker unpause suspect
# Supprimer. Faire disparaître les preuves.
docker rm suspect
# -f pour forcer si le conteneur tourne encore
La règle : docker run = docker create + docker start
2.2 Options de Configuration – Les Menottes et les Cachots
Un conteneur nu est inutile.
Il faut le configurer. Lui donner des limites.
Des portes d'entrée. Des fenêtres de sortie.
Configuration Réseau – Les Portes de la Ville
# Exposer un port. Ouvrir une fenêtre sur l'extérieur.
docker run -p 8080:80 nginx
# L'hôte écoute 8080, le conteneur écoute 80.
# Plusieurs ports. Plusieurs fenêtres.
docker run -p 8080:80 -p 8443:443 nginx
# Port dynamique. La ville choisit le numéro.
docker run -p 80 nginx
# docker port CONTAINER pour savoir où
# Réseau personnalisé. Un quartier isolé.
docker network create quartier_noir
docker run --network=quartier_noir nginx
Gestion des Volumes – Les Caves et les Archives
Volumes liés (bind mounts) – Une porte directe vers ton système.
# Lier un dossier. La cave est partagée.
docker run -v /chemin/local:/chemin/conteneur nginx
# Syntaxe moderne (plus explicite)
docker run --mount type=bind,source=/chemin/local,target=/chemin/conteneur nginx
# Lecture seule. Tu regardes, tu ne touches pas.
docker run -v /chemin/local:/chemin/conteneur:ro nginx
Volumes nommés – Des caves anonymes mais gérées par Docker.
# Créer un volume
docker volume create ma_cave
# L'utiliser
docker run -v ma_cave:/data nginx
# Les volumes survivent aux conteneurs.
# Les données persistent.
Volumes temporaires (tmpfs) – La mémoire vive. Disparaît à l'arrêt.
# Stocker en RAM. Rapide. Éphémère.
docker run --tmpfs /chemin nginx
Contrôle des Ressources – Les Menottes Électroniques
Mémoire – Lui donner un budget. Pas un octet de plus.
# Limite mémoire (512 Mo max)
docker run -m 512m nginx
# Mémoire + swap (1 Go total)
docker run -m 512m --memory-swap 1g nginx
# Pas de swap
docker run -m 512m --memory-swap 512m nginx
# OOM killer activé. S'il dépasse, il meurt.
CPU – Limiter son temps de parole.
# 1.5 CPU (un cœur et demi)
docker run --cpus="1.5" nginx
# Utiliser seulement les CPU 0 et 1
docker run --cpuset-cpus="0,1" nginx
# Une plage de CPU
docker run --cpuset-cpus="0-3" nginx
# Poids CPU (priorité relative)
docker run --cpu-shares=512 nginx
# Défaut : 1024
I/O disque – Limiter sa fouille dans les archives.
# Limite lecture/écriture (bytes par seconde)
docker run --device-read-bps /dev/sda:1mb nginx
docker run --device-write-iops /dev/sda:100 nginx
Variables d'Environnement – Les Instructions Chuchotées
# Une variable
docker run -e SECRET_KEY=azerty123 nginx
# Plusieurs variables
docker run -e KEY1=val1 -e KEY2=val2 nginx
# Depuis un fichier (les instructions écrites)
docker run --env-file .env nginx
# Exemple .env :
# DB_HOST=localhost
# DB_PORT=5432
# DEBUG=false
# Variables de l'hôte (passer le relais)
docker run -e HOSTNAME nginx
# Prend la valeur de $HOSTNAME du shell
Autres Options Utiles – Les Détails qui Comptent
# Nommer le conteneur (sinon nom aléatoire)
docker run --name mon_conteneur nginx
# Mode interactif (pour les interrogatoires)
docker run -it ubuntu /bin/bash
# -i = interactif (stdin ouvert)
# -t = pseudo-TTY (terminal)
# Détaché (tourne en arrière-plan)
docker run -d nginx
# Redémarrer automatiquement
docker run --restart always nginx
# no (défaut), on-failure, unless-stopped, always
# Supprimer automatiquement à l'arrêt
docker run --rm nginx
# Pour les tests. Les jobs ponctuels.
# Lier des conteneurs (vieille méthode, dépréciée)
docker run --link vieux_conteneur:alias nginx
# Utilisez les réseaux à la place.
2.3 Inspection et Surveillance – Le Miroir sans Tain
Un conteneur qui tourne, c'est une boîte noire.
Il faut des outils pour voir à l'intérieur.
Sans ouvrir la porte.
docker inspect – La Fiche Signalétique Complète
# Tout voir (format JSON)
docker inspect CONTAINER
# Filtrer avec jq (puissant)
docker inspect CONTAINER | jq '.[0].NetworkSettings.IPAddress'
# Champs spécifiques (Go template)
docker inspect -f '{{.NetworkSettings.IPAddress}}' CONTAINER
docker inspect -f '{{.State.Status}}' CONTAINER
docker inspect -f '{{json .Config}}' CONTAINER
docker logs – Le Journal des Aveux
# Voir les logs
docker logs CONTAINER
# Suivre en temps réel (comme tail -f)
docker logs -f CONTAINER
# Dernières lignes
docker logs --tail 50 CONTAINER
# Avec timestamps
docker logs -t CONTAINER
# Depuis un temps donné
docker logs --since 2024-03-15 CONTAINER
docker logs --since 2h CONTAINER
docker stats – Les Signes Vitaux
# Statistiques en temps réel
docker stats
# Pour un conteneur spécifique
docker stats CONTAINER
# Sortie propre (sans streaming)
docker stats --no-stream
# Exemple de sortie :
# CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
# abc123def456 nginx 0.05% 5.223MiB / 1GiB 0.51% 1.2kB / 0B 0B / 0B 3
docker top – Les Processus dans la Cellule
# Voir les processus (comme ps)
docker top CONTAINER
# Avec plus d'infos
docker top CONTAINER aux
# Afficher les PID hôte
docker top CONTAINER -eo pid,args
docker diff – Ce qui a Changé depuis l'Arrivée
# Voir les modifications du système de fichiers
docker diff CONTAINER
# Codes :
# A = Added (ajouté)
# C = Changed (modifié)
# D = Deleted (supprimé)
# Exemple :
# A /root/.bash_history # Fichier ajouté
# C /var/log/nginx/access.log # Fichier modifié
# D /tmp/old_file # Fichier supprimé
docker exec – Entrer dans la Cellule
# Exécuter une commande dans un conteneur qui tourne
docker exec CONTAINER ls -la /
# Mode interactif (comme ssh)
docker exec -it CONTAINER /bin/bash
# Avec variables d'environnement
docker exec -e VAR=valeur CONTAINER commande
# En tant qu'utilisateur spécifique
docker exec -u utilisateur CONTAINER commande
# Garder stdin ouvert même détaché
docker exec -i CONTAINER sh -c 'cat > /tmp/file'
docker cp – Faire Passer un Message
# Copier du conteneur vers l'hôte
docker cp CONTAINER:/chemin/fichier ./local
# Copier de l'hôte vers le conteneur
docker cp ./local/fichier CONTAINER:/chemin/
# Copier un dossier
docker cp CONTAINER:/dossier ./local/
# Avec un flux (avancé)
tar -cvf - fichier | docker cp - CONTAINER:/chemin/
Scène Finale – Un Interrogatoire Complet
# 1. Préparer la salle (créer un réseau)
docker network create interrogation_room
# 2. Faire entrer le suspect (avec limites)
docker run -d \
--name suspect \
--network interrogation_room \
-m 256m \
--cpus="0.5" \
-e CONFESSION_PATH=/tmp/confession.txt \
-v ./evidence:/evidence:ro \
--rm \
alpine tail -f /dev/null
# 3. L'inspecter discrètement
docker inspect suspect | jq '.[0].NetworkSettings.Networks.interrogation_room.IPAddress'
# 4. Lui faire écrire une confession
docker exec suspect sh -c 'echo "J\'étais là ce soir-là." > /tmp/confession.txt'
# 5. Surveiller ses faits et gestes
docker stats suspect --no-stream
docker logs suspect
# 6. Voir ce qu'il a touché
docker diff suspect
# 7. Récupérer la confession
docker cp suspect:/tmp/confession.txt ./confession_obtenue.txt
# 8. Nettoyer (--rm s'en est déjà chargé)
# La pièce est vide. Comme si rien ne s'était passé.
Conclusion du Module
Un conteneur est une bulle.
Éphémère. Contrôlable. Observable.
Tu le crées, tu le configures, tu le regardes, tu le supprimes.
Les règles de l'interrogatoire :
- Toujours nommer tes conteneurs. Les numéros aléatoires, c'est pour les prisons.
- Limiter les ressources. Un conteneur sans limite est un danger.
- Utiliser les volumes pour les données qui doivent survivre.
--rmpour les tests. Ne laisse pas de cadavres.- Inspecter avant d'agir. Connais ton prisonnier.
La ville des conteneurs est peuplée d'ombres qui naissent et meurent en silence.
Toi, tu es celui qui allume et éteint la lumière.
Prochain module : les images.
Les moules. Les archétypes.
Ce qui reste quand tous les conteneurs sont partis.