Docker Leçon 3
Les images
Choisir une image et sa version, faire le ménage, et écrire son propre Dockerfile.
À 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 ;nginxtout court veut direnginx: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 DockerLes 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.0Attention : 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'estlatest. - 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 ✓ RéussiUn essai a laissé un conteneur test et l'image hello-world.
- télécharge (sans la lancer) l'image
nginxen variantealpine, etphpen8.3-fpm-alpine; - essaie de supprimer l'image
hello-worldet lis l'erreur ; - supprime d'abord le conteneur
test, puis l'image ; - affiche les images restantes.
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
Bravo, cet exercice est réussi !
- Indice 1 :
docker pull nginx:alpineetdocker pull php:8.3-fpm-alpine. - Indice 2 :
docker rmi hello-worldrefuse : le conteneurtestl'utilise encore. - Indice 3 :
docker rm test, puisdocker rmi hello-worldetdocker images.
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 ✓ RéussiÉcris le Dockerfile d'un site PHP :
- pars de l'image
phpen version8.3-apache(une étiquette précise, paslatest) ; - installe l'extension
pdo_mysqlavecdocker-php-ext-install; - copie le contenu du dossier
site/dans/var/www/html/; - indique que le conteneur utilise le port
80.
Ne copie pas le fichier .env : il contient le mot de passe de la base.
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
Bravo, cet exercice est réussi !
- Indice 1 : Chaque ligne commence par une instruction en majuscules :
FROM,RUN,COPY,EXPOSE. - Indice 2 :
FROM php:8.3-apache, puisRUN docker-php-ext-install pdo_mysql. - Indice 3 :
COPY site/ /var/www/html/(copier tout le dossier courant avecCOPY .embarquerait le .env), puisEXPOSE 80.
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