Conteneurs et images : premières commandes Docker

Première leçon du cours Docker et déploiement, en accès libre : environ 15 minutes, 3 exercices et 3 questions de quiz. C'est la leçon de base du catalogue ; dans l'espace étudiant, elle est réécrite pour ton profil.

Objectifs

  • Expliquer la différence entre image, conteneur et machine virtuelle
  • Lancer, inspecter et arrêter un conteneur avec la CLI Docker
  • Publier un port et monter un volume

ConteneursImagesCLI Docker

« Ça marche sur ma machine » : la phrase que tout développeur a déjà entendue. L’application fonctionne en local, mais en production la version de Node, une bibliothèque système ou une variable d’environnement diffère. Docker règle ce problème en empaquetant l’application avec tout son environnement dans une image qui s’exécute de la même façon partout.

Le vocabulaire

  • Image : modèle en lecture seule (système de fichiers + métadonnées), construit en couches successives. Exemple : node:22-slim.
  • Conteneur : une instance en cours d’exécution d’une image, avec sa propre couche inscriptible. On peut lancer dix conteneurs à partir d’une même image.
  • Registre : dépôt d’images (Docker Hub, GitHub Container Registry, registres des clouds).

Contrairement à une machine virtuelle, un conteneur n’embarque pas de système d’exploitation complet : il partage le noyau de l’hôte et s’isole grâce aux namespaces et cgroups de Linux. Il démarre en une fraction de seconde et pèse quelques dizaines de Mo.

Le cycle de vie d’un conteneur

# Télécharger une image depuis Docker Hub
docker pull nginx:1.27-alpine

# Lancer un conteneur en arrière-plan (-d), nommé, port 8080 de l'hôte -> 80 du conteneur
docker run -d --name web -p 8080:80 nginx:1.27-alpine
# http://localhost:8080 affiche la page d'accueil de nginx

docker ps                 # conteneurs en cours (-a pour inclure les arrêtés)
docker logs -f web        # suivre les journaux (sortie standard du processus)
docker exec -it web sh    # ouvrir un shell DANS le conteneur
docker stop web           # arrêter proprement (signal SIGTERM puis SIGKILL)
docker rm web             # supprimer le conteneur
docker images             # images présentes localement

Un conteneur vit aussi longtemps que son processus principal. Si ce processus se termine, le conteneur s’arrête.

Publier des ports

Par défaut, un conteneur est isolé du réseau de l’hôte. L’option -p HOTE:CONTENEUR publie un port : -p 3000:3000 rend une API Node accessible sur localhost:3000. Pour n’exposer que localement : -p 127.0.0.1:3000:3000.

Persister les données

Tout ce qui est écrit dans le conteneur est perdu quand on le supprime. Pour une base de données, on utilise un volume :

docker volume create pgdata
docker run -d --name db \
  -e POSTGRES_PASSWORD=dev_seulement \
  -v pgdata:/var/lib/postgresql/data \
  -p 127.0.0.1:5432:5432 \
  postgres:17
  • -e définit une variable d’environnement ;
  • -v pgdata:/chemin monte le volume nommé : on peut supprimer et recréer le conteneur sans perdre les données.

En développement, on monte aussi un dossier de l’hôte (bind mount) : -v "$PWD":/app.

Le ménage

docker system df          # espace utilisé
docker container prune    # supprime les conteneurs arrêtés
docker image prune        # supprime les images sans tag

À retenir

Image = modèle, conteneur = instance. docker run avec -d, -p, -e, -v et --name couvre la majorité des usages ; ps, logs et exec servent au diagnostic.

Exercices

Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.

  1. TâcheDifficulté 11 indice

    Lancer et inspecter un serveur web

    Lancez un conteneur nginx:1.27-alpine nommé vitrine, en arrière-plan, accessible sur le port 8080 de votre machine. Vérifiez qu’il répond, consultez ses journaux, ouvrez un shell dedans pour lister /usr/share/nginx/html, puis arrêtez-le et supprimez-le.

    • `docker ps` affiche le conteneur `vitrine` avec `0.0.0.0:8080->80/tcp`
    • `curl -I http://localhost:8080` renvoie `HTTP/1.1 200 OK`
    • `docker logs vitrine` montre la requête GET effectuée par curl
    • `docker exec vitrine ls /usr/share/nginx/html` liste `index.html`
    • Après `docker stop vitrine && docker rm vitrine`, `docker ps -a` ne l'affiche plus
  2. TâcheDifficulté 21 indice

    Persister des données avec un volume

    Créez un volume notes. Lancez un conteneur alpine:3.20 qui écrit la date dans /data/journal.txt en montant ce volume sur /data, puis supprimez le conteneur. Lancez un second conteneur avec le même volume et affichez le fichier.

    • `docker volume ls` liste le volume `notes`
    • Le premier conteneur est lancé avec `-v notes:/data` et l'option `--rm`
    • Le second conteneur affiche le contenu de `/data/journal.txt` avec `cat`
    • La date écrite par le premier conteneur est bien présente
  3. QCMDifficulté 11 indice

    Image ou conteneur ?

    Vous lancez trois fois docker run -d nginx:1.27-alpine. Combien d’images et de conteneurs avez-vous ?

    • 3 images et 3 conteneurs
    • 1 image et 3 conteneurs
    • 1 image et 1 conteneur
    • 3 images et 1 conteneur

Quiz de fin de leçon

  1. Que partage un conteneur avec la machine hôte ?

    • Rien, il embarque son propre noyau
    • Le noyau du système d'exploitation
    • Sa base de données
  2. Que fait -p 8080:3000 ?

    • Publie le port 3000 du conteneur sur le port 8080 de l'hôte
    • Publie le port 8080 du conteneur sur le port 3000 de l'hôte
    • Limite la mémoire
  3. Quelle commande ouvre un shell dans un conteneur en cours d’exécution ?

    • docker run -it nom sh
    • docker exec -it nom sh
    • docker logs nom

La suite du cours

  1. Écrire un Dockerfile pour son application18 min
  2. Optimiser et sécuriser ses images18 min
  3. Docker Compose : orchestrer une application multi-services18 min
  4. Déployer en production : registre, CI/CD et HTTPS20 min

Docker et déploiement · Avancé · 3 h 59