# 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
<none>                    <none>       87a2e3453d58   12 days ago     509MB
<none>                    <none>       93d79f7e6a26   12 days ago     509MB
<none>                    <none>       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
[...]
```
