Conteneurisation avec Docker

Notes de Cours - Semaine 1

← Retour à l'accueil

Semaine 1 : Les Fondamentaux de la Conteneurisation

1. Problématique : L'enfer des dépendances

Le problème classique : "Ça marche sur ma machine !"

Un développeur crée une application qui fonctionne parfaitement sur son ordinateur. Mais lorsque l'application est déployée en production ou partagée avec un collègue, elle plante.

  • Différences de versions de bibliothèques (dépendances).
  • Variables d'environnement manquantes ou différentes.
  • Configuration spécifique du système d'exploitation.
  • Fichiers de configuration divergents.

2. Concepts : Virtualisation vs Conteneurisation

Les deux technologies visent à isoler les applications, mais elles le font différemment.

Machines Virtuelles (VMs)

Une VM émule un ordinateur complet (matériel inclus). Elle exécute un système d'exploitation invité (Guest OS) complet au-dessus d'un système d'exploitation hôte (Host OS) via un hyperviseur.

  • Avantage : Isolation totale et sécurité maximale.
  • Inconvénient : Lourd (Go), lent à démarrer, consomme beaucoup de ressources (RAM, CPU).

Conteneurs (Docker)

Un conteneur partage le noyau (kernel) du système d'exploitation hôte. Il n'isole que l'application et ses dépendances (processus, système de fichiers, réseau) en utilisant les fonctionnalités du noyau Linux (cgroups, namespaces).

  • Avantage : Léger (Mo), démarrage instantané, efficace en ressources.
  • Inconvénient : Isolation moins forte que les VMs (noyau partagé).
Comment ça marche ? (Points clés)
  • Namespaces (Espaces de noms) : Fournissent l'isolation. Chaque conteneur a sa propre vue du système (ses propres processus (PID), son propre réseau (NET), ses propres points de montage (MNT), etc.).
  • cgroups (Control Groups) : Limitent et contrôlent l'utilisation des ressources (CPU, RAM, I/O) pour chaque conteneur.

Comparaison : VM vs Conteneur

Matériel OS Hôte Hyperviseur OS Invité App A OS Invité App B Machines Virtuelles Matériel OS Hôte Docker Engine App A App B Conteneurs

3. Pourquoi les conteneurs ?

  • Portabilité : L'image du conteneur inclut TOUT ce dont l'application a besoin. Elle s'exécute de la même manière partout (dev, test, prod).
  • Efficacité : Moins de surcharge que les VMs. Plus de conteneurs peuvent tourner sur un même hôte.
  • Isolation : Les processus d'un conteneur sont isolés des autres conteneurs et de l'hôte.
  • Reproductibilité : Les images sont construites à partir d'un fichier (Dockerfile) qui décrit les étapes. L'environnement est scripté et versionné.

4. Architecture Docker

Docker utilise une architecture client-serveur.

Client (docker cli) API REST Docker Daemon (dockerd) Images Cont. pull/push Registre (Docker Hub)
Client Docker (CLI) : L'outil en ligne de commande (`docker`) que vous utilisez. Il envoie des instructions au Daemon.
Daemon Docker (Docker Engine) : Le service (serveur) qui tourne en arrière-plan. Il écoute les requêtes de l'API Docker et gère les objets Docker (construire les images, démarrer les conteneurs, gérer le réseau...).
Registre (ex: Docker Hub) : Un service qui stocke et distribue les images Docker. C'est comme un "GitHub" pour les images Docker.

Les Objets Clés :

Image : Un modèle (template) en lecture seule contenant un ensemble d'instructions pour créer un conteneur. C'est le "plan" de votre application (ex: une image Ubuntu avec Nginx installé).
Conteneur : Une instance exécutable d'une image. C'est le "bâtiment" construit à partir du plan. Vous pouvez démarrer, arrêter, et supprimer des conteneurs.

5. Pour aller plus loin (Révision)

Pour approfondir les concepts de cette semaine, consultez la documentation officielle :

1. Installation de Docker

La méthode la plus simple pour Windows et macOS est Docker Desktop. Sur Linux, vous installerez Docker Engine.

2. Vérification de l'installation

Une fois installé, ouvrez un terminal et tapez ces commandes pour vérifier que le client et le daemon fonctionnent :

docker version

