Docker Containers
Chapter objectives
- Create and run containers
- Manage the container lifecycle
- Interact with running containers
- Understand the configuration options
1 - Create and run a container
The docker run command
# Syntaxe de base
docker run [OPTIONS] IMAGE [COMMANDE] [ARGUMENTS]
# Exemple simple
docker run nginx
# Avec un nom personnalisé
docker run --name mon-nginx nginx
Common options
| Option | Description | Example |
|---|---|---|
-d | Detached mode (background) | docker run -d nginx |
-it | Interactive mode + TTY | docker run -it ubuntu bash |
--name | Container name | docker run --name web nginx |
-p | Port mapping | docker run -p 8080:80 nginx |
-v | Volume mounting | docker run -v /data:/app nginx |
-e | Environment variable | docker run -e DB=mysql nginx |
--rm | Remove after stop | docker run --rm nginx |
Practical examples
# 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 - Execution modes
Attached mode (foreground)
# Le terminal est attaché au conteneur
docker run nginx
# Sortie visible dans le terminal
# Ctrl+C pour arrêter
Detached mode (background)
# Le conteneur s'exécute en arrière-plan
docker run -d nginx
# Retourne l'ID du conteneur
# a1b2c3d4e5f6...
Interactive mode
# -i : Keep STDIN open
# -t : Allocate pseudo-TTY
docker run -it ubuntu bash
# Dans le conteneur
root@abc123:/# ls
root@abc123:/# exit
Common combinations
# 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 - List containers
Running containers
# 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
All containers
# 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}})"
Table columns
| Column | Description |
|---|---|
| CONTAINER ID | Unique identifier (first 12 characters) |
| IMAGE | Source image |
| COMMAND | Entry command |
| CREATED | Creation date |
| STATUS | Current state |
| PORTS | Port mappings |
| NAMES | Container name |
4 - Container lifecycle
Container states
docker create
│
▼
┌─────────────────────────────────────┐
│ CREATED │
└──────────────────┬──────────────────┘
│ docker start
▼
┌─────────────────────────────────────┐
│ RUNNING │◄──────────────┐
└──────────────────┬──────────────────┘ │
│ │
docker stop│ docker restart│
▼ │
┌─────────────────────────────────────┐ │
│ STOPPED │───────────────┘
└─────────────────────────────────────┘
Lifecycle commands
# 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
Cleanup
# Supprimer tous les conteneurs arrêtés
docker container prune
# Supprimer tous les conteneurs (actifs inclus)
docker rm -f $(docker ps -aq)
5 - Interact with containers
Run commands (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
View 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
Copy files
# 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
Attach to the container
# S'attacher à un conteneur en cours
docker attach mon-conteneur
# Détacher sans arrêter : Ctrl+P puis Ctrl+Q
6 - Port mapping
Mapping syntax
# 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
Practical examples
# 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
Verify the ports
# Ports d'un conteneur
docker port webserver
# Dans docker ps
docker ps --format "{{.Names}}: {{.Ports}}"
7 - Environment variables
Define 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
.env file
# .env
DB_HOST=localhost
DB_PORT=5432
DB_USER=admin
DB_PASSWORD=secret
NODE_ENV=production
Verify the variables
# Voir les variables d'un conteneur
docker exec mon-conteneur env
# Variable spécifique
docker exec mon-conteneur printenv DB_HOST
8 - Limit resources
CPU limits
# 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
Memory limits
# 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
Check usage
# 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 - Inspect containers
Detailed information
# 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
Common information
# 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
Differences with the image
# Voir les modifications du système de fichiers
docker diff mon-conteneur
# A = Added (ajouté)
# C = Changed (modifié)
# D = Deleted (supprimé)
10 - Create an image from a container
The commit command
# 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
Warning
Prefer Dockerfiles to create images. docker commit is useful for debugging but not for production.
Command summary
| Command | Description |
|---|---|
docker run | Create and start a container |
docker ps | List the containers |
docker start/stop | Start/Stop |
docker restart | Restart |
docker rm | Delete |
docker exec | Run a command |
docker logs | View the logs |
docker cp | Copy files |
docker inspect | Detailed information |
docker stats | Statistics |
Key points
-dfor background,-itfor interactive-pmaps ports,-edefines variablesdocker exec -itto access the shell- Limit resources in production
Hands-on exercises
- Run an nginx container accessible on port 8080
- Run an
lscommand in a running container - Copy a file from a container to your machine
- Limit a container to 256 MB of RAM and check with
docker stats