# Images et système de fichiers

### Images Docker

Une image Docker est un **fichier** **immuable** qui contient tout le nécessaire pour exécuter une application dans un conteneur.  
Elle contient le code source, les bibliothèques, les dépendances, les variables d'environnement, les configurations, etc.

L'image Docker est une photographie figée d’un environnement logiciel, garantissant que l'application s’exécutera systématiquement de la même manière, indépendamment de son environnement.

Une image Docker est construite à partir d'un fichier de configuration appelé **Dockerfile.** Ce fichier décrit étape par étape comment assembler l'image.

<p class="callout info">Nous reviendrons plus tard sur le Dockerfile.</p>

Une fois construite, une image peut être stockée localement ou poussée vers un registre Docker (comme Docker Hub ou un registre privé), où elle peut être versionnée et partagée.

Pour identifier une image Docker, on utilise la syntaxe suivante :

```
propriétaire/nom:tag
```

- **propriétaire :** correspond à l'utilisateur ou à l'organisation qui possède l'image sur le registre.
- **nom :** le nom de l’image, comme `nginx`, `ubuntu`, etc.
- **tag :** une étiquette qui permet de versionner l'image. Par défaut, si aucun tag n'est spécifié, Docker utilise `latest`.  
    Les tags peuvent représenter des versions (1.0, v2.3.4) ou des environnements (dev, prod).

<p class="callout info">Certaines images "officielles" ne possèdent pas de propriétaire, donc il n'est pas nécessaire de le préciser.</p>

**Quelques exemples :**

```bash
nginx:latest # image officielle de Nginx, version la plus récente.
thibaud/appli:1.2.0 # image personnalisée appartenant à l’utilisateur thibaud, version 1.2.0.
```

### Registry Docker Hub

Comme expliqué ci-dessus, les images Docker doivent être stockées sur un **registre**.

Un registre peut être **public** ou **privé**, par exemple au sein d'une entreprise afin d'y stocker une application propriétaire.

Le registre public et par défaut est le Docker Hub. [🔗 Docker Hub](https://hub.docker.com/search?badges=official&badges=verified_publisher&badges=open_source)

La commande `docker pull` permet de télécharger une image depuis un registre, par défaut le registre public **Docker Hub**.

[![image.png](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/scaled-1680-/0pZ8e1JXEXOVFq4j-image.png)](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/0pZ8e1JXEXOVFq4j-image.png)

Actuellement, l'image `latest` d'Ubuntu correspond à [la version 24.04 sur le Docker Hub](https://hub.docker.com/_/ubuntu).  
Ces trois identifiants retournent la même image, qui n'est téléchargée qu'une seule fois : `ubuntu`, `ubuntu:latest`, `ubuntu:24.04`.

À l'inverse, si je lance un `docker run` sur une image qui n'est pas déjà stockée localement, le téléchargement est automatique depuis le Docker Hub :

[![image.png](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/scaled-1680-/dq7hBWVA66AJdMQs-image.png)](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/dq7hBWVA66AJdMQs-image.png)

La commande `docker image` permet de gérer les images stockées localement.

```bash
docker image ls # lister les images
docker image rm ubutu:18.04 # supprimer l'image ubuntu taggée 18.04
```

[![image.png](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/scaled-1680-/gaB4xpRrpvdJutGM-image.png)](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/gaB4xpRrpvdJutGM-image.png)

### Système de fichiers

L'arborescence des fichiers dans un conteneur Docker est **isolé** du reste de la machine.

Un conteneur Docker contient une arborescence Linux. Exemple ci-dessous :

[![image.png](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/scaled-1680-/TxybcMuoLO2uPg3x-image.png)](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/TxybcMuoLO2uPg3x-image.png)

L'arborescence ci-dessus n'est accessible que depuis le conteneur.

- Le conteneur n'a pas accès à l'arborescence de la machine hôte.
- La machine hôte n'a pas accès à l'arborescence du conteneur.

[![image.png](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/scaled-1680-/sREoYOe8EA55Uaho-image.png)](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/sREoYOe8EA55Uaho-image.png)

### Volatilité

Contrairement à une **image** docker qui est figée, le contenu d'un container est **volatile**.

<p class="callout warning">Lorsqu'un container est supprimé, tous les fichiers modifiés sont perdus !</p>

Exemple :

[![image.png](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/scaled-1680-/UJ9Yu0IiGu97R8Oq-image.png)](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/UJ9Yu0IiGu97R8Oq-image.png)

Les deux conteneurs nommés `test` à partir de l'image `debian` ne sont pas les mêmes : ils n'ont pas le même identifiant.

Les données du premier conteneur sont perdues lors de sa suppression.

<p class="callout info">Nous verrons plus loin les **volumes Docker** qui permettent de stocker des données persistantes.</p>

### Isolation : un exemple avec fastfetch

[![image.png](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/scaled-1680-/1LUeNHgFuW7BHYrZ-image.png)](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/1LUeNHgFuW7BHYrZ-image.png)

<p class="callout success">L'hôte et le conteneur **partagent** quelques éléments tels que le noyau Linux, le CPU, la RAM disponible et l'espace disque.  
À l'inverse, la distribution Linux, les paquets installés et le système de fichier sont **isolés**.</p>