Objectifs
- Comprendre le problème que Docker résout (“ça marche sur ma machine”).
- Distinguer clairement une image d’un conteneur.
- Lancer, lister et arrêter un conteneur simple avec les commandes de base.
- Comprendre le rôle d’un registre comme Docker Hub.
La Conteneurisation : “Ça marche partout”
Le principal problème du développement logiciel a longtemps été la différence d’environnements. Un code qui fonctionne sur l’ordinateur d’un développeur (avec sa version de Python, ses librairies spécifiques) peut échouer en production où l’environnement est différent.
Docker résout ce problème en permettant d’empaqueter une application et toutes ses dépendances (code, librairies, variables d’environnement, fichiers système) dans une unité standardisée et portable : le conteneur.
Concepts Fondamentaux
Image
Une image est un modèle, un “plan” en lecture seule. Elle contient tout ce dont l’application a besoin pour s’exécuter.
- Elle est construite en couches. Chaque instruction dans un
Dockerfile(voir leçon suivante) crée une nouvelle couche. - Les images sont stockées et partagées via un registre. Le plus connu est Docker Hub.
Conteneur
Un conteneur est une instance en cours d’exécution d’une image. C’est un processus léger et isolé.
- Vous pouvez lancer des dizaines de conteneurs à partir de la même image.
- Chaque conteneur a son propre système de fichiers, son propre réseau et ses propres processus, isolés de l’hôte et des autres conteneurs.
Analogie : L’image est la recette d’un gâteau. Le conteneur est le gâteau que vous avez réellement préparé et que vous pouvez manger.
Registre
Un registre est un dépôt centralisé où sont stockées les images.
- Docker Hub est le registre public par défaut.
- Des entreprises peuvent avoir des registres privés (ex: GitHub Container Registry, AWS ECR).
Commandes de base à connaître
-
docker pull <nom_image>: Télécharge une image depuis un registre.docker pull nginx:latest -
docker run <nom_image>: Crée et lance un nouveau conteneur à partir d’une image.-d: Lance le conteneur en mode détaché (en arrière-plan).-p <port_hote>:<port_conteneur>: Publie un port. Mappe le port du conteneur sur un port de votre machine.--name <nom>: Donne un nom lisible au conteneur.
-
docker ps: Process Status. Liste les conteneurs en cours d’exécution.docker ps -a: Liste tous les conteneurs, y compris ceux qui sont arrêtés.
-
docker stop <nom_ou_id_conteneur>: Arrête un conteneur en cours d’exécution. -
docker rm <nom_ou_id_conteneur>: Supprime un conteneur arrêté.
Workflow simple : Lancer un serveur web Nginx
# 1. Télécharger la dernière image Nginx depuis Docker Hub
docker pull nginx
# 2. Lancer un conteneur à partir de cette image
# -d : en arrière-plan
# --name webserver : on le nomme 'webserver'
# -p 8080:80 : on mappe le port 80 du conteneur sur le port 8080 de notre machine
docker run -d --name webserver -p 8080:80 nginx
# 3. Vérifier qu'il tourne
docker ps
# 4. Ouvrez votre navigateur et allez sur http://localhost:8080
# Vous devriez voir la page d'accueil de Nginx !
# 5. Arrêter le serveur
docker stop webserver
# 6. Le supprimer
docker rm webserver
Bonnes pratiques
- Utilisez des tags de version spécifiques pour vos images (
nginx:1.21) plutôt quelatestpour garantir la reproductibilité. - Donnez des noms explicites à vos conteneurs avec
--namepour les retrouver facilement. - Nettoyez régulièrement les anciens conteneurs (
docker rm) et images (docker rmi) pour libérer de l’espace disque.
Exercices
-
Installez Docker :
- Si ce n’est pas déjà fait, installez Docker Desktop (pour Mac/Windows) ou Docker Engine (pour Linux) en suivant les instructions sur le site officiel de Docker.
-
Lancez un conteneur interactif :
- Exécutez la commande
docker run -it ubuntu bash. -itpermet de lancer un terminal interactif à l’intérieur du conteneur.- Vous êtes maintenant dans un shell à l’intérieur d’un conteneur Ubuntu. Exécutez quelques commandes (
ls /,echo "hello from container"). - Tapez
exitpour quitter le conteneur (qui s’arrêtera alors).
- Exécutez la commande
-
Jouez avec un serveur de base de données :
- Lancez un conteneur PostgreSQL :
docker run -d --name ma_db -e POSTGRES_PASSWORD=monsecret postgres. - L’option
-epermet de passer des variables d’environnement. - Utilisez
docker pspour voir qu’il tourne. - Utilisez
docker logs ma_dbpour voir les journaux de démarrage de la base de données. - Arrêtez et supprimez le conteneur avec
docker stop ma_dbetdocker rm ma_db.
- Lancez un conteneur PostgreSQL :