Archives Wild Code School
Docker

Docker - Le Dockerfile

Quête 6 sur 8 · 1 image archivée

Introduction

Dans cette quête, tu vas explorer un des fondements de Docker : La construction d'images. Jusqu'à présent lorsque tu as utilisé Docker, tu t'es servi d'images préexistantes. Cette quête va te permettre de personnaliser ces images pour créer tes propres images à l'aide d'un fichier Dockerfile.

Image Dockerfile https://www.data-transitionnumerique.com/

🤓 Objectifs :

✅ Apprendre à créer, gérer et utiliser des images Docker à l'aide de Dockerfile. ✅ Explorer les bonnes pratiques pour la construction des Dockerfiles.

Sommaire

spacer

:point_right: Rappel sur les images et les layers

Les images sont les éléments fondamentaux de l'écosystème Docker, servant de blocs de construction pour les conteneurs. Elles encapsulent l'ensemble des dépendances nécessaires à l'exécution d'une application, fournissant ainsi un environnement isolé et reproductible.

Info

Si on compare une image Docker à une une boite qui contient tout ce dont ton application a besoin pour fonctionner, le Dockerfile est comme le plan détaillé nécessaire pour construire ta propre boite. Chaque ligne de ce plan représente une instruction spécifique, allant de la sélection de la boîte de base à l'ajout des dernières touches personnalisées.

https://docs.docker.com/build/guide/layers/

spacer

Quelques commandes utiles :

Lister les images disponibles sur le Docker Hub : docker search <mot-clé>

