Docker containers

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Instance en cours d'exécution d'une image Docker
Chaîne d'exécution Docker CLI → dockerd → containerd → runc
Standard OCI (Open Container Initiative)
Isolation Namespaces (PID, réseau, mount, IPC, UTS) + Cgroups (CPU, mémoire, I/O)
Voir aussi Docker · Docker images · Docker network · Docker namespaces · Docker capabilities

Un conteneur Docker est une instance en cours d'exécution d'une image : un ou plusieurs processus isolés du reste du système par des Namespaces et limités par des Cgroups. Cette page couvre la chaîne d'exécution et les commandes de manipulation du cycle de vie d'un conteneur ; pour le format d'image et son historique de couches, voir Docker images, pour le réseau et le stockage voir Docker network et Docker volumes.

Prérequis d'usage courant : ajouter l'utilisateur courant au groupe docker pour piloter le démon sans sudo systématique (implique un accès équivalent à root sur l'hôte, à traiter comme tel du point de vue sécurité) :

sudo usermod -aG docker $USER

Chaîne d'exécution (runtime)

Quand un conteneur est démarré, la commande traverse plusieurs couches avant que le conteneur n'existe réellement :

  • Docker CLI — commande docker côté utilisateur.
  • dockerd — démon Docker, gère images/réseaux/volumes et délègue l'exécution.
  • containerdruntime de haut niveau, démarre les conteneurs, gère les réseaux/ponts au niveau conteneur.
  • runcruntime OCI de bas niveau, crée effectivement le conteneur en assemblant les primitives noyau :
    • Cgroups — limitation des ressources (CPU, mémoire, réseau, priorités).
    • Namespaces — isolation (PID, réseau, mount, IPC, UTS — Unix Time Sharing).

L'ensemble suit la spécification OCI (Open Container Initiative, voir le format d'image OCI), ce qui permet à d'autres outils (Podman, Kubernetes via containerd...) d'exécuter les mêmes images et conteneurs sans dépendre du Docker Engine complet.

Cycle de vie d'un conteneur

# créer et démarrer un conteneur simple
docker run busybox echo "hello world!"

# en tâche de fond (-d), avec un nom explicite
docker run --name cont_name -d httpd
docker run -d --name c1 nginx:latest

# interactif, supprimé automatiquement à l'arrêt (--rm)
docker run -it --name c1 --rm nginx:latest

# avec un hostname et un DNS explicites
docker run -it --name c1 --rm --hostname host1 --dns 8.8.8.8 nginx:latest

Actions sur un conteneur déjà créé :

docker start cont_name
docker stop c1
docker rm c1
docker rm -f c1          # forcer la suppression d'un conteneur en cours d'exécution
docker exec -it cont_name bash    # ouvrir un shell dans un conteneur actif

Nettoyage en masse de tous les conteneurs (y compris arrêtés) :

docker ps -qa
docker rm -f $(docker ps -qa)

Journalisation

Le pilote de logs et sa taille maximale se règlent au lancement du conteneur (ou globalement dans /etc/docker/daemon.json, voir Docker install CE) :

docker run --log-driver json-file --log-opt max-size=50m nginx

Options courantes

Option Effet
on-failure|always|unless-stopped Politique de redémarrage automatique du conteneur
--rm Supprime automatiquement le conteneur à l'arrêt
--memory 500M Limite dure (hard limit) de mémoire — le conteneur ne peut pas dépasser cette valeur
--memory-reservation 256M Limite souple (soft limit) — n'intervient que si l'hôte détecte une contention mémoire

Voir aussi