Pour obtenir des informations détaillées sur votre installation (nombre d'images, de conteneurs, etc.) :

docker info

3. Exécuter son premier conteneur

L'image `hello-world` est une image de test qui vérifie que tout fonctionne. Elle va :
1. Télécharger l'image `hello-world` depuis Docker Hub (si elle n'existe pas localement).
2. Créer un conteneur à partir de cette image.
3. Exécuter le conteneur, qui affiche un message de confirmation.
4. S'arrêter.

docker run hello-world

4. Explorer Docker Hub

Docker Hub est le registre public par défaut, une immense bibliothèque d'images de conteneurs. C'est là que vous (et le daemon Docker) allez chercher les images.

Lorsque vous faites docker run nginx, Docker recherche l'image "nginx" localement. S'il ne la trouve pas, il la télécharge (pull) automatiquement depuis Docker Hub.

Trouver du Contenu de Confiance (Trusted Content)

N'importe qui peut publier une image sur Docker Hub. Pour la sécurité et la stabilité, il est crucial de savoir quoi utiliser :

🐳
Docker Official Image (Image Officielle)

Ce sont les meilleures. Maintenues et auditées par Docker et/ou les créateurs du logiciel (ex: python, nginx, mongo). Elles sont sécurisées, à jour, et bien documentées. Toujours les privilégier.

Verified Publisher (Éditeur Vérifié)

Images publiées directement par l'entreprise qui crée le logiciel (ex: bitnami/mongodb, ubuntu/grafana). C'est une excellente source de confiance, juste après les images officielles.

Sponsored Images (Images Sponsorisées)

Ce sont des images de type "Éditeur Vérifié" que Docker et ses partenaires commerciaux promeuvent. Elles sont fiables et sécurisées, mais leur mise en avant fait partie d'un accord commercial.

👤
Images Communautaires (Community)

Images publiées par des utilisateurs individuels (ex: nomutilisateur/mon-app). Elles peuvent être très utiles, mais utilisez-les avec prudence. Vérifiez le Dockerfile, le nombre de téléchargements, et les mises à jour récentes.

Catégories et Filtres

Sur le site de Docker Hub, vous pouvez filtrer les résultats de recherche par :

  • Catégories : Base de données, Serveur Web, Outils de Dev, etc.
  • Type de contenu : Images Officielles, Éditeurs Vérifiés.
  • Architecture : amd64 (standard), arm64 (ex: Apple M1/M2, Raspberry Pi).

5. Lancer un conteneur Nginx

Lançons un serveur web Nginx qui tourne en arrière-plan et est accessible depuis notre navigateur.

docker run --name mon-serveur-web -d -p 8080:80 nginx

Détails de la commande :

  • --name mon-serveur-web : Donne un nom lisible à notre conteneur (facultatif mais pratique).
  • -d (detached) : Exécute le conteneur en arrière-plan et affiche l'ID du conteneur.
  • -p 8080:80 (publish) : Mappe le port 8080 de votre machine (hôte) au port 80 à l'intérieur du conteneur (où Nginx écoute).
  • nginx : Le nom de l'image à utiliser.

Note de dépannage :

Si http://localhost:8080 ne fonctionne pas, vérifiez que le port 8080 n'est pas déjà utilisé par une autre application sur votre machine. Si c'est le cas, essayez un autre port (ex: -p 8081:80 et visitez http://localhost:8081).

Ouvrez maintenant votre navigateur et allez sur http://localhost:8080.
Vous devriez voir la page d'accueil de Nginx !

Pour arrêter et supprimer le conteneur :

docker stop mon-serveur-web
docker rm mon-serveur-web

6. Commandes de base : `pull` et `run`

docker pull télécharge une image depuis un registre sans la démarrer.

# Télécharge la dernière image nginx
docker pull nginx

docker run est la commande la plus courante. Elle combine plusieurs étapes :

  1. (Si l'image n'est pas locale) Pull : Télécharge l'image (ex: `nginx`).
  2. Create : Crée un conteneur à partir de l'image.
  3. Start : Démarre le conteneur.

QCM : Testez vos connaissances

1. Quelle est la différence fondamentale entre une VM et un conteneur ?

2. Quel composant de l'architecture Docker est le "serveur" qui gère les images et les conteneurs ?

3. Quelle commande télécharge une image depuis Docker Hub SANS démarrer de conteneur ?

4. Que signifie le paramètre -p 8080:80 ?