Création et gestion des conteneurs Docker
Docker fournit des commandes puissantes pour gérer efficacement les conteneurs. Dans ce chapitre, nous allons aborder leur théorie et illustrer leur usage avec des exemples pratiques. Les commandes essentielles pour la gestion des conteneurs : build, run, start, stop, rm.
Sommaire
Les commandes essentielles pour Docker
Commande docker build
La commande docker build permet de construire une image Docker à partir d'un fichier Dockerfile (que nous avons abordé dans les chapitres du premier module). Cette image encapsule tout ce qui est nécessaire pour exécuter une application, y compris le système d’exploitation, les dépendances, et le code. Elle est essentielle pour créer des environnements reproductibles et normalisés, adaptés aux workflows modernes.
À quoi sert-elle ?
- Lire les instructions du fichier
Dockerfile. - Télécharger les couches d'images de base nécessaires.
- Construire une nouvelle image Docker en appliquant les instructions du
Dockerfile.
Par exemple, si nous souhaitons construire une image à partir d'un fichier Dockerfile :
docker build -t mon-application:1.0 .
Nous allons créer une première image puis la construire pour exécuter le conteneur de celle-ci. Notre image sera un serveur Web hébergeant un fichier HTML.
Commençons par écrire le fichier Dockerfile :
# Utiliser l'image de base Nginx
FROM nginx
# Copier le fichier index.html dans le répertoire de contenu du serveur web
COPY index.html /usr/share/nginx/html/index.html
# Le port 80 est déjà exposé dans l'image de base nginx, donc pas besoin d'EXPOSE
# Nginx démarre automatiquement lorsque le conteneur est lancé, donc pas besoin de CMD
Voici notre fichier index.html :
<!DOCTYPE html>
<html>
<head>
<title>Page d'accueil</title>
</head>
<body>
<h1>Bonjour</h1>
</body>
</html>
Plaçons ces deux fichiers dans un même dossier, par exemple notre répertoire utilisateur situé dans /home, puis exécutons la commande :
docker build -t mon-serveur-web .
Dans notre cas, -t mon-serveur-web donne un nom à l'image, et le . indique que le Dockerfile se trouve dans le répertoire courant.

Une fois l'image construite, démarrons un conteneur avec cette commande :
docker run -d -p 80:80 mon-serveur-web
L'option -d exécute le conteneur en arrière-plan, et -p 80:80 expose le port 80 du conteneur sur le port 80 de votre hôte.
Pour lister les conteneurs actifs, dont le nôtre, nous utilisons la commande :
docker ps

