Cours RechercherCtrl K

Docker Leçon 3

Les images

Choisir une image et sa version, faire le ménage, et écrire son propre Dockerfile.

25 min

À la fin de cette leçon, tu sauras

  • Comprendre les étiquettes (tags) et choisir une version précise
  • Télécharger, lister et supprimer des images
  • Écrire un Dockerfile simple

Nom et étiquette

Une image se nomme nom:étiquette. L'étiquette (tag) précise la version ou la variante :

  • nginx:1.27 : la version 1.27 ;
  • nginx:alpine : la variante construite sur Alpine Linux, beaucoup plus légère ;
  • php:8.3-fpm-alpine : PHP 8.3, en mode FPM (pour un serveur web séparé), sur Alpine ;
  • nginx tout court veut dire nginx:latest : « la dernière »… qui change sans prévenir.

Bonne pratique : en production, donne une étiquette précise (postgres:18-alpine plutôt que postgres). Le jour où une nouvelle version majeure sort, ton serveur ne change pas tout seul.

docker pull nginx:alpine       # télécharger sans lancer
docker images                  # la liste, avec la taille
docker rmi hello-world         # supprimer une image (aucun conteneur ne doit l'utiliser)
docker image prune -a          # supprimer toutes les images qu'aucun conteneur n'utilise
docker system df               # la place prise par Docker

Les images s'accumulent vite (chaque mise à jour en télécharge une nouvelle) et finissent par remplir le disque : un docker image prune de temps en temps fait du bien.

Créer sa propre image : le Dockerfile

Un Dockerfile est la recette d'une image : on part d'une image existante et on ajoute ses fichiers et ses réglages, ligne par ligne.

FROM php:8.3-apache                       # l'image de départ
RUN docker-php-ext-install pdo_mysql      # une commande lancée pendant la construction
COPY . /var/www/html/                     # copie le site dans l'image
EXPOSE 80                                 # indique le port utilisé (documentation)
docker build -t monsite:1.0 .            # construit l'image à partir du Dockerfile du dossier courant
docker run -d --name site -p 8080:80 monsite:1.0

Attention : ne copie jamais de mot de passe ou de fichier .env dans une image : toute personne qui récupère l'image peut les lire. Les secrets se donnent au lancement, avec des variables d'environnement (leçon suivante). Un fichier .dockerignore liste ce que COPY doit ignorer.

À retenir

  • Une image se nomme nom:étiquette ; sans étiquette, c'est latest.
  • En production, une étiquette précise : postgres:18-alpine, php:8.3-fpm-alpine.
  • docker pull, docker images, docker rmi, docker image prune -a.
  • Un Dockerfile : FROM (départ), RUN (commande), COPY (fichiers), EXPOSE (port).
  • Jamais de secret dans une image.

Voir la fiche de révision de cette leçon (à imprimer ou à relire avant un contrôle)

Exercice 1 · Faire le ménage

Facile

Un essai a laissé un conteneur test et l'image hello-world.

  1. télécharge (sans la lancer) l'image nginx en variante alpine, et php en 8.3-fpm-alpine ;
  2. essaie de supprimer l'image hello-world et lis l'erreur ;
  3. supprime d'abord le conteneur test, puis l'image ;
  4. affiche les images restantes.
commandes.sh
eleve@cours: ~

Tape tes commandes ici ou dans le fichier à gauche : chaque commande tapée dans le terminal est ajoutée au fichier.

Consignes à réussir

  • À faire : nginx:alpine est téléchargée
  • À faire : php:8.3-fpm-alpine est téléchargée
  • À faire : Le conteneur test est supprimé
  • À faire : L'image hello-world est supprimée
  • À faire : Les images sont listées à la fin
Toujours bloqué ? Voir une solution
# état du serveur (ne pas modifier)
docker run --name test hello-world

# à toi :
docker pull nginx:alpine
docker pull php:8.3-fpm-alpine
docker rmi hello-world
docker rm test
docker rmi hello-world
docker images

Exercice 2 · Ton premier Dockerfile

Moyen

Écris le Dockerfile d'un site PHP :

  1. pars de l'image php en version 8.3-apache (une étiquette précise, pas latest) ;
  2. installe l'extension pdo_mysql avec docker-php-ext-install ;
  3. copie le contenu du dossier site/ dans /var/www/html/ ;
  4. indique que le conteneur utilise le port 80.

Ne copie pas le fichier .env : il contient le mot de passe de la base.

Dockerfile
Console

Clique sur ▶ Exécuter (ou Ctrl + Entrée) pour lancer ton programme.

Consignes à réussir

  • À faire : FROM php:8.3-apache en première instruction
  • À faire : pdo_mysql est installée
  • À faire : Le dossier site/ est copié dans /var/www/html/
  • À faire : Le port 80 est indiqué
  • À faire : Le fichier .env n'est pas copié
  • À faire : Pas d'étiquette latest
Toujours bloqué ? Voir une solution
# Le Dockerfile du site
FROM php:8.3-apache
RUN docker-php-ext-install pdo_mysql
COPY site/ /var/www/html/
EXPOSE 80

Quiz

1Quelle image correspond à nginx sans étiquette ?
2Pourquoi docker rmi nginx peut-il échouer ?
3Quelle instruction choisit l'image de départ d'un Dockerfile ?