Introduction à la technologie des conteneurs
Dans l'écosystème informatique moderne, un conteneur est une unité logicielle standardisée qui empaquette le code et toutes ses dépendances afin que l'application s'exécute rapidement et de manière fiable d'un environnement informatique à un autre. Contrairement à la virtualisation traditionnelle, la conteneurisation offre une isolation au niveau du système d'exploitation, permettant une utilisation plus efficace des ressources matérielles et une scalabilité horizontale rapide.
Qu'est-ce que Docker ?
Docker est une plateforme open-source qui automatise le déploiement d'applications dans des conteneurs logiciels. Il fournit une couche d'abstraction supplémentaire et une virtualisation au niveau du système d'exploitation sous Linux. Docker utilise les fonctionnalités du noyau Linux telles que les cgroups (groupes de contrôle) et les namespaces (espaces de noms) pour isoler les processus, les réseaux et les systèmes de fichiers.
Architecture de Docker
- Docker Host : La machine physique ou virtuelle qui exécute le démon Docker.
- Docker Daemon (dockerd) : Le service d'arrière-plan qui gère les objets Docker comme les images et les conteneurs.
- Docker Client : L'interface en ligne de commende (CLI) qui permet à l'utilisateur d'interagir avec le démon.
- Docker Registry : Un service de stockage pour les images (ex: Docker Hub).
- Images : Modèles en lecture seule utilisés pour créer des conteneurs.
- Containers : Instances exécutables d'une image.
Docker vs Machines Virtuelles
La différence fondamentale réside dans l'architecture :
- Ressources : Un hôte peut exécuter des centaines de conteneurs, là où il ne supporterait que quelques dizaines de machines virtuelles (VM).
- Vitesse : Les conteneurs démarrent en quelques secondes car ils partagent le noyau de l'hôte, contrairement aux VM qui doivent démarrer un OS complet.
- Isolation : Les VM offrent une isolation matérielle plus forte, tandis que Docker privilégie l'agilité et la performance.
Mécanismes d'Isolation : Namespaces et Cgroups
Docker repose sur deux piliers du noyau Linux pour garantir l'étanchéité entre les environnements :
Namespaces (Espaces de noms)
| Namespace | Isolation |
|---|---|
| MNT | Points de montage et système de fichiers. |
| UTS | Nom d'hôte (hostname) et domaine. |
| IPC | Communications inter-processus et mémoire partagée. |
| PID | Arborescence des processus. Le processus principal du conteneur devient le PID 1. |
| Net | Piles réseau, interfaces et ports. |
| User | Identifiants utilisateurs et groupes (UID/GID). |
Control Groups (Cgroups)
Alors que les namespaces isolent ce que le conteneur peut "voir", les cgroups limitent ce qu'il peut "consommer". Ils permettent de définir des quotas pour le CPU, la mémoire vive, les entrées/sorties disque et la bande passante réseau.
Installation et Configuration
Sous une distribution de type CentOS/RHEL, l'installation se déroule généralement via le gestionnaire de paquets yum ou dnf.
# Installation des outils requis
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Ajout du dépôt officiel
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# Installation de Docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io
# Démarrage du service
sudo systemctl start docker
sudo systemctl enable docker
Le moteur de stockage
Docker utilise principalement overlay2 comme pilote de stockage. Ce moteur gère le système de fichiers en couches, optimisant l'espace disque en ne stockant que les modifications entre l'image de base et le conteneur actif.
Guide des commandes Docker
Gestion des Images
Les images sont les briques de base de vos conteneurs.
# Rechercher une image sur le registre
docker search alpine
# Télécharger une image spécifique
docker pull nginx:1.21-alpine
# Lister les images locales
docker images
# Supprimer une image
docker rmi nginx:1.21-alpine
# Exporter une image vers un fichier d'archive
docker save my-app:v1 -o my-app-v1.tar
# Importer une image depuis une archive
docker load -i my-app-v1.tar
Cycle de vie des Conteneurs
Voici les commandes essentielles pour manipuler vos instances.
# Créer et démarrer un conteneur en mode interactif
docker run -it --name instance-test centos:7 /bin/bash
# Exécuter un conteneur en arrière-plan avec redirection de port
# -p [Port Hôte]:[Port Conteneur]
docker run -d --name serveur-web -p 8080:80 nginx
# Lister les conteneurs actifs
docker ps
# Lister tous les conteneurs (actifs et arrêtés)
docker ps -a
# Arrêter et démarrer un conteneur existant
docker stop serveur-web
docker start serveur-web
# Supprimer un conteneur (utiliser -f pour forcer si actif)
docker rm -f serveur-web
Maintenance et Inspection
Pour débugger ou configurer dynamiquement vos environnements :
# Accéder au terminal d'un conteneur en cours d'exécution
docker exec -it serveur-web /bin/bash
# Consulter les journaux (logs) d'une application
docker logs --tail 50 serveur-web
# Obtenir l'adresse IP d'un conteneur
docker inspect -f '{{.NetworkSettings.IPAddress}}' serveur-web
# Nettoyage massif (supprimer tous les conteneurs arrêtés)
docker rm $(docker ps -aq -f status=exited)
Script d'accès avancé via PID
Parfois, l'utilisation de docker exec n'est pas suffisante. On peut utiliser l'outil nsenter pour entrer directement dans les namespaces du processus hôte du conteneur.
#!/bin/bash
# Script : entrer-conteneur.sh
CONTAINER_ID=$1
PROCESS_PID=$(docker inspect -f "{{.State.Pid}}" ${CONTAINER_ID})
if [ -z "$PROCESS_PID" ]; then
echo "Erreur : Conteneur introuvable"
exit 1
fi
nsenter -t ${PROCESS_PID} -m -u -i -n -p
Configuration du Réseau et DNS
Docker permet de configurer le réseau lors de l'instanciation. Par défaut, il utilise le pont docker0, mais vous pouvez spécifier des DNS particuliers.
# Lancer un conteneur avec un serveur DNS spécifique
docker run -it --dns 8.8.8.8 --name client-reseau alpine sh