Skip to content

Instantly share code, notes, and snippets.

@DamienDabernat
Last active February 18, 2025 09:59
Show Gist options
  • Save DamienDabernat/6020e0614890ecccae57958f6eabaead to your computer and use it in GitHub Desktop.
Save DamienDabernat/6020e0614890ecccae57958f6eabaead to your computer and use it in GitHub Desktop.

TP2 Approfondir ses connaissances sur la conteneurisation et Docker

Objectif du TP :

  • Approfondir ses connaissances sur la conteneurisation et Docker.
  • Comprendre les enjeux de la conteneurisation.

Rendu :

  • Répondre aux questions écrites dans un fichier de rendu
  • Captures d’écran ou extraits de commandes pour justifier vos résultats

1. Définir les enjeux de la conteneurisation


1.1 Introduction à la conteneurisation

Nous avons déjà vu ce qu’est un conteneur et comment il se différencie d’une machine virtuelle (VM).

Rappel rapide :

  • Conteneur : regroupe une application et ses dépendances, partage le noyau de l’hôte, démarrage très rapide.
  • VM : exécute un OS complet au-dessus d’un hyperviseur, plus lourd.

1.2 Schéma d’un conteneur

Un conteneur se situe entre l’application (plus ses bibliothèques) et le noyau de l’hôte. Il n’y a pas de second noyau comme dans une VM. Visuellement :

  +-------------------------+      +-------------------------+
  |     Application A       |      |     Application B       |
  |  +-------------------+  |      |  +-------------------+  |
  |  |   Dependencies    |  |      |  |   Dependencies    |  |
  +--|-------------------|--+      +--|-------------------|--+
     | Conteneur Runtime |            | Conteneur Runtime |
     +-------------------+            +-------------------+
               |                           |
               ------ OS Kernel (Host) -----
               |
           Hardware 

Chaque conteneur est isolé, mais le noyau (kernel) est mutualisé.


1.3 Lien entre le conteneur et le système d’exploitation

  • Les conteneurs utilisent des namespaces et des cgroups pour s’isoler (processeur, mémoire, réseau).
  • Namespace : permet de créer des environnements isolés (PID, réseau, utilisateur, etc.).
  • Cgroups : contrôle les ressources allouées à un processus (CPU, mémoire, I/O).
  • Ils partagent donc le même kernel que l’OS hôte.
  • Un kernel : c’est le cœur de l’OS, qui gère les ressources matérielles et fournit des services aux applications.
  • Windows : noyau NT, Linux : noyau Linux, macOS : noyau XNU.
  • Un crash du kernel affecte tous les conteneurs, mais un plantage d’appli dans un conteneur ne contamine pas les autres.

1.4 Enjeux et avantages

  • Sécurité : chaque conteneur est isolé, mais attention aux failles partagées du kernel.
    • Exemple : une faille de sécurité dans le kernel Linux affecte tous les conteneurs tournant sur ce kernel.
  • Surveillance et journalisation : Docker fournit une commande docker logs qui affiche les logs d’un conteneur.
    • Exercice rapide : Lancez un conteneur Nginx et utilisez docker logs nom_du_conteneur pour voir son output.

Lancer un conteneur Nginx qui s'appelle "monsite" et voir les logs :

docker run -d --name monsite -p 80:80 nginx:alpine
docker logs monsite

1.4 Enjeux et avantages

  • Gestion et visibilité des coûts (brièvement) : moins de surcharge qu’une VM, meilleure densité de services sur une même machine.
  • Orchestration / Mise à l’échelle (brièvement) : quand on a beaucoup de conteneurs, on utilise des orchestrateurs (Docker Swarm, Kubernetes) pour automatiser le déploiement.

1.5 Lien avec les architectures Cloud

  • Les plateformes Cloud (AWS, GCP, Azure) proposent des services conteneurisés.
  • AWS : Elastic Container Service (ECS), Elastic Kubernetes Service (EKS).
  • GCP : Google Kubernetes Engine (GKE).
  • Azure : Azure Kubernetes Service (AKS).
  • Permet de déployer facilement des conteneurs et de les scaler automatiquement.