bash
wilder@docker1:~$ docker search ubuntu
NAME                             DESCRIPTION                                     STARS     OFFICIAL
ubuntu                           Ubuntu is a Debian-based Linux operating sys…   16978     [OK]
ubuntu-debootstrap               DEPRECATED; use "ubuntu" instead                52        [OK]
open-liberty                     Open Liberty multi-architecture images based…   64        [OK]
neurodebian                      NeuroDebian provides neuroscience research s…   107       [OK]
websphere-liberty                WebSphere Liberty multi-architecture images …   298       [OK]
ubuntu-upstart                   DEPRECATED, as is Upstart (find other proces…   115       [OK]
ubuntu/nginx                     Nginx, a high-performance reverse proxy & we…   112
ubuntu/squid                     Squid is a caching proxy for the Web. Long-t…   88
...
Bravo

Tu verras une liste de résultats de recherche affichant le nom de l'image, une brève description, le nombre de stars (notations) et le nombre de pulls (téléchargements).

Info

Tu peux aussi te rendre directement sur le Docker Hub avec ton navigateur et parcourir une vaste gamme d'images Docker.

Télécharger une image sur ton système local : docker pull <nom-de-l'image>

bash
wilder@docker1:~$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
bccd10f490ab: Pull complete
Digest: sha256:77906da86b60585ce12215807090eb327e7386c8fafb5402369e421f44eff17e
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
Bravo

Lorsque tu télécharges une image Docker, elles sont stockées localement dans un répertoire spécifique du système de fichiers de Docker. L'emplacement précis peut varier en fonction de ton système d'exploitation et de la configuration de Docker.

Sur un système Linux, les images Docker sont généralement stockées dans le répertoire /var/lib/docker. À l'intérieur de ce répertoire, les images sont organisées dans différents sous-répertoires en fonction de leur type et de leur utilisation.

Info

Tu n'es pas obligé de télécharger une image Docker avant de créé un conteneur basé sur cette image. En effet, lorsque tu exécutes la commande docker run <image> pour lancer un conteneur à partir d'une image Docker, Docker vérifie d'abord si l'image spécifiée est présente dans son cache. Si l'image n'est pas trouvée dans le cache local, Docker se charge automatiquement de la télécharger depuis le Docker Hub avant de lancer le conteneur.

Vérifier les images présentent sur ta machine : docker images

bash
wilder@docker1:~$ docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
alpine_bash           v1.0      e45510103845   18 hours ago    11.6MB
debian-figlet         latest    87e76ac3c1c8   2 weeks ago     138MB
debian                latest    c978d997d5fe   3 weeks ago     117MB
wordpress             latest    1906608f01fe   3 weeks ago     737MB
ubuntu                latest    ca2b0f26964c   5 weeks ago     77.9MB
nginx                 latest    92b11f67642b   7 weeks ago     187MB
alpine                latest    05455a08881e   2 months ago    7.38MB
mysql                 5.7       5107333e08a8   3 months ago    501MB
busybox               latest    ba5dc23f65d4   10 months ago   4.26MB
Bravo

Dans cette sortie, tu trouveras :

  • REPOSITORY : le nom du dépôt de l'image.
  • TAG : la balise de l'image, qui représente une version spécifique de l'image.
  • IMAGE ID : l'identifiant unique de l'image.
  • CREATED : la date à laquelle l'image a été créée.
  • SIZE : la taille de l'image.

Supprimer une image Docker de ton système hôte : docker rmi <ID> ou <NOM:TAG>

bash
# Supprimer une image par son nom et sa balise
wilder@docker1:~$ docker rmi ubuntu:latest
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:77906da86b60585ce12215807090eb327e7386c8fafb5402369e421f44eff17e
Deleted: sha256:ca2b0f26964cf2e80ba3e084d5983dab293fdb87485dc6445f3f7bbfc89d7459
Deleted: sha256:5498e8c22f6996f25ef193ee58617d5b37e2a96decf22e72de13c3b34e147591

# Supprimer une image par son ID
wilder@docker1:~$ docker rmi ca2b0f26964c
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:77906da86b60585ce12215807090eb327e7386c8fafb5402369e421f44eff17e
Deleted: sha256:ca2b0f26964cf2e80ba3e084d5983dab293fdb87485dc6445f3f7bbfc89d7459
Deleted: sha256:5498e8c22f6996f25ef193ee58617d5b37e2a96decf22e72de13c3b34e147591
Info

Assure toi de ne pas avoir de conteneurs en cours d'exécution utilisant cette image, car Docker ne te permettra pas de supprimer une image utilisée par un conteneur actif. Si tu veux supprimer une image utilisée par un conteneur, tu dois d'abord supprimer ce conteneur avant de pouvoir supprimer l'image.

:point_right: Créer une image Docker

L'une des pratiques les plus fondamentales et puissantes avec Docker est la capacité de créer tes propres images personnalisées.

Lorsque tu envisages de créer ta propre image Docker, tu as deux options principales :

  • Transformer un conteneur existant en une image Docker
  • Rédiger un fichier Dockerfile pour définir les étapes de construction de votre image.
Attention

Bien que la méthode basée sur le build d'une image à partir d'un conteneur soit simple et rapide, elle présente un gros inconvénient : elle ne fournit pas de trace claire des étapes de construction de l'image. C'est pourquoi il est recommandé d'utiliser plutôt un fichier Dockerfile.


:point_right: Le Dockerfile

Qu'est-ce qu'un Dockerfile

Un Dockerfile est un fichier texte simple qui contient une série d'instructions permettant de décrire les étapes nécessaires à la construction d'une image Docker. Il agit comme un script de construction pour générer automatiquement une image Docker complète et prête à être utilisée.

Tu pourrais partir de zéro pour construire une image (from scratch), mais généralement, tu te base sur une image déjà existante.

Structure d'un Dockerfile

Un Dockerfile est composé d'un ensemble d'instructions, chaque instruction étant une étape distincte dans le processus de construction de l'image. Il est important de noter que chaque instruction est écrite en lettre majuscule, suivie de l'argument en minuscule.

Voici un exemple de structure typique d'un Dockerfile

bash
# Syntaxe de commentaire : tout ce qui suit un '#' est ignoré  
# Étape 1 : Sélection de l'image de base 
FROM ubuntu:latest  
# Étape 2 : Mise à jour des packages et installation des dépendances 
RUN apt-get update && apt-get install -y package1 package2 package3  
# Étape 3 : Copie des fichiers de l'hôte dans l'image 
COPY /chemin/local /chemin/destination  
# Étape 4 : Exécution de commandes lors du lancement du conteneur 
CMD ["commande", "argument1", "argument2"]`

Principales instructions Dockerfile

  • FROM : Spécifie l'image de base à utiliser pour construire l'image. Cette instruction est obligatoire et doit figurer en haut du Dockerfile.

  • RUN : Exécute des commandes dans l'image en cours de construction. Ces commandes peuvent être des mises à jour du système, des installations de logiciels, etc.

  • COPY : Copie des fichiers depuis l'hôte dans l'image. Utile pour inclure des fichiers de configuration, des scripts, etc.

  • CMD : Définit la commande par défaut à exécuter lors du lancement du conteneur à partir de l'image. Il ne peut y avoir qu'une seule instruction CMD dans un Dockerfile, bien que tu puisses spécifier plusieurs arguments.

D'autres instructions comme EXPOSE, WORKDIR, ENV, ENTRYPOINT, etc., permettent de définir des ports à exposer, le répertoire de travail par défaut, des variables d'environnement, le programme de base avec lequel sera lancé la commande, etc.

↗
https://docs.docker.com/reference/dockerfile/

Tu peux t'aider de la documentation officielle de Docker pour connaître les différentes directives utilisables dans un Dockerfile, d'ailleurs il est vivement recommandé de la parcourir ;)

docs.docker.com

Exemple de Dockerfile

Voici un exemple de Dockerfile pour créer une image Docker d'une base de données PostgreSQL :

bash
# Utiliser l'image officielle PostgreSQL en tant qu'image de base 
FROM postgres:latest  
# Définir les variables d'environnement pour le nom de l'utilisateur PostgreSQL et le mot de passe 
ENV POSTGRES_USER myuser 
ENV POSTGRES_PASSWORD mypassword  
# Créer une base de données par défaut lors du démarrage du conteneur 
ENV POSTGRES_DB mydatabase  
# Exposer le port par défaut de PostgreSQL 
EXPOSE 5432

Dans cet exemple :

  • On utilise l'image officielle de PostgreSQL comme image de base, avec la dernière version disponible.
  • Nous définissons les variables d'environnement POSTGRES_USER, POSTGRES_PASSWORD et POSTGRES_DB pour spécifier le nom d'utilisateur, le mot de passe et le nom de la base de données à créer par défaut lors du démarrage du conteneur.
  • Nous exposons le port par défaut de PostgreSQL, qui est 5432.
Bravo

Ce Dockerfile serait utilisé pour construire une image Docker de PostgreSQL avec les configurations spécifiées. Tu peux ensuite utiliser cette image pour exécuter des conteneurs PostgreSQL avec les paramètres prédéfinis.

Construire une image d'après le Dockerfile

Pour construire une image Docker à partir d'un Dockerfile, utilise la commande docker build.

Voici comment cela fonctionne

  1. 1

    Step 1

    Assure toi que tu es dans le répertoire contenant ton Dockerfile.

  2. 2

    Step 2

    Utilise la commande docker build avec le chemin vers le répertoire contenant ton Dockerfile.

    Par exemple :

    docker build -t nom_image:tag .

    Dans cette commande :

    • -t nom_image:tag permet de spécifier le nom et la version (tag) de ton image Docker. Tu peux choisir le nom que tu souhaites pour l'image, ainsi qu'une version spécifique si nécessaire.
    • Le . à la fin de la commande indique que le Dockerfile se trouve dans le répertoire actuel, il s'agit du contexte.
    Info

    L'utilisation appropriée des tags lors de la construction d'une image Docker est essentielle pour garantir la cohérence et la traçabilité de tes images dans un environnement professionnel. Les tags permettent d'identifier de manière unique une version spécifique des images, ce qui facilite la gestion des différentes versions des applications ou des services.

  3. 3

    Step 3

    Docker va alors lire les instructions du Dockerfile, les exécuter séquentiellement et créer une nouvelle image Docker basée sur ces instructions. Une fois que le processus de construction est terminé, Docker affichera un message indiquant que l'image a été construite avec succès.

spacer

Par exemple, pour le Dockerfile suivant :

bash
wilder@docker1:~/mon_projet_docker$ cat Dockerfile
FROM ubuntu:latest
RUN apt update && apt install python3 -y

Voici la sortie que tu peux voir lors de la construction de l'image :

bash
wilder@docker1:~/mon_projet_docker$ docker build -t mon_ubuntu_perso:V1.0 .
[+] Building 25.6s (6/6) FINISHED                                                                docker:default
 => [internal] load build definition from Dockerfile                                                       0.0s
 => => transferring dockerfile: 97B                                                                        0.0s
 => [internal] load metadata for docker.io/library/ubuntu:latest                                           0.0s
 => [internal] load .dockerignore                                                                          0.0s
 => => transferring context: 2B                                                                            0.0s
 => CACHED [1/2] FROM docker.io/library/ubuntu:latest                                                      0.0s
 => [2/2] RUN apt update && apt install python3 -y                                                        24.4s
 => exporting to image                                                                                     1.1s
 => => exporting layers                                                                                    1.1s
 => => writing image sha256:74a2de4928f861a5d8d83bb059343ce23bc117d983da3eab6ccd2cd34fe2e2a9               0.0s
 => => naming to docker.io/library/mon_ubuntu_perso:V1.0                                                   0.0s
Bravo

Dans cet exemple, Docker construit une image à partir d'une image Ubuntu, met à jour le cache apt, installe Python3, et termine la construction de l'image avec succès.

Une fois que ton image est construite, tu peux la voir répertoriée en utilisant la commande docker images.

bash
wilder@docker1:~/mon_projet_docker$ docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
mon_ubuntu_perso      V1.0      74a2de4928f8   6 seconds ago   158MB
ubuntu                latest    ca2b0f26964c   5 weeks ago     77.9MB
Info

As-tu remarqué la différence de taille entre l'image de base ubuntu et ton image mon_ubuntu_perso ?

Comment se fait-il que la différence soit si grande alors que nous avons seulement installé python3 ? (pour information, normalement la taille est de 23.5 MB pour python3 et ses dépendances)

:u[Réponse] : la première commande effectuée est apt update , les 56.6 MB supplémentaires représentent donc la mise à jour du cache apt.

On peut donc en conclure que l'image de base ubuntu n'embarque pas ce cache, ce qui est une bonne pratique de construction d'images !!!

Publier des images vers un registre

Pour partager tes images Docker avec d'autres utilisateurs ou pour les utiliser sur d'autres systèmes, tu peux les publier vers un registre Docker.

↗
https://www.it-connect.fr/comment-publier-une-image-dockerfile-sur-le-referentiel-docker-hub/

Tu trouveras, en cliquant sur ce lien, un tuto pour publier une image sur Docker Hub.

it-connect.fr

Avantages de l'utilisation d'un Dockerfile

  • Reproductibilité : En utilisant un Dockerfile, tu peux garantir que chaque membre de ton équipe utilise la même configuration pour construire l'image, assurant ainsi la reproductibilité du processus.

  • Transparence : Le Dockerfile agit comme une documentation vivante du processus de construction de l'image, offrant une transparence totale sur les étapes impliquées.

  • Flexibilité : Tu peux facilement personnaliser le processus de construction en ajoutant, supprimant ou modifiant des instructions dans le Dockerfile pour répondre aux besoins spécifiques de ton application.


:point_right: Ton premier Dockerfile

Maintenant que nous avons couvert les bases, je te propose de créer ta première image Docker d'un serveur web Nginx. Cette image aura une page d'accueil personnalisée qui sera servie depuis l'hôte Docker.

On pourrait obtenir un conteneur fonctionnel qui répond à notre besoin en utilisant plusieurs commandes ad-hoc, en ayant pris soin préalablement de créer notre fichier à destination du serveur web nginx.

Les commandes pourraient ressembler à ceci :

bash
# Vérification du contenu du fichier index.html de l'hôte :
wilder@docker1:~$ cat index.html
<h1>Bienvenue sur mon serveur Nginx !</h1>

# Création du conteneur :
wilder@docker1:~$ docker run -d -p 80:80 --name mon-nginx nginx:latest
ed78fb64ca1dec6ae66ffb26a8e66221d71f52f0ca3b259cea0e93a1c447e926

# Copie du fichier index.html de l'hôte vers le conteneur :
wilder@docker1:~$ docker cp index.html mon-nginx:/usr/share/nginx/html/index.html

Notre conteneur est bien fonctionnel et joignable sur le port 80 de l'hôte :

bash
wilder@docker1:~$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                               NAMES
ed78fb64ca1d   nginx:latest   "/docker-entrypoint.…"   9 seconds ago   Up 8 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   mon-nginx

wilder@docker1:~$ curl 127.0.0.1:80
<h1>Bienvenue sur mon serveur Nginx !</h1>
spacer

Ces commandes ad-hoc permettent d'arriver à un résultat similaire à ce que l'on souhaite faire, sauf que l'on dispose d'un conteneur, et non pas d'une image.

Nous allons réaliser une image qui réponde à notre besoin.

On peut découper les commandes ad-hoc précédentes en différentes instructions :

  • L'image de base utilisée : nginx:latest
  • La copie du fichier index.html de l'hôte vers le conteneur
  • L'exposition du port 80 du conteneur sur le port 80 de l'hôte Docker

Avant de commencer à écrire ton Dockerfile, tu dois organiser ton projet et créer un dossier dédié pour ton application Docker.

bash
wilder@docker1:~$ mkdir mon_projet_docker
wilder@docker1:~$ cd mon_projet_docker
wilder@docker1:~/mon_projet_docker$ touch Dockerfile

Tu devras aussi créer le fichier index.html à l'intérieur de ton dossier de projet.

bash
wilder@docker1:~/mon_projet_docker$ cat index.html
<h1>Bienvenue sur mon serveur Nginx cree a partir de mon image !!!!</h1>

La structure de ton dossier ressemblera à ceci :

bash
wilder@docker1:~$ tree
.
├── mon_projet_docker
    └── Dockerfile
    └── index.html

Tu es maintenant prêt à commencer à rédiger les instructions de ton Dockerfile pour définir le processus de construction de ton image Docker.

Tu peux ouvrir le fichier Dockerfile dans ton éditeur de texte et commencer à écrire tes instructions Docker.

bash
wilder@docker1:~/mon_projet_docker$ nano Dockerfile
  1. 1

    Step 1 - FROM

    Utilisation de l'image officielle Nginx

    bash
    FROM nginx:latest
    
  2. 2

    Step 2 - COPY

    Copie du fichier index.html local vers le répertoire de configuration Nginx dans l'image

    bash:2
    COPY index.html /usr/share/nginx/html
    
  3. 3

    Step 3

    Exposer le port 80 pour le trafic web

    bash:3
    EXPOSE 80
    

Notre fichier Dockerfile :

bash
# Utilisation de l'image officielle Nginx
FROM nginx:latest

# Copie du fichier index.html local vers le répertoire de configuration Nginx dans l'image
COPY index.html /usr/share/nginx/html

# Exposer le port 80 pour le trafic web
EXPOSE 80
spacer

Il ne nous reste plus qu'a créer notre image :

bash
# Build de notre image :
wilder@docker1:~/mon_projet_docker$ docker build -t mon-nginx:v1.0 .
[+] Building 0.1s (7/7) FINISHED                                                                                                                docker:default
 => [internal] load build definition from Dockerfile                                                                                                      0.0s
 => => transferring dockerfile: 282B                                                                                                                      0.0s
 => [internal] load metadata for docker.io/library/nginx:latest                                                                                           0.0s
 => [internal] load .dockerignore                                                                                                                         0.0s
 => => transferring context: 2B                                                                                                                           0.0s
 => [internal] load build context                                                                                                                         0.0s
 => => transferring context: 495B                                                                                                                         0.0s
 => [1/2] FROM docker.io/library/nginx:latest                                                                                                             0.0s
 => [2/2] COPY index.html /usr/share/nginx/html                                                                                                           0.0s
 => exporting to image                                                                                                                                    0.0s
 => => exporting layers                                                                                                                                   0.0s
 => => writing image sha256:b160a8d1a401f7fbaff10daa3dc06ea44a0945ce0372ead5b8432bde24523e44                                                              0.0s
 => => naming to docker.io/library/mon-nginx:v1.0                                                                                                         0.0s

# Vérification de notre image :
wilder@docker1:~/mon_projet_docker$ docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
mon-nginx             v1.0      b160a8d1a401   6 minutes ago   187MB
Attention

Fais bien attention à renseigner le contexte lors du build de l'image, ici représenté par un . à la fin de la commande build .

Nous allons créér un conteneur à partir de notre image et vérifier la page d'accueil du serveur nginx :

bash
wilder@docker1:~/mon_projet_docker$ docker run -d --name my-nginx  -p 80:80 mon-nginx:v1.0
17ed6a61677f56f97bbf1391657e99cb6f64fb3a255966b5dc88268835cbb851

wilder@docker1:~/mon_projet_docker$ docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS         PORTS                               NAMES
17ed6a61677f   mon-nginx:v1.0   "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   my-nginx

wilder@docker1:~/mon_projet_docker$ curl 127.0.0.1:80
<h1>Bienvenue sur mon serveur Nginx créé à partir de mon image !!!!</h1>
spacer

Parfait, tout fonctionne comme prévu :+1:


:point_right: Quelques bonnes pratiques

Avant de clôturer cette quête, voici quelques bonnes pratiques à garder à l'esprit lors de la création d'images Docker et de la rédaction de tes Dockerfile :

  1. Minimiser la taille de l'image : Essaye de réduire autant que possible la taille de tes images Docker. Utilise des images de base légères comme Alpine Linux et évite d'inclure des éléments inutiles dans ton conteneur.

  2. Utiliser des images de base appropriées : Choisis des images de base adaptées à ton application. Par exemple, si tu développes une application Node.js, utilise une image Node.js officielle comme base.

  3. Diviser les commandes RUN : Lorsque tu utilises la commande RUN dans ton Dockerfile, regroupe les commandes similaires en une seule instruction pour réduire le nombre de couches dans l'image finale.

Par exemple, au lieu d'écrire plusieurs commandes RUN séparées pour installer des packages et nettoyer les caches dans un Dockerfile, tu peux les combiner en une seule commande RUN. Cela permet d'éviter la création de couches supplémentaires dans l'image Docker pour chaque commande individuelle, ce qui contribue à réduire la taille de l'image finale.

Exemple :

bash
# Mauvaise pratique : commandes RUN séparées
RUN apt-get update 
RUN apt-get install -y package1 package2 
RUN apt-get clean  

# Bonne pratique : commandes RUN combinées 
RUN apt-get update && apt-get install -y package1 package2 && apt-get clean
  1. Éviter les secrets dans le Dockerfile : Ne stocke pas de secrets sensibles tels que les mots de passe ou les clés d'API directement dans ton Dockerfile !!! Utilise plutôt des variables d'environnement ou des volumes secrets pour fournir ces informations de manière sécurisée.

  2. Nettoyer les dépendances inutiles : Assure toi de supprimer les dépendances inutiles et les fichiers temporaires après l'installation des packages et la construction de ton application dans le Dockerfile. Cela permet de réduire la taille de l'image finale.

bash
# Supprimer les caches de package :
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Supprimer les fichiers temporaires :
RUN rm -rf /tmp/*
# Supprimer les logs :
RUN rm -rf /var/log/*
# Supprimer les caches de langage
RUN apt-get autoremove -y && apt-get clean && rm -rf /var/lib/apt/lists/* \ /var/cache/apt/archives/* /tmp/* /var/tmp/*
  1. Utiliser .dockerignore : Crée un fichier .dockerignore pour exclure les fichiers et répertoires non pertinents lors de la construction de l'image. Cela permet d'accélérer le processus de construction et de réduire la taille de l'image. Le fichier .dockerignore est utilisé pour spécifier les fichiers et répertoires à exclure lors de la construction de l'image Docker. Il fonctionne de manière similaire à un fichier .gitignore dans un projet Git, mais au lieu de spécifier les fichiers à ignorer lors de la création d'un dépôt Git, il spécifie les fichiers à ignorer lors de la construction de l'image Docker.

Voici un exemple simple de contenu d'un fichier .dockerignore :

bash
# Ignorer les fichiers et répertoires spécifiques
*secret*  
.git 
*.log  
# Ignorer tous les fichiers d'un type spécifique 
*.tmp  
# Ignorer tous les fichiers dans un répertoire spécifique 
logs/
  1. Configurer correctement les variables d'environnement : Utilise des variables d'environnement pour configurer dynamiquement ton application. Cela rend ton image plus flexible et portable entre différents environnements et facilite le déploiement et la configuration de ton application pour les nouveaux utilisateurs ou les membres de l'équipe.

📝 Quiz

quiz
true||true|||false
# Quelle commande Docker permet de lister les images téléchargées localement ?
[] docker list 
[x] docker images 
[] docker search 
[] docker pull
# Comment supprimer une image Docker du cache local ?
[] docker remove <image> 
[] docker delete <image> 
[x] docker rmi <image> 
[] docker erase <image>
# Qu'est-ce qu'un Dockerfile ?
[] Un format de fichier pour stocker des images Docker 
[x] Un fichier de configuration pour construire une image Docker 
[] Un fichier de documentation pour les projets Docker 
[] Un fichier de sauvegarde pour les conteneurs Docker
# Quelle est l'utilité d'un Dockerfile ?
[] Il permet de lancer des conteneurs Docker
[] Il permet de lister les images disponibles sur le Docker Hub
[x] Il permet de créer des images Docker personnalisées en décrivant les étapes de construction
[] Il permet de rechercher des images sur le Docker Hub
# Dans un Dockerfile, quelle est l'instruction qui copie des fichiers depuis l'hôte dans l'image Docker ?
[] RUN
[x] COPY
[] CMD
[] EXPOSE
# Dans un Dockerfile, quelle instruction Docker permet d'exposer un port dans une image Docker ?
[] RUN
[] COPY
[] CMD
[x] EXPOSE
# Quelle commande permet de construire une image Docker à partir d'un Dockerfile ?
[] docker start
[] docker run
[] docker create
[x] docker build
# Comment spécifie-t-on la version d'une image Docker lors de sa construction ?
[] Avec l'option -version
[] Avec l'option -tag
[] Avec l'option -v
[x] Avec l'option -t
# Pourquoi est-il recommandé d'utiliser un fichier Dockerfile plutôt que de transformer un conteneur existant en une image Docker ?
[x] Parce que cela garantit une trace claire des étapes de construction de l'image
[] Parce que cela rend le processus de construction plus rapide
[] Parce que cela garantit que les images seront toujours à jour
[] Parce que cela rend les images plus légères
# Quelle est la meilleure pratique pour minimiser la taille des images Docker ?
[] Utiliser des machines virtuelles au lieu de conteneurs 
[] Regrouper plusieurs applications dans une seule image 
[x] Utiliser des images de base légères comme Alpine Linux
spacer

💪 Challenge

Dans ce challenge, tu devras mettre en application certains concepts abordés dans cette quête.

:u[Objectif : ] Créer une image Docker contenant un script qui affiche "Hello Wilder from container [nom du container]" lorsqu'un conteneur basé sur cette image est lancé.

Bravo

:dart: Tu publieras ton image sur le DockerHub et fournira un lien vers cette image comme solution au challenge.

:u[Instructions :]

  1. Crée un script sur ton hôte Docker nommé hello_wilder.sh qui affiche "Hello Wilder from container [nom du container]". Assure toi que ce script est exécutable et que [nom du container] se rapporte à une variable capable de récupérer le nom du conteneur.

  2. Crée un Dockerfile et alimente-le pour répondre à la demande :

    • Image de base
    • Copie du script
    • Commande par défaut qui lance le script hello_wilder.sh
  3. Construit ton image personnalisée.

  4. Teste ton image en instanciant un conteneur basé sur ton image.

  5. Optimise ton image : explore les différents moyens qui permettent de réduire ton image sans compromettre sa fonctionnalité.

  6. Poste ton image sur le Docker Hub

:u[Conseils : ]

Explore la documentation Docker pour en savoir plus sur les meilleures pratiques en matière de création d'images Docker optimisées. N'hésite pas à expérimenter et à rechercher des solutions en ligne si tu rencontres des difficultés.

🧐 Critères d'acceptation

  • L'image Docker est construite avec succès et répond à la demande
  • La taille de l'image est minimisée autant que possible