Le tableau de la liste affiche plusieurs colonnes, dont voici :
CONTAINER ID: affiche l'identifiant unique du conteneur. Il s'agit généralement d'un hash alphanumérique.IMAGE: indique le nom de l'image Docker à partir de laquelle le conteneur a été créé.COMMAND: montre la commande qui a été utilisée pour démarrer le conteneur. Cette commande est souvent celle spécifiée dans leDockerfileavec l'instructionCMDouENTRYPOINT.CREATED: affiche l'âge du conteneur depuis sa création.STATUS: fournit l'état actuel du conteneur, comme en cours d'exécution, arrêté, en pause, etc.PORTS: détaille les ports du conteneur et leurs mappages éventuels avec les ports de l'hôte. Cela inclut les ports exposés par le conteneur et tout mappage de port spécifié lors du démarrage du conteneur.NAMES: affiche les noms assignés aux conteneurs. Docker génère un nom unique pour chaque conteneur s'il n'est pas spécifié par l'utilisateur.
Ces informations fournissent un aperçu rapide de l'état actuel de vos conteneurs Docker en cours d'exécution. Nous pouvons également utiliser des options supplémentaires avec docker ps pour personnaliser ou étendre les informations affichées, comme docker ps -a pour lister tous les conteneurs (y compris ceux qui ne sont pas en cours d'exécution) ou docker ps --format pour personnaliser le format de sortie.
En appelant notre page Web depuis http://localhost sur un navigateur, nous constatons que notre conteneur est correctement configuré.

Si nous souhaitons entrer dans le conteneur mon-serveur-web, nous exécutons la commande :
docker exec -it <CONTAINER ID> <commande>
Par exemple :
docker exec -it 2c230505cc03 bash

Ou simplement écrire la commande avec les 2 premiers caractères du CONTAINER ID :
docker exec -it 2c bash

Il est également possible d’exécuter une commande one shot directement dans le conteneur sans y entrer. Par exemple :
docker exec <CONTAINER ID> <commande>
Cela lance la commande dans le conteneur, puis revient immédiatement au terminal local une fois l’exécution terminée.
Commande docker start
La commande docker start est utilisée pour relancer un conteneur existant précédemment créé ou arrêté. Elle est particulièrement utile pour éviter de recréer un conteneur à chaque utilisation.
En considérant que notre conteneur précédent est stoppé, nous pouvons le lancer à nouveau avec la commande :
docker start 2c230505cc03
Cette commande redémarre en arrière-plan le conteneur arrêté.

Commande docker stop
La commande docker stop arrête proprement un conteneur en envoyant un signal SIGTERM au processus principal du conteneur. Si celui-ci ne s'arrête pas dans un délai défini, un signal SIGKILL est utilisé pour forcer l'arrêt.
docker stop 2c230505cc03

Commande docker rm
La commande docker rm supprime un conteneur arrêté. Elle est essentielle pour nettoyer les conteneurs inutilisés et maintenir un environnement organisé. Les conteneurs en cours d'exécution ne peuvent pas être supprimés, sauf avec l'option -f. D'autres paramètres comme -v pour supprimer les volumes associés, peuvent être appelés.
Nous détruisons notre conteneur avec la commande suivante :
docker rm 2c230505cc03

Inspection et gestion des ressources des conteneurs
Lorsqu'on exécute des conteneurs Docker dans un environnement professionnel, il est crucial de surveiller leur état, d'inspecter leurs ressources, et d'optimiser leur utilisation pour garantir un bon fonctionnement des applications. Docker propose plusieurs commandes permettant de collecter des informations sur les conteneurs en cours d'exécution, de surveiller leur consommation en ressources et d'optimiser leur gestion.
Nous allons détailler les outils essentiels pour inspecter et gérer les ressources des conteneurs Docker, avec des cas d'usage concrets et des exemples pratiques.
Inspection des conteneurs avec docker inspect
La commande docker inspect permet d'obtenir des informations détaillées sur un conteneur ou une image. Elle affiche un format JSON contenant des informations sur :
- L'état du conteneur (démarré, arrêté, en pause)
- Son réseau, ses ports exposés
- Les volumes montés
- L'environnement d’exécution et les arguments utilisés
En repartant d'un nouveau conteneur de l'image mon-serveur-web :
docker run -d -p 80:80 mon-serveur-web
docker inspect 6cca9aeb320e

Nous obtenons un rapport détaillé sous forme JSON contenant plusieurs sections essentielles sur un conteneur. Id et Created indiquent l'identifiant unique et la date de création du conteneur. Voici d'autres informations utiles à savoir :
Staterenseigne sur son état (running, stopped), son processus principal (Pid), et ses derniers événements (StartedAt, FinishedAt).Imageaffiche l'empreinte SHA256 de l'image utilisée, utile pour retrouver l'origine du conteneur.NetworkSettingsfournit les informations réseau, comme l'adresse IP attribuée (IPAddress), la passerelle (Gateway), et les ports exposés (Ports).HostConfigregroupe les paramètres système, incluant la politique de redémarrage (RestartPolicy), les limitations de ressources (CpuShares, Memory), et la configuration des logs (LogConfig).Mountsaffiche les volumes attachés au conteneur, garantissant la persistance des données.CmdetEntrypointprécisent la commande exécutée à son démarrage, permettant de comprendre comment le service est initialisé.
Cette commande est essentielle pour auditer un conteneur, récupérer ses configurations et optimiser sa gestion.
Surveillance des ressources avec docker stats
La commande docker stats fournit des statistiques en temps réel sur la consommation des ressources d'un ou plusieurs conteneurs. Elle permet d'identifier les éventuelles surconsommations en CPU, mémoire, disque et réseau.
Nous affichons les statistiques avec :
docker stats
Si nous souhaitons surveiller notre conteneur en particulier, il faut indiquer l'ID du conteneur :
docker stats 6cca9aeb320e

En résumé :
| Indicateur | Signification |
|---|---|
CONTAINER ID | ID du conteneur |
NAME | Nom du conteneur |
CPU % | Utilisation du CPU |
MEM USAGE / LIMIT | Utilisation de la mémoire vive |
NET I/O | Données réseau envoyées et reçues |
BLOCK I/O | Entrées/sorties disque |
PIDS | Nombre de processus en cours |
Limitation des ressources du conteneur
Docker permet d'allouer des limites de ressources pour éviter qu'un conteneur ne consomme toute la mémoire ou tout le CPU disponible, ce qui peut s'avérer problématique dans les environnements où les ressources sont limitées.
Voyons ensemble comment procéder. Si nous souhaitons limiter un conteneur à 50% des ressources CPU disponibles, nous pouvons utiliser la commande :
docker run -d -p 80:80 --cpus="0.5" mon-serveur-web

De la même manière, si nous souhaitons limiter un conteneur à 512 Mo de RAM :
docker run -d -p 80:80 --memory="512m" mon-serveur-web
Par défaut, si aucune limite n'est définie, un conteneur peut utiliser autant de mémoire que celle disponible sur l'hôte. C'est pourquoi il est important de définir des limites lorsque l'on souhaite éviter qu'un conteneur consomme toute la RAM du système et provoque des ralentissements ou un OOM (Out Of Memory).

Nous avons également la possibilité de limiter le nombre de processus :
docker run -d -p 80:80 --pids-limit 50 mon-serveur-web

Gestion des logs avec docker logs
La commande docker logs permet d'afficher les journaux d'un conteneur, essentiels pour le débogage et la surveillance. Il est possible d'ajouter -f pour suivre les logs en temps réel, --tail pour afficher les dernières lignes ou encore --since pour afficher les logs depuis une date donnée.
Pour afficher les logs de notre conteneur :
docker logs <CONTAINER ID>
Soit par exemple :
docker logs 6cca9aeb320e

Pour afficher les journaux d'un conteneur en temps réel, nous pouvons utiliser cette commande :
docker logs 6cca9aeb320e -f --tail 100
Volumes et persistance des données dans Docker
Dans un environnement conteneurisé, les données générées ou modifiées à l'intérieur d'un conteneur sont éphémères. Par défaut, lorsqu'un conteneur est supprimé, toutes les données qu'il contenait disparaissent également. Pour garantir la persistance des données, Docker propose un mécanisme de volumes, qui permet de stocker et partager des fichiers entre l'hôte et les conteneurs. L'utilisation des volumes est essentielle pour assurer la sauvegarde des données, faciliter la gestion des configurations et améliorer la collaboration entre plusieurs conteneurs.
Pourquoi les volumes sont-ils nécessaires ?
L'exécution d'un conteneur crée un système de fichiers temporaire. Si un service écrit des données dans ce système (par exemple, une base de données stockant des informations), celles-ci seront perdues dès que le conteneur sera supprimé ou redémarré. Les volumes permettent de contourner cette limitation en fournissant un espace de stockage persistant. De plus, ils offrent une solution performante et sécurisée pour le partage de données entre plusieurs conteneurs, notamment dans les architectures microservices.
L'utilisation des volumes présente plusieurs avantages :
- Persistance : les fichiers stockés dans un volume restent accessibles même après la suppression d'un conteneur.
- Isolation des données : les volumes permettent de séparer les données applicatives du conteneur, facilitant les sauvegardes et la gestion des configurations.
- Performance : contrairement aux systèmes de fichiers montés directement depuis l'hôte, les volumes Docker sont optimisés pour offrir de meilleures performances d'accès en lecture/écriture.
- Flexibilité : ils permettent de partager des fichiers entre plusieurs conteneurs, facilitant la communication entre différentes applications conteneurisées.
Docker offre plusieurs mécanismes pour stocker des données de manière persistante, comme nous le verrons dans la suite de ce chapitre.
Volumes gérés par Docker
Les volumes Docker sont stockés dans un répertoire interne (/var/lib/docker/volumes/) sur l'hôte et sont entièrement gérés par Docker. Ils sont indépendants et ne sont pas supprimés automatiquement lors de la suppression d'un conteneur.
docker volume create mon_volume
docker run -d -p 80:80 -v mon_volume:/data mon-serveur-web
Dans notre exemple ci-dessus, un volume nommé mon_volume est créé, puis monté dans le répertoire /data du conteneur. Ce volume reste accessible même si le conteneur est supprimé.

Bind mounts (montages liés à l'hôte)
Contrairement aux volumes Docker, un bind mount associe un chemin spécifique de l'hôte à un conteneur. Cela permet d'avoir un accès direct aux fichiers de l’hôte à l'intérieur du conteneur.
docker run -d -p 80:80 -v /home/jeremy:/data mon-serveur-web
Ici, le répertoire /home/jeremy de l'hôte est monté dans /data à l'intérieur du conteneur. Toute modification apportée dans /data sera directement visible sur l'hôte.

Il est également possible de monter ce répertoire en lecture seule, ce qui empêche toute modification depuis le conteneur. Pour cela, on ajoute simplement :ro à la fin du bind mount :
docker run -d -p 80:80 -v /home/jeremy:/data:ro mon-serveur-web
Dans ce cas, le conteneur peut lire les fichiers mais ne peut pas les modifier, ce qui améliore la sécurité lorsqu'on souhaite protéger les données de l'hôte.
TMPFS mount (stockage en mémoire)
Les tmpfs mounts permettent de stocker des fichiers en mémoire vive au lieu du disque. Cela améliore la rapidité d'accès aux données et est utile pour les fichiers temporaires.
docker run -d -p 80:80 --tmpfs /data:rw,size=100m mon-serveur-web
Dans cet exemple, /data est un volume en mémoire de 100 Mo accessible en lecture/écriture (rw).

Note : Docker permet d'attacher le même volume à plusieurs conteneurs, facilitant ainsi le partage des fichiers entre services.
Comment gérer les volumes ?
Pour lister les volumes existants, nous utilisons la commande docker volume ls qui affiche la liste des volumes Docker actuellement disponibles.
Docker offre également la possibilité d'inspecter les volumes, avec docker volume inspect :
docker volume inspect mon_volume
Cette commande renvoie des détails sur un volume, notamment son emplacement sur l'hôte et les conteneurs qui l'utilisent.
Lorsqu'un volume n'est plus utilisé, il peut être supprimé avec :
docker volume rm mon_volume
Enfin, pour nettoyer et supprimer tous les volumes non attachés à des conteneurs :
docker volume prune

Conclusion
Suite à la lecture de ce chapitre, vous devriez être en mesure de créer et supprimer les conteneurs Docker, mais aussi de gérer la persistance des données et les ressources affectées à chacun d'entre eux.
Dans le prochain chapitre, nous parlerons de la création d'images Docker en écrivant notre propre Dockerfile, mais pas seulement.
