Aller au contenu principal

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

OptionDescriptionExemple
-dMode détaché (arrière-plan)docker run -d nginx
-itMode interactif + TTYdocker run -it ubuntu bash
--nameNom du conteneurdocker run --name web nginx
-pMappage de portsdocker run -p 8080:80 nginx
-vMontage de volumesdocker run -v /data:/app nginx
-eVariable d'environnementdocker run -e DB=mysql nginx
--rmSupprimer après arrêtdocker 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

ColonneDescription
CONTAINER IDIdentifiant unique (12 premiers caractères)
IMAGEImage source
COMMANDCommande d'entrée
CREATEDDate de création
STATUSÉtat actuel
PORTSMappages de ports
NAMESNom 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

CommandeDescription
docker runCréer et démarrer un conteneur
docker psLister les conteneurs
docker start/stopDémarrer/Arrêter
docker restartRedémarrer
docker rmSupprimer
docker execExécuter une commande
docker logsVoir les logs
docker cpCopier des fichiers
docker inspectInformations détaillées
docker statsStatistiques
Points clés
  • -d pour l'arrière-plan, -it pour l'interactif
  • -p mappe les ports, -e définit les variables
  • docker exec -it pour accéder au shell
  • Limitez les ressources en production

Exercices pratiques

  1. Lancez un conteneur nginx accessible sur le port 8080
  2. Exécutez une commande ls dans un conteneur en cours
  3. Copiez un fichier depuis un conteneur vers votre machine
  4. Limitez un conteneur à 256 Mo de RAM et vérifiez avec docker stats

← Images Docker | Dockerfile →