Exercice :

  • Trouver combien coûte un conteneur de type f1-micro sur GCP par jour.
  • Trouver combien coûte un conteneur de type t2.micro sur AWS par jour.
  • Comparer les deux prix par rapport à une offre dédiée ou un VPS.
  • Quels sont les avantages et inconvénients de chaque solution ?

2. Concepts Docker


2.1 Concept d’images Docker

  • Une image est une “snapshot” contenant tout le nécessaire pour exécuter une application (fichiers, dépendances).
  • Un conteneur est une instance en cours d’exécution d’une image.
  • Un peu comme le parallèle Class / Object en programmation orientée objet.

2.2 Notion de layers (couches)

  • Chaque instruction dans un Dockerfile crée une couche intermédiaire.
  • Docker réutilise ces couches (mise en cache) pour accélérer les builds.
  • Exemple :
    FROM nginx:alpine        # couche 1
    COPY index.html /usr/share/nginx/html  # couche 2
    Changer index.html modifie seulement la couche 2, la couche 1 reste en cache.

Exercice layers

  1. Créez un Dockerfile avec 2-3 instructions (ex. FROM ubuntu, RUN apt-get update && apt-get install -y curl, echo "Hello" > myfile), COPY myfile /tmp.
  2. Construisez l’image (docker build -t monimage:v1 .).
  3. Modifiez un petit fichier (myfile) et rebuild. Observez les logs pour voir quelles couches sont reconstruites.

Ecrivez vos réponses dans votre fichier de notes.

3. Commandes de base Docker

Voici un rappel des principales commandes :

Commande Description
docker build Construit une image Docker depuis un Dockerfile.
docker run Lance un conteneur depuis une image.
docker search Recherche des images sur Docker Hub.
docker images Liste les images locales.
docker info Affiche les informations sur le daemon Docker.
docker logs Affiche les logs d’un conteneur.
docker container ls Liste les conteneurs (actif ou non avec -a).
docker ps (Alias de docker container ls)
docker stop / kill Arrête / tue un conteneur.
docker rm Supprime un conteneur.
docker rmi Supprime une image locale.
docker prune Nettoie les ressources (conteneurs, volumes, images) non utilisées.

3.1 Déployer une image du registry Docker Hub

Le registry Docker Hub contient des milliers d’images prêtes à l’emploi.

  • Exemple :
    docker pull nginx:alpine
    docker run -d -p 80:80 nginx:alpine
  • docker pull télécharge l’image nginx:alpine.
  • docker run la lance sur le port 80 de la machine hôte.

4. Création d’images et Dockerfile

Une image Docker est créée à partir d’un fichier Dockerfile qui contient les instructions pour construire l’image. Une fois l’image créée, on peut déployer un conteneur depuis cette image. Sans Dockerfile, on ne peut pas créer d’image.


4.1 Écriture d’un Dockerfile

  • Chaque ligne représente une instruction (FROM, RUN, COPY, CMD, etc.).

  • Exemple minimal :

    FROM nginx:alpine
    COPY index.html /usr/share/nginx/html
    • FROM : point de départ (image de base).
    • COPY : copie un fichier local dans l’image.

4.2 Construire l’image

  • Dans le même dossier que votre Dockerfile, tapez :
    docker build -t webserver-image:v1 .
    • -t donne un nom et une version.
    • . indique le contexte de build (dossier courant).

4.3 Déployer un conteneur depuis cette image

  • Lancez :
    docker run -d -p 8080:80 webserver-image:v1
  • Accédez à http://localhost:8080 pour voir votre page HTML.

4.4 Nettoyer un poste de développement

  • Supprimer un conteneur : docker rm monConteneur
  • Supprimer une image : docker rmi monImage
  • Prune : docker system prune (ou docker image prune, docker container prune) pour faire le ménage.

Conclusion

Dans ce cours, vous avez :

  1. Compris l’architecture d’un conteneur et son lien avec le système d’exploitation.
  2. Survolé les enjeux de la conteneurisation (sécurité, logs, coûts, orchestration).
  3. Vu comment Docker s’intègre aux plateformes Cloud.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment