diff --git a/README.md b/README.md index 6aa5744..4a490c6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,32 @@ -# Docker +# Docker - Travaux Pratiques +Bienvenue dans mon dépôt pour les TP Docker. + +## Structure du dépôt + +``` +. +├── README.md # Ce fichier +├── TP1 +│ ├── COMMANDS.md # Liste des commandes utilisées et leurs résultats +│ ├── QUESTIONS.md # Réponses aux questions de compréhension +└── tp0.pdf # Sujet du TP +``` + +## Contenu des TP + +### TP1: Introduction à Docker et Cycle de Vie + +Ce TP couvre les concepts fondamentaux de Docker, incluant: + +- Installation de Docker +- Gestion des images et conteneurs +- Cycle de vie des conteneurs Docker +- Inspection et débogage +- Manipulation des volumes +- ... + +## Navigation dans le dépôt + +- Pour consulter les commandes utilisées pendant le TP avec leurs résultats, consultez le fichier [TP1/COMMANDS.md](./TP1/COMMANDS.md) +- Pour voir les réponses aux questions de compréhension, consultez le fichier [TP1/QUESTIONS.md](./TP1/QUESTIONS.md) diff --git a/TP1/COMMANDS.md b/TP1/COMMANDS.md new file mode 100644 index 0000000..522f230 --- /dev/null +++ b/TP1/COMMANDS.md @@ -0,0 +1,362 @@ +# TP1 - Introduction à docker et cycle de vie + +## Sommaire +2. [Installation](#2-installation) + - [2.1. Installation de Docker](#21-installation-de-docker) + - [2.2. Vérification de l'installation](#22-vérification-de-linstallation) +3. [Premiers pas avec Docker](#3-premiers-pas-avec-docker) + - [3.1. Images Docker](#31-images-docker) + - [3.1.1. Lister les images disponibles](#311-lister-les-images-disponibles) + - [3.1.2. Télécharger une image](#312-télécharger-une-image) + - [3.1.3. Rechercher une image](#313-rechercher-une-image) + - [3.2. Gestion basique des conteneurs](#32-gestion-basique-des-conteneurs) + - [3.2.1. Créer un premier conteneur](#321-créer-un-premier-conteneur) + - [3.2.2. Observer la différence en mode détaché](#322-observer-la-différence-en-mode-détaché) +4. [Cycle de vie des conteneurs](#4-cycle-de-vie-des-conteneurs) + - [4.1. États des conteneurs](#41-états-des-conteneurs) + - [4.1.1. Commandes d'observation](#411-commandes-dobservation) + - [4.1.2. Exercice pratique](#412-exercice-pratique) + - [4.2. Manipulation des états](#42-manipulation-des-états) +5. [Inspection et Debug](#5-inspection-et-debug) + - [5.1. Logs et monitoring](#51-logs-et-monitoring) + - [5.2. Inspection détaillée](#52-inspection-détaillée) +6. [Exercice final](#6-exercice-final) + +## 2. Installation + +### 2.1. Installation de Docker +URL de la page de documentation : https://docs.docker.com/desktop/setup/install/linux/archlinux/ +**Note** : Docker est déjà installé sur le système des machines de l'IUT. + +### 2.2 Vérification de l'installation +```bash +# Vérification de la version installée +sudo docker --version +``` +**Résultat** : +``` +Docker version 27.2.0, build 3ab4256958 +``` + +```bash +# Test de fonctionnement avec l'image "hello-world" +sudo docker run hello-world +``` +**Résultat** : +``` +Hello from Docker! +This message shows that your installation appears to be working correctly. +``` + +## 3. Premiers pas avec Docker + +### 3.1. Images Docker + +#### 3.1.1. Lister les images disponibles +```bash +sudo docker images +``` +**Résultat** : +``` +REPOSITORY TAG IMAGE ID CREATED SIZE + 87a2e3453d58 12 days ago 509MB + 93d79f7e6a26 12 days ago 509MB + 7f2d24628277 12 days ago 509MB +chocolate_app-backend latest d7032a3bdf2f 12 days ago 509MB +[...] +``` + +#### 3.1.2. Télécharger une image +```bash +sudo docker pull nginx +``` +**Résultat** : +``` +Using default tag: latest +latest: Pulling from library/nginx +6e909acdb790: Already exists +5eaa34f5b9c2: Pull complete +417c4bccf534: Pull complete +e7e0ca015e55: Pull complete +373fe654e984: Pull complete +97f5c0f51d43: Pull complete +c22eb46e871a: Pull complete +Digest: sha256:124b44bfc9ccd1f3cedf4b592d4d1e8bddb78b51ec2ed5056c52d3692baebc19 +Status: Downloaded newer image for nginx:latest +docker.io/library/nginx:latest +``` + +#### 3.1.3. Rechercher une image +```bash +sudo docker search ubuntu +``` +**Résultat** : +``` +NAME DESCRIPTION STARS OFFICIAL +ubuntu Ubuntu is a Debian-based Linux operating sys… 17524 [OK] +ubuntu/squid Squid is a caching proxy for the Web. Long-t… 108 +ubuntu/nginx Nginx, a high-performance reverse proxy & we… 128 +ubuntu/cortex Cortex provides storage for Prometheus. Long… 4 +ubuntu/kafka Apache Kafka, a distributed event streaming … 53 +``` + +### 3.2 Gestion basique des conteneurs + +#### 3.2.1. Créer un premier conteneur +```bash +sudo docker run nginx +``` +**Résultat** : +``` +/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration +/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ +/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh +[...] +``` + +#### 3.2.2. Observer la différence en mode détaché +```bash +sudo docker run -d nginx +``` +**Résultat** : +``` +e624c2ff986d10b23dc4836b3a0cb4c89013f0188b48693a307280d96735e0ff +``` + +## 4. Cycle de vie des conteneurs + +### 4.1. États des conteneurs + +#### 4.1.1. Commandes d'observation + +```bash +# Conteneurs en cours d'exécution +sudo docker ps +``` +**Résultat** : +``` +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +e624c2ff986d nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 80/tcp gallant_roentgen +``` + +```bash +# Liste de tous les conteneurs (actifs et inactifs) +sudo docker ps -a +``` +**Résultat** : +``` +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +e624c2ff986d nginx "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 80/tcp gallant_roentgen +1ec88668966f nginx "/docker-entrypoint.…" 9 minutes ago Exited (0) 8 minutes ago musing_kowalevski +f27bbe04a801 hello-world "/hello" 13 minutes ago Exited (0) 13 minutes ago loving_ritchie +8e68c7f4032a hello-world "/hello" 13 minutes ago Exited (0) 13 minutes ago wonderful_proskuriakova +[...] +``` + +#### 4.1.2. Exercice pratique + +1. Création de trois conteneurs nginx avec des noms différents : +```bash +sudo docker run -d --name web1 nginx +``` +**Résultat** : +``` +74ea9e483cdfc65659e8d957de11da91c8e4c8e523f950f5bb140596fb197e90 +``` + +```bash +sudo docker run -d --name web2 nginx +``` +**Résultat** : +``` +10df9341c62a04d78b7ba5649c5e45c865013ea616b21362fbbd026a99e86f90 +``` + +```bash +sudo docker run -d --name web3 nginx +``` +**Résultat** : +``` +1ecd55481aedc61da233a6b26f5b4041f24f2eaa378e9cb44aed4a1180d4c97c +``` + +2. Observation des états des conteneurs : +```bash +sudo docker ps +``` +**Résultat** : +``` +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +1ecd55481aed nginx "/docker-entrypoint.…" 22 seconds ago Up 22 seconds 80/tcp web3 +10df9341c62a nginx "/docker-entrypoint.…" 25 seconds ago Up 25 seconds 80/tcp web2 +74ea9e483cdf nginx "/docker-entrypoint.…" 29 seconds ago Up 28 seconds 80/tcp web1 +e624c2ff986d nginx "/docker-entrypoint.…" 11 minutes ago Up 11 minutes 80/tcp gallant_roentgen +``` + +3. Colonnes importantes dans la sortie de `docker ps` : + - **STATUS** : pour voir le statut actuel du conteneur + - **NAMES** : pour voir le nom attribué au conteneur + - **CONTAINER ID** : pour identifier le conteneur de manière unique + - **PORTS** : pour voir les ports exposés par le conteneur + +### 4.2. Manipulation des états + +```bash +sudo docker stop web1 +``` +**Résultat** : +``` +web1 +``` + +```bash +sudo docker start web1 +``` +**Résultat** : +``` +web1 +``` + +```bash +sudo docker restart web2 +``` +**Résultat** : +``` +web2 +``` + +```bash +sudo docker pause web3 +``` +**Résultat** : +``` +web3 +``` + +```bash +sudo docker unpause web3 +``` +**Résultat** : +``` +web3 +``` + +```bash +sudo docker kill web1 +``` +**Résultat** : +``` +web1 +``` + +## 5. Inspection et Debug + +### 5.1. Logs et monitoring + +```bash +sudo docker logs web3 +``` +**Résultat** : +``` +/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration +/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ +/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh +[...] +[FIN DE L'EXECUTION] +``` + +```bash +sudo docker logs -f web3 +``` +**Résultat** : +``` +/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration +/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ +/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh +[...] +[NE S'ARRETE PAS] +``` + +```bash +sudo docker stats +``` +**Résultat** : +``` +CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS +1ecd55481aed web3 0.00% 12.8MiB / 15.4GiB 0.08% 4.43kB / 0B 0B / 12.3kB 17 +10df9341c62a web2 0.00% 12.62MiB / 15.4GiB 0.08% 2.69kB / 0B 0B / 4.1kB 17 +e624c2ff986d gallant_roentgen 0.00% 12.74MiB / 15.4GiB 0.08% 7.23kB / 0B 0B / 12.3kB 17 +``` + +### 5.2. Inspection détaillée + +```bash +sudo docker inspect web3 +``` +**Résultat** : +```json +[ + { + "Id": "1ecd55481aedc61da233a6b26f5b4041f24f2eaa378e9cb44aed4a1180d4c97c", + "Created": "2025-04-01T13:37:34.201569663Z", + "Path": "/docker-entrypoint.sh", + [...] + } + } +] +``` + +```bash +sudo docker exec -it web3 /bin/bash +``` +**Résultat** : +``` +root@1ecd55481aed:/# +``` +*Note: Cette commande permet d'accéder à un terminal interactif à l'intérieur du conteneur.* + +## 6. Exercice final + +```bash +sudo docker run -d --name web-test nginx +``` +**Résultat** : +``` +c7bd94aad4f8f9f9e24fada2c5eb09c60771852a434a3245561ebda94372ad63 +``` + +```bash +sudo docker ps +``` +**Résultat** : +``` +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +c7bd94aad4f8 nginx "/docker-entrypoint.…" 42 seconds ago Up 41 seconds 80/tcp web-test +1ecd55481aed nginx "/docker-entrypoint.…" 35 minutes ago Up 35 minutes 80/tcp web3 +10df9341c62a nginx "/docker-entrypoint.…" 35 minutes ago Up 6 minutes 80/tcp web2 +e624c2ff986d nginx "/docker-entrypoint.…" 46 minutes ago Up 46 minutes 80/tcp gallant_roentgen +``` + +```bash +sudo docker ps -a +``` +**Résultat** : +``` +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +c7bd94aad4f8 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp web-test +1ecd55481aed nginx "/docker-entrypoint.…" 36 minutes ago Up 36 minutes 80/tcp web3 +10df9341c62a nginx "/docker-entrypoint.…" 36 minutes ago Up 6 minutes 80/tcp web2 +74ea9e483cdf nginx "/docker-entrypoint.…" 36 minutes ago Exited (137) 6 minutes ago web1 +[...] +``` + +```bash +sudo docker logs web-test +``` +**Résultat** : +``` +/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration +/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ +/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh +[...] +``` diff --git a/TP1/QUESTIONS.md b/TP1/QUESTIONS.md new file mode 100644 index 0000000..15d3c07 --- /dev/null +++ b/TP1/QUESTIONS.md @@ -0,0 +1,47 @@ +# Questions de compréhension + +## Sommaire +- [3.2 Mode détaché vs Mode non-détaché](#32-mode-détaché-vs-mode-non-détaché) +- [Question 1](#1-quelle-est-la-différence-entre-une-image-et-un-conteneur) +- [Question 2](#2-expliquez-la-différence-entre-docker-stop-et-docker-kill) +- [Question 3](#3-pourquoi-utilise-t-on-le-mode-détaché) +- [Question 4](#4-comment-vérifier-la-santé-dun-conteneur) +- [Question 5](#5-quels-sont-les-différents-états-possibles-dun-conteneur) + +## 3.2 Mode détaché vs Mode non-détaché + +Quand on utilise la commande `sudo docker run nginx`, le conteneur se lance directement dans le terminal, et on peut voir tous les messages générés pendant le démarrage du serveur Nginx. Cela permet de suivre ce qui se passe à l'intérieur du conteneur, mais l'inconvénient est que l'on reste "bloqué" dans le terminal, et les logs du conteneur continuent à s'afficher. Cela peut être gênant si on n'a pas besoin de ces informations et si on veut simplement que le conteneur fonctionne en arrière-plan. + +En revanche, si on utilise la commande `sudo docker run -d nginx`, cela lance le conteneur en mode détaché, c'est-à-dire en arrière-plan. Dans ce cas, le conteneur démarre sans afficher les logs dans le terminal. Docker renvoie alors un identifiant unique pour le conteneur. Cet identifiant permet de revenir plus tard pour interagir avec le conteneur, par exemple pour vérifier son état ou l'arrêter, sans être dérangé par les messages qui s'afficheraient normalement. + +La différence principale réside donc dans le fait qu'avec la commande sans `-d`, on reste dans le terminal et on voit tous les logs du conteneur, tandis qu'avec l'option `-d`, le conteneur tourne en arrière-plan et on reçoit seulement un ID pour pouvoir gérer le conteneur plus tard. Cela est particulièrement utile quand on veut que le conteneur fonctionne en arrière-plan sans encombrer le terminal. + +## 1. Quelle est la différence entre une image et un conteneur ? + +**Image** : Une image Docker est un fichier statique qui contient tout le nécessaire pour exécuter une application : le système d'exploitation, les bibliothèques, les fichiers d'application, et les configurations. C'est une sorte de "modèle" ou "gabarit" pour créer des conteneurs. Les images sont immuables (elles ne changent pas une fois créées). + +**Conteneur** : Un conteneur est une instance en cours d'exécution d'une image. C'est un environnement isolé qui exécute une application et qui peut interagir avec d'autres conteneurs et services. Les conteneurs sont dynamiques, car vous pouvez les démarrer, arrêter, modifier, etc. + +## 2. Expliquez la différence entre docker stop et docker kill + +**docker stop** : Cette commande permet d'arrêter un conteneur en envoyant un signal SIGTERM (par défaut), puis un signal SIGKILL après un délai de grâce si le conteneur ne se ferme pas proprement. Le conteneur a l'opportunité de terminer ses processus en cours avant de s'arrêter. Cela permet de fermer les applications proprement. + +**docker kill** : Cette commande arrête immédiatement le conteneur en envoyant un signal SIGKILL, ce qui force le conteneur à se terminer sans lui permettre de fermer ses processus de manière ordonnée. Cela arrête le conteneur de manière brutale. + +## 3. Pourquoi utilise-t-on le mode détaché ? + +Le mode détaché (avec l'option `-d` de la commande `docker run`) permet de lancer un conteneur en arrière-plan. Cela permet à l'utilisateur de continuer à travailler sur d'autres tâches dans le terminal tout en maintenant le conteneur en fonctionnement. En mode détaché, le terminal n'est pas bloqué par l'exécution du conteneur, ce qui est utile pour des services de longue durée, comme les serveurs web ou les bases de données. + +## 4. Comment vérifier la santé d'un conteneur ? + +On peut utiliser `docker ps` pour vérifier la santé d'un conteneur. Cette commande affiche tous les conteneurs en cours d'exécution avec leur statut, ce qui permet de s'assurer qu'ils fonctionnent correctement. Pour une inspection plus détaillée, on peut utiliser `docker inspect` pour obtenir des informations complètes sur le conteneur, ou `docker logs` pour examiner les journaux du conteneur. + +## 5. Quels sont les différents états possibles d'un conteneur ? + +Un conteneur peut se trouver dans les états suivants : + +- **Created** : Le conteneur a été créé, mais il n'est pas encore démarré. +- **Running** : Le conteneur est en cours d'exécution. +- **Paused** : Le conteneur est en pause (les processus sont arrêtés temporairement, mais la mémoire et l'état sont conservés). +- **Exited** : Le conteneur a arrêté de fonctionner (normalement ou de manière anormale). Il est toujours présent, mais il ne tourne plus. +- **Dead** : Le conteneur est dans un état "mort", ce qui signifie qu'il a échoué de manière irrécupérable. \ No newline at end of file diff --git a/TP1/docker b/TP1/docker new file mode 100755 index 0000000..cade6fe Binary files /dev/null and b/TP1/docker differ diff --git a/TP1/tp0.pdf b/TP1/tp0.pdf new file mode 100644 index 0000000..5d6a8a6 Binary files /dev/null and b/TP1/tp0.pdf differ