Conteneurs Docker
Objectifs du chapitre
- Créer et exécuter des conteneurs
- Gérer le cycle de vie des conteneurs
- Interagir avec les conteneurs en cours d'exécution
- Comprendre les options de configuration
1 - Créer et exécuter un conteneur
La commande docker run
# Syntaxe de base
docker run [OPTIONS] IMAGE [COMMANDE] [ARGUMENTS]
# Exemple simple
docker run nginx
# Avec un nom personnalisé
docker run --name mon-nginx nginx
Options courantes
| Option | Description | Exemple |
|---|---|---|
-d | Mode détaché (arrière-plan) | docker run -d nginx |
-it | Mode interactif + TTY | docker run -it ubuntu bash |
--name | Nom du conteneur | docker run --name web nginx |
-p | Mappage de ports | docker run -p 8080:80 nginx |
-v | Montage de volumes | docker run -v /data:/app nginx |
-e | Variable d'environnement | docker run -e DB=mysql nginx |
--rm | Supprimer après arrêt | docker run --rm nginx |
Exemples pratiques
# Conteneur en arrière-plan avec port mappé
docker run -d -p 8080:80 --name webserver nginx
# Conteneur interactif Ubuntu
docker run -it ubuntu bash
# Conteneur avec variable d'environnement
docker run -d -e MYSQL_ROOT_PASSWORD=secret mysql:8
# Conteneur temporaire (supprimé après exécution)
docker run --rm alpine echo "Hello!"
# Conteneur avec plusieurs options
docker run -d \
--name app \
-p 3000:3000 \
-e NODE_ENV=production \
-v $(pwd)/data:/app/data \
node:18-alpine
2 - Modes d'exécution
Mode attaché (foreground)
# Le terminal est attaché au conteneur
docker run nginx
# Sortie visible dans le terminal
# Ctrl+C pour arrêter
Mode détaché (background)
# Le conteneur s'exécute en arrière-plan
docker run -d nginx
# Retourne l'ID du conteneur
# a1b2c3d4e5f6...
Mode interactif
# -i : Keep STDIN open
# -t : Allocate pseudo-TTY
docker run -it ubuntu bash
# Dans le conteneur
root@abc123:/# ls
root@abc123:/# exit
Combinaisons courantes
# Interactif + Détaché (démarre, puis on peut s'y attacher)
docker run -dit --name dev ubuntu
# Attacher plus tard
docker attach dev
# Détacher sans arrêter : Ctrl+P, Ctrl+Q
3 - Lister les conteneurs
Conteneurs en cours d'exécution
# Lister les conteneurs actifs
docker ps
# Sortie
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES
a1b2c3d4e5f6 nginx "nginx..." Up 5 minutes 0.0.0.0:8080->80/tcp web
Tous les conteneurs
# Inclure les conteneurs arrêtés
docker ps -a
# Afficher uniquement les IDs
docker ps -q
# Dernier conteneur créé
docker ps -l
# Filtrer par statut
docker ps -f status=running
docker ps -f status=exited
# Format personnalisé
docker ps --format "{{.ID}}: {{.Names}} ({{.Status}})"
Colonnes du tableau
| Colonne | Description |
|---|---|
| CONTAINER ID | Identifiant unique (12 premiers caractères) |
| IMAGE | Image source |
| COMMAND | Commande d'entrée |
| CREATED | Date de création |
| STATUS | État actuel |
| PORTS | Mappages de ports |
| NAMES | Nom du conteneur |
4 - Cycle de vie des conteneurs
États d'un conteneur
docker create
│
▼
┌─────────────────────────────────────┐
│ CREATED │
└──────────────────┬──────────────────┘
│ docker start
▼
┌─────────────────────────────────────┐
│ RUNNING │◄──────────────┐
└──────────────────┬──────────────────┘ │
│ │
docker stop│ docker restart│
▼ │
┌─────────────────────────────────────┐ │
│ STOPPED │───────────────┘
└─────────────────────────────────────┘
Commandes de cycle de vie
# Créer sans démarrer
docker create --name mon-conteneur nginx
# Démarrer un conteneur
docker start mon-conteneur
# Arrêter gracieusement (SIGTERM)
docker stop mon-conteneur
# Arrêter de force (SIGKILL)
docker kill mon-conteneur
# Redémarrer
docker restart mon-conteneur
# Mettre en pause
docker pause mon-conteneur
docker unpause mon-conteneur
# Supprimer un conteneur arrêté
docker rm mon-conteneur
# Forcer la suppression d'un conteneur actif
docker rm -f mon-conteneur
Nettoyage
# Supprimer tous les conteneurs arrêtés
docker container prune
# Supprimer tous les conteneurs (actifs inclus)
docker rm -f $(docker ps -aq)
5 - Interagir avec les conteneurs
Exécuter des commandes (exec)
# Exécuter une commande dans un conteneur actif
docker exec mon-conteneur ls -la
# Ouvrir un shell interactif
docker exec -it mon-conteneur bash
docker exec -it mon-conteneur sh # Pour Alpine
# Exécuter en tant qu'utilisateur spécifique
docker exec -u root mon-conteneur whoami
# Définir des variables d'environnement
docker exec -e VAR=value mon-conteneur env
Voir les logs
# Tous les logs
docker logs mon-conteneur
# Suivre les logs en temps réel
docker logs -f mon-conteneur
# Dernières lignes
docker logs --tail 100 mon-conteneur
# Avec timestamps
docker logs -t mon-conteneur
# Depuis une date
docker logs --since 2024-01-01 mon-conteneur
docker logs --since 10m mon-conteneur
Copier des fichiers
# Du conteneur vers l'hôte
docker cp mon-conteneur:/etc/nginx/nginx.conf ./nginx.conf
# De l'hôte vers le conteneur
docker cp ./index.html mon-conteneur:/usr/share/nginx/html/
# Copier un dossier
docker cp ./config mon-conteneur:/app/config
Attacher au conteneur
# S'attacher à un conteneur en cours
docker attach mon-conteneur
# Détacher sans arrêter : Ctrl+P puis Ctrl+Q
6 - Mappage de ports
Syntaxe du mappage
# Format
-p [IP_HOTE:]PORT_HOTE:PORT_CONTENEUR[/PROTOCOLE]
# Exemples
-p 8080:80 # Localhost:8080 -> Conteneur:80
-p 80:80 # Port identique
-p 127.0.0.1:80:80 # Uniquement localhost
-p 8080:80/udp # UDP au lieu de TCP
Exemples pratiques
# Mapper un seul port
docker run -d -p 8080:80 nginx
# Mapper plusieurs ports
docker run -d -p 80:80 -p 443:443 nginx
# Port aléatoire sur l'hôte
docker run -d -P nginx # Utilise les ports EXPOSE
# Voir les ports mappés
docker port mon-conteneur
# 80/tcp -> 0.0.0.0:8080
Vérifier les ports
# Ports d'un conteneur
docker port webserver
# Dans docker ps
docker ps --format "{{.Names}}: {{.Ports}}"
7 - Variables d'environnement
Définir des variables
# Une variable
docker run -e DATABASE_URL=postgres://... mon-app
# Plusieurs variables
docker run \
-e DB_HOST=localhost \
-e DB_PORT=5432 \
-e DB_NAME=mydb \
mon-app
# Depuis un fichier
docker run --env-file .env mon-app
Fichier .env
# .env
DB_HOST=localhost
DB_PORT=5432
DB_USER=admin
DB_PASSWORD=secret
NODE_ENV=production
Vérifier les variables
# Voir les variables d'un conteneur
docker exec mon-conteneur env
# Variable spécifique
docker exec mon-conteneur printenv DB_HOST
8 - Limiter les ressources
Limites CPU
# Limiter à 0.5 CPU
docker run --cpus="0.5" mon-app
# Limiter aux CPUs spécifiques
docker run --cpuset-cpus="0,1" mon-app
# Poids CPU (partage relatif)
docker run --cpu-shares=512 mon-app
Limites mémoire
# Limiter la mémoire RAM
docker run -m 512m mon-app
docker run --memory=1g mon-app
# Limiter la mémoire swap
docker run -m 512m --memory-swap=1g mon-app
# Désactiver le swap
docker run -m 512m --memory-swap=512m mon-app
Vérifier l'utilisation
# Statistiques en temps réel
docker stats
# Statistiques d'un conteneur
docker stats mon-conteneur
# Format personnalisé
docker stats --format "{{.Name}}: CPU {{.CPUPerc}} MEM {{.MemUsage}}"
9 - Inspecter les conteneurs
Informations détaillées
# Toutes les informations
docker inspect mon-conteneur
# Informations spécifiques
docker inspect -f '{{.State.Status}}' mon-conteneur
docker inspect -f '{{.NetworkSettings.IPAddress}}' mon-conteneur
docker inspect -f '{{json .Config.Env}}' mon-conteneur
Informations courantes
# Adresse IP du conteneur
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mon-conteneur
# Variables d'environnement
docker inspect -f '{{range .Config.Env}}{{println .}}{{end}}' mon-conteneur
# Volumes montés
docker inspect -f '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{println}}{{end}}' mon-conteneur
Différences avec l'image
# Voir les modifications du système de fichiers
docker diff mon-conteneur
# A = Added (ajouté)
# C = Changed (modifié)
# D = Deleted (supprimé)
10 - Créer une image depuis un conteneur
Commande commit
# Créer une image depuis un conteneur modifié
docker commit mon-conteneur mon-image:v1
# Avec message et auteur
docker commit -m "Ajout de configs" -a "John Doe" mon-conteneur mon-image:v1
# Avec changements de configuration
docker commit --change='CMD ["nginx", "-g", "daemon off;"]' mon-conteneur mon-image:v1
Attention
Préférez les Dockerfiles pour créer des images. docker commit est utile pour le debug mais pas pour la production.
Résumé des commandes
| Commande | Description |
|---|---|
docker run | Créer et démarrer un conteneur |
docker ps | Lister les conteneurs |
docker start/stop | Démarrer/Arrêter |
docker restart | Redémarrer |
docker rm | Supprimer |
docker exec | Exécuter une commande |
docker logs | Voir les logs |
docker cp | Copier des fichiers |
docker inspect | Informations détaillées |
docker stats | Statistiques |
Points clés
-dpour l'arrière-plan,-itpour l'interactif-pmappe les ports,-edéfinit les variablesdocker exec -itpour accéder au shell- Limitez les ressources en production
Exercices pratiques
- Lancez un conteneur nginx accessible sur le port 8080
- Exécutez une commande
lsdans un conteneur en cours - Copiez un fichier depuis un conteneur vers votre machine
- Limitez un conteneur à 256 Mo de RAM et vérifiez avec
docker stats