Un conteneur est une technologie de virtualisation au niveau du système d'exploitation (OS) qui permet l'exécution d'applications et de processus dans des environnements isolés. Les conteneurs sont des instances isolées d'une application et de ses dépendances, exécutées sur un seul noyau de système d'exploitation et partageant les ressources du système hôte.
Avantages clés des conteneurs :
Plus légers que les machines virtuelles traditionnelles
Démarrage rapide (quelques secondes vs minutes pour une VM)
Utilisation efficace des ressources
Isolation des processus et applications
Portabilité entre différents environnements
Aspect
Machine Virtuelle
Conteneur
Système d'exploitation
OS complet pour chaque VM
Partage le noyau de l'hôte
Ressources
Plus lourd (GB)
Plus léger (MB)
Temps de démarrage
Minutes
Secondes
Isolation
Isolation complète
Isolation au niveau processus
Performance
Overhead de virtualisation
Performance native
Référence: https://arxiv.org/html/2401.07539v1
Les conteneurs système sont similaires aux machines virtuelles ou physiques. Ils exécutent un système d'exploitation complet en leur sein et peuvent héberger plusieurs applications dans un seul conteneur.
Caractéristiques :
Exécutent un OS complet (init system, services multiples)
Durables et persistants
Gestion similaire à une VM traditionnelle
Peuvent héberger plusieurs applications
Idéaux pour migrer des applications monolithiques
Les conteneurs d'application (aussi appelés conteneurs de processus) sont conçus pour exécuter un seul processus ou service par conteneur.
Caractéristiques :
Un processus/service par conteneur
Éphémères par nature
Facilement remplaçables
Optimisés pour les architectures microservices
Cycle de vie court et dynamique
Référence: https://ubuntu.com/blog/lxd-vs-docker#:~:text=LXC%20is%20the%20technology%20allowing,an%20easy%20and%20unified%20way
LXC est une technologie de virtualisation au niveau OS pour Linux, existant depuis 2008. Elle utilise les fonctionnalités du noyau Linux :
cgroups : Limitation et hiérarchisation des ressources (CPU, mémoire, I/O)
namespaces : Isolation complète de l'environnement (processus, réseau, utilisateurs, système de fichiers)
LXD est un gestionnaire de conteneurs construit sur LXC, lancé en 2015 et maintenant géré par Canonical. Il offre :
Une API REST pour la gestion des conteneurs
Gestion avancée du stockage et du réseau
Snapshots et migrations en direct
Interface utilisateur améliorée
Clustering et haute disponibilité
Environnements de développement complets
Migration d'applications legacy
Consolidation de serveurs
Environnements multi-tenant
Tests d'infrastructure
Docker utilise une architecture client-serveur comprenant :
Docker Client : Interface CLI pour interagir avec Docker
Docker Daemon : Service qui gère les conteneurs
Docker Registry : Stockage et distribution d'images
Docker Images : Templates en lecture seule pour créer des conteneurs
Docker Containers : Instances en exécution des images
Dockerfile : Script définissant la construction d'une image
Image : Template immuable contenant l'application et ses dépendances
Container : Instance en exécution d'une image
Volume : Stockage persistant pour les données
Network : Communication entre conteneurs
Docker Compose permet de définir et gérer des applications multi-conteneurs :
Utilise un fichier YAML (docker-compose.yml)
Définit tous les services de l'application
Gère les dépendances entre services
Simplifie le déploiement d'architectures complexes
Référence: https://blog.devops.dev/what-and-why-of-docker-compose-dc95314c74b8
¶ 4.4 Commandes de base
Images Docker :
docker pull [image] : Télécharge une image depuis Docker Hub
docker images : Liste toutes les images disponibles localement
docker rmi [image] : Supprime une image
Conteneurs :
docker run [options] [image] : Crée et démarre un nouveau conteneur
docker ps : Liste les conteneurs en cours d'exécution
docker ps -a : Liste tous les conteneurs (y compris ceux arrêtés)
docker stop [container] : Arrête un conteneur en cours d'exécution
docker start [container] : Démarre un conteneur arrêté
docker restart [container] : Redémarre un conteneur
docker rm [container] : Supprime un conteneur arrêté
Exécution et logs :
docker exec -it [container] [command] : Exécute une commande dans un conteneur en cours d'exécution
docker logs [container] : Affiche les logs d'un conteneur
Réseau :
docker network ls : Liste les réseaux Docker
docker network create [network] : Crée un nouveau réseau
Volumes :
docker volume ls : Liste les volumes
docker volume create [volume] : Crée un nouveau volume
Construction d'images :
docker build -t [name:tag] . : Construit une image à partir d'un Dockerfile
Information et nettoyage :
docker info : Affiche les informations système de Docker
docker system prune : Supprime tous les conteneurs, réseaux et images inutilisés
Aspect
LXD
Docker
Focus
Conteneur OS complet
Conteneur d'application unique
Processus
Multiple
Single
Init System
Systemd/Upstart
Processus direct
Persistance
Conçu pour être persistant
Éphémère par défaut
État
Stateful
Stateless préféré
LXD :
Allocation de ressources similaire aux VMs
Quotas CPU, RAM, disque configurables
Gestion fine des privilèges système
Docker :
Ressources limitées par conteneur
Optimisation pour la densité maximale
Isolation au niveau application
LXD :
Principalement Linux
Moins portable entre systèmes
Écosystème plus restreint
Docker :
Multi-plateforme (Linux, Windows, Mac)
Haute portabilité des images
Vaste écosystème (Docker Hub, outils CI/CD)
LXD :
Intégration avec OpenStack, OpenNebula
Clustering natif LXD
Gestion via API REST
Docker :
Kubernetes, Docker Swarm
Intégration CI/CD native
Écosystème DevOps mature
¶ Utilisez LXD/LXC quand :
Vous migrez des VMs vers des conteneurs
Vous avez besoin d'un OS complet
Les applications nécessitent systemd ou des services système
Vous voulez une gestion similaire aux VMs traditionnelles
La persistance des données est critique
Vous gérez des environnements de développement complets
¶ Utilisez Docker quand :
Vous développez des microservices
Vous voulez une portabilité maximale
Vous utilisez des pratiques CI/CD modernes
L'application suit le principe "un processus par conteneur"
Vous voulez bénéficier de l'écosystème Docker Hub
Vous visez une architecture cloud-native
*Cours rédigé pour le Cégep Ahuntsic par son excellence Pablo The God