Skip to main content

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

OptionDescriptionExample
-dDetached mode (background)docker run -d nginx
-itInteractive mode + TTYdocker run -it ubuntu bash
--nameContainer namedocker run --name web nginx
-pPort mappingdocker run -p 8080:80 nginx
-vVolume mountingdocker run -v /data:/app nginx
-eEnvironment variabledocker run -e DB=mysql nginx
--rmRemove after stopdocker 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

ColumnDescription
CONTAINER IDUnique identifier (first 12 characters)
IMAGESource image
COMMANDEntry command
CREATEDCreation date
STATUSCurrent state
PORTSPort mappings
NAMESContainer 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

CommandDescription
docker runCreate and start a container
docker psList the containers
docker start/stopStart/Stop
docker restartRestart
docker rmDelete
docker execRun a command
docker logsView the logs
docker cpCopy files
docker inspectDetailed information
docker statsStatistics
Key points
  • -d for background, -it for interactive
  • -p maps ports, -e defines variables
  • docker exec -it to access the shell
  • Limit resources in production

Hands-on exercises

  1. Run an nginx container accessible on port 8080
  2. Run an ls command in a running container
  3. Copy a file from a container to your machine
  4. Limit a container to 256 MB of RAM and check with docker stats

← Docker Images | Dockerfile →