Ce document fournit des notes complètes pour l’introduction aux containers Docker. Il couvre les concepts clés, deux approches d’exécution depuis un notebook (Docker-in-Docker vs engine de l’hôte), et les commandes essentielles.
Contexte
Le devcontainer utilisé pour ces démonstrations contient les clients docker et podman. Pour les démonstrations reproduites ici nous utilisons le client docker.
Deux approches courantes pour exécuter Docker depuis un environnement isolé :
Docker-in-Docker: un service Docker s’exécute dans un container séparé. Le client Docker du notebook se connecte au démon via TCP (port 2375). Avantage : isolation complète du démon de l’hôte. Inconvénient : complexité réseau, performances légèrement réduites.
Utiliser l’engine de l’hôte (dooD, Docker-out-of-Docker): le client Docker dans le notebook utilise le socket Unix de l’hôte (/var/run/docker.sock). Avantage : accès direct aux images/containers de l’hôte et meilleures performances. Inconvénient : moindre isolation (risques de sécurité si le notebook est compromis).
Dans ces notes, les exemples sont réalisés avec l’engine de l’hôte via le socket Unix partagé. Comme le démon peut être partagé entre plusieurs exécutions simultanées, chaque ressource créée par la leçon est repérée par le label ebpro-render=true, ce qui permet un nettoyage ciblé sans jamais toucher aux ressources des autres.
Préparation de l’environnement
Configuration de l’accès à Docker
Par défaut, le client Docker utilise le socket Unix de l’engine de l’hôte (/var/run/docker.sock) : il n’est donc pas nécessaire d’exporter DOCKER_HOST. En CI, le socket de l’hôte est monté dans le conteneur de rendu (dooD).
Le nettoyage ci-dessous est ciblé par label : il ne supprime que les containers marqués ebpro-render=true, laissés par une exécution précédente de cette leçon. Sur un démon partagé, il ne faut jamais exécuter docker system prune complet, qui détruirait les ressources des exécutions concurrentes.
Tous les containers lancés par la suite dans cette leçon seront créés avec l’option --label ebpro-render=true afin de pouvoir être nettoyés précisément.
Premier container
Exécution d’un container simple
Vérifions que la communication fonctionne avec l’image hello-world :
docker run --label ebpro-render=true hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4f55086f7dd0: Pulling fs layer
4f55086f7dd0: Downloading 2.415kB/2.415kB
4f55086f7dd0: Verifying Checksum
4f55086f7dd0: Download complete
4f55086f7dd0: Extracting 2.415kB/2.415kB
4f55086f7dd0: Extracting 2.415kB/2.415kB
4f55086f7dd0: Pull complete
Digest: sha256:11a3eb1597e864c51b3f56733cb2e8a90bf0c284bfc05f9444d81c558bc848aa
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Cette commande effectue plusieurs opérations :
Recherche l’image hello-world localement
Si absente, la télécharge depuis Docker Hub
Crée un nouveau container à partir de cette image
Exécute le container qui affiche un message de bienvenue
Le container s’arrête automatiquement après avoir terminé
L’image hello-world est particulièrement légère (environ 1.84 kB) et sert principalement à vérifier que Docker est correctement installé et configuré.
Images Docker
Gestion des images
Pour lister toutes les images disponibles localement :
docker images
iInfo → U In Use
IMAGEIDDISK USAGECONTENT SIZEEXTRAghcr.io/ebpro/solen:quarto-full-build-20261010T172146Z
b4ed11d0542c 6.88GB 0B U hello-world:latest e2ac70e7319a 10.1kB 0B U
Cette commande affiche :
REPOSITORY: le nom de l’image (ex: ubuntu, nginx)
TAG: la version ou variante de l’image (ex: latest, 22.04)
IMAGE ID: identifiant unique de l’image
CREATED: date de création de l’image
SIZE: taille de l’image sur le disque
Les images Docker sont construites en couches (layers), ce qui permet de réutiliser les couches communes entre différentes images, optimisant ainsi l’espace disque et le temps de téléchargement.
Containers actifs
Surveillance des containers
Pour voir les containers en cours d’exécution :
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
415b7921a604 ghcr.io/ebpro/solen:quarto-full-build-20261010T172146Z "bash -lc 'source /h…" 22 seconds ago Up 21 seconds quarto-render-38598955399
Pour voir tous les containers (en cours d’exécution et arrêtés) :
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
288e0bb3fb8e hello-world "/hello" 2 seconds ago Exited (0) 1 second ago frosty_goldstine
9e46a5e3b4d5 hello-world "/hello" 4 seconds ago Exited (0) 2 seconds ago pedantic_meninsky
415b7921a604 ghcr.io/ebpro/solen:quarto-full-build-20261010T172146Z "bash -lc 'source /h…" 23 seconds ago Up 22 seconds quarto-render-38598955399
Les informations affichées incluent :
CONTAINER ID: identifiant court du container
IMAGE: image source du container
COMMAND: commande exécutée au démarrage
CREATED: date de création du container
STATUS: état actuel (Up pour actif, Exited pour arrêté)
PORTS: mappages de ports entre l’hôte et le container
NAMES: nom attribué au container (généré automatiquement ou défini par l’utilisateur)
Container interactif
Exécution interactive
Lançons un container Ubuntu avec un shell interactif :
docker run --label ebpro-render=true ubuntu uname -a
Pour une session interactive (non compatible avec l’exécution notebook) :
docker run -it--label ebpro-render=true ubuntu bash
Options utilisées :
-i (interactive) : garde l’entrée standard (STDIN) ouverte
-t (tty) : alloue un pseudo-terminal
ubuntu : nom de l’image à utiliser
bash : commande à exécuter dans le container
Cette combinaison permet d’obtenir un shell interactif dans le container, similaire à une connexion SSH. Le container s’exécute tant que le shell est actif et s’arrête dès que vous quittez (commande exit ou Ctrl+D).
Nettoyage
Suppression des containers
Pour supprimer un container arrêté spécifique (remplacer <container_id> par l’ID réel) :
docker rm <container_id>
Pour supprimer les containers de cette leçon en une seule commande, on cible le label ebpro-render=true :
Il est recommandé de nettoyer régulièrement les containers arrêtés pour éviter l’accumulation d’espace disque inutile. La commande générique docker container prune supprime tous les containers arrêtés du démon : sur un démon partagé (CI, devcontainer mutualisé), elle peut détruire les ressources d’exécutions concurrentes. Préférez toujours un nettoyage ciblé par label.
Pour supprimer une image (remplacer <image_id> par l’ID réel) :
docker rmi <image_id>
Notez qu’une image ne peut être supprimée que si aucun container (même arrêté) ne l’utilise.
Conclusion
Cette introduction couvre les commandes Docker essentielles pour démarrer avec la conteneurisation. Les concepts abordés incluent :
La différence entre images et containers
L’exécution de containers simples et interactifs
La gestion et la surveillance des ressources Docker
Les bonnes pratiques de nettoyage
Pour aller plus loin, explorez les Dockerfiles pour créer vos propres images, Docker Compose pour orchestrer plusieurs containers, et les réseaux Docker pour la communication inter-containers.