Qu'est-ce qu'un conteneur et pourquoi l'utiliser ?
Les conteneurs permettent d'encapsuler une application avec toutes ses dépnedances dans un environnement isolé, garantissant ainsi une cohérence entre les environnements de développement, de test et de production. Cette uniformité élimine les problèmes liés aux différences entre les systèmes hôte.
Ils offrent également un déploiement extrêmement rapide, réduisant considérablement le cycle de mise en œuvre et facilitant l'intégration continue et la livraison continue (CI/CD).
Docker : moteur de conteneurs
Docker est un moteur de conteneurisation open source développé en Go. Il permet non seulement d'exécuter des applications dans des conteneurs, mais aussi de gérer les images et les cycles de vie des conteneurs. Parmi les alternatives notables figurent containerd, Podman et Rkt.
Avantages de la conteneurisation
- Flexibilité : Même les applications complexes peuvent être facilement conteneurisées.
- Légèreté : Les conteneurs partagent le noyau du système hôte, ce qui réduit leur empreinte mémoire.
- Interopérabilité : Permet des mises à jour instantanées sans interruption de service.
- Portabilité : Un conteneur construit localement peut s'exécuter sans modification sur le cloud ou tout autre système compatible.
- Évolutivité : Prise en charge de la mise à l'échelle horizontale automatique via des orchestrateurs comme Kubernetes.
- Empilabilité des services : Capacité à orchestrer plusieurs couches de services (base de données, API, frontend) indépendamment.
Différences entre conteneurs et machines virtuelles
| Conteneurs (Docker) | Machines Virtuelles |
|---|---|
| Partage du noyau hôte | Noyau OS dédié par VM |
| Isolation via namespaces et contrôle des ressources via cgroups | Isolation matérielle complète via un hyperviseur |
| Démarrage en quelques secondes | Démarrage en minutes |
| Possibilité d'exécuter des centaines de conteneurs sur un même hôte | Limité à quelques dizaines de VMs par machine |
| Performance proche de celle du matériel natif | Surdénommée due à la couche d'abstraction de l'hyperviseur |
La technologie sous-jacente repose sur deux fonctionnalités clés du noyau Linux : les namespaces pour l'isolation (processus, réseau, montages, etc.) et les cgroups pour limiter l'utilisation des ressources (CPU, mémoire). De plus, Docker utilise la technique copy-on-write pour optimiser la gestion des fichiers : les modifications ne sont copiées que lorsqu’elles sont effectuées, économisant ainsi espace disque et temps d’exécution.
Environnements de virtualisation courants
- Windows : VMware Workstation (bureau), VMware vSphere + ESXi (datacanter)
- Linux : KVM (Kernel-based Virtual Machine), souvent combiné avec OpenStack pour les clouds privés
Installation de Docker
- Arrêter le pare-feu si nécessaire :
systemctl stop firewalld - Installer les dépendances nécessaires (comme LVM pour la gestion des volumes)
- Ajouter un référentiel local ou fiable pour l'installation
- Utiliser
yum install docker-ce(ouaptsur Debian/Ubuntu) - Démarrer le service :
systemctl start docker - Activer le démarrage automatique :
systemctl enable docker - Vérifier l'installation :
docker version– affiche la version cliente et serveurdocker info– donne des informations détaillées sur la configuration
Concepts fondamentaux
- Image : Modèle en lecture seule utilisé pour créer des conteneurs. Elle inclut tout ce dont l'application a besoin : binaires, bibliothèques, configurations.
- Conteneur : Instance exécutable d'une image. Chaque conteneur est isolé des autres par défaut.
- Registre : Emplacement centralisé pour stocker et partager des images. Exemples : Docker Hub (public), registres privés (comme ceux d'AWS ECR, Google GCR, ou Alibaba ACR).
Opérations sur les images
docker version # Afficher la version
docker info # Informations système
docker search nginx # Rechercher une image
docker pull ubuntu:22.04 # Télécharger une image avec tag spécifique
docker images # Lister les images locales
docker inspect ubuntu:22.04 # Détails techniques de l'image
docker tag ubuntu:22.04 monapp:v1 # Renommer ou étiqueter une image
docker rmi monapp:v1 # Supprimer une image (-f pour forcer)
docker save -o backup.tar ubuntu:22.04 # Sauvegarder une image en fichier
docker load -i backup.tar # Restaurer une image depuis un fichier
docker login # Authentification au registre
docker push monregistry/monapp:v1 # Pousser une image vers un registre
Pour accélérer les téléchargements, il est recommandé d'utiliser un miroir de registre. Par exemple, Alibaba Cloud propose un accélérateur accessible via son portail. Une fois l'URL obtenue, elle doit être configurée dans /etc/docker/daemon.json :
{
"registry-mirrors": ["https://votre-miroir.mirror.aliyuncs.com"]
}
Après redémarrage du daemon (systemctl restart docker), les pulls seront beaucoup plus rapides.
Gestion des conteneurs
# Créer un conteneur sans le démarrer
docker create --name webserveur nginx:latest
# Démarrer, arrêter, redémarrer
docker start webserveur
docker stop webserveur
docker restart webserveur
# Exécuter une commande dans un conteneur en cours d'exécution
docker exec -it webserveur /bin/bash
# Copier des fichiers entre hôte et conteneur
docker cp fichier.txt webserveur:/app/
docker cp webserveur:/app/log.txt ./
# Voir l'état des conteneurs
docker ps -a # Tous les conteneurs (actifs et inactifs)
# Supprimer un ou plusieurs conteneurs
docker rm webserveur
docker rm $(docker ps -aq --filter status=exited) # Nettoyer tous les conteneurs arrêtés
# Exporter un conteneur comme archive
docker export webserveur > container-backup.tar
# Créer et démarrer un conteneur en une seule commande
docker run -d --name app -p 8080:80 nginx:alpine
Cycle de création d’un conteneur avec docker run
- Vérifie la présence locale de l'image. Si absente, la télécharge depuis le registre.
- Crée une couche mutable au-dessus de l'image en lecture seule.
- Attribue une interface réseau et une adresse IP via le pont Docker (docker0).
- Démarre le processus principal (PID 1) selon la commande définie dans l'image ou passée en argument.