Containers Pratique 101
Découvrir les conteneurs avec Docker
Objectif du TP
Donner le goût des conteneurs en pratiquant :
- Les commandes essentielles :
run,ps,stop,rm- Les ports, volumes et réseaux
- Le mode interactif (exploration)
- La création d’une image simple avec un Dockerfile
Ce TP n’est pas un TP de production. Il vise à construire une intuition correcte des conteneurs.
Prérequis
- Docker installé et fonctionnel (
docker versionOK) - Accès à un terminal (bash/zsh)
- Éditeur de texte minimal
En cas de problème local : https://labs.play-with-docker.com/
Setup initial
mkdir -p ~/tp0 && cd ~/tp0Nettoyage optionnel des restes d’exécutions précédentes :
docker rm -f tp0-nginx tp0-app 2>/dev/null || true
docker network rm tp0-net 2>/dev/null || true
docker image rm tp0-app:0.1 2>/dev/null || trueExercice 1 — Lancer un premier conteneur
Objectif
Voir un conteneur en cours d’exécution.
La commande suivante lance un conteneur nginx (serveur web) en arrière-plan, nommé tp0-nginx, exposant le port 80 du conteneur sur le port 8080 de l’hôte :
docker run -d --name tp0-nginx -p 8080:80 nginx:stableVérifier qu’il est bien lancé :
docker psIl est accessible via le port 8080 de l’hôte avec un navigateur web ou curl :
Tester :
curl http://localhost:8080 | headLes logs du conteneur peuvent être consultés avec :
docker logs tp0-nginx --tail 10Il peut être arrêté avec :
docker stop tp0-nginxet supprimé avec :
docker rm -f tp0-nginxUn conteneur = un service/processus isolé
Exercice 2 — Volumes : partager des fichiers
Objectif
Relier le système hôte et le conteneur.
mkdir -p www
echo "<h1>Hello from host</h1>" > www/index.htmlLancer nginx avec volume :
docker run -d \
--name tp0-nginx \
-p 8080:80 \
-v "$PWD/www":/usr/share/nginx/html:ro \
nginx:stableModifier www/index.html sur l’hôte et rafraîchir la page ou relancer curl.
Nettoyage :
docker stop tp0-nginx
docker rm -f tp0-nginxLes données ne vivent pas dans le conteneur, il doit être éphémère
Exercice 3 — Mode interactif et installation
Il est important de comprendre la différence entre un conteneur et une image. Il est possible d’executer des conteneurs en mode interactif pour explorer leur contenu et interagir avec eux.
Il est déconseillé d’installer des logiciels directement dans un conteneur en production.
docker run -it --rm ubuntu:22.04 bashDans le conteneur :
cat /etc/os-release
uname -a
echo "Hello from inside the container" > /tmp/hello.txt
apt update
apt install -y curl
curl https://example.comIl est possible de tout faire dans le conteneur car on est root par défaut.
Pour quitter le conteneur :
exitRelancer :
docker run -it --rm ubuntu:22.04 bash
cat /tmp/hello.txt # ❌ disparu
curl https://example.com # ❌ curl non installéCe qui n’est pas dans une image est perdu
Exercice 4 — Créer une image simple
Pour rendre l’installation reproductible et persistante, il faut créer une image. L’approche standard est d’écrire un fichier Dockerfile décrivant l’image.
Créer Dockerfile :
FROM ubuntu:22.04
RUN apt update && apt install -y curl
CMD ["bash"]Construire :
docker build -t tp0-ubuntu-curl .Tester :
docker run -it --rm tp0-ubuntu-curl
curl https://example.comExercice 5 — Construire une image applicative
En suivant la même approche, il est possible de créer une image contenant une application Python simple.
Créer une structure de dossiers app/ avec les fichiers suivants :
app/app.py :
Une application serveur Web minimale :
from http.server import SimpleHTTPRequestHandler, HTTPServer
server = HTTPServer(('0.0.0.0', 5000), SimpleHTTPRequestHandler)
print("Listening on 5000")
server.serve_forever()Un fichier Dockerfile
app/Dockerfile :
FROM python:3.11-slim
WORKDIR /app
COPY app.py .
CMD ["python", "app.py"]Construire, lancer et tester l’application :
docker build -t tp0-app:0.1 ./app
docker run -d --name tp0-app -p 5000:5000 tp0-app:0.1
curl http://localhost:5000Nettoyage :
docker stop tp0-app
docker rm -f tp0-appExercice 6 — (Optionnel) Réseaux Docker
Il est de faire fonctionner plusieurs conteneurs ensemble via un réseau Docker.
docker network create tp0-net
docker run -d --name tp0-app --network tp0-net tp0-app:0.1
docker run --rm --network tp0-net curlimages/curl http://tp0-app:5000Nettoyage :
docker rm -f tp0-app
docker network rm tp0-netSynthèse
- Un conteneur est éphémère
- Une image est reproductible
- Le mode interactif sert à explorer
- Le Dockerfile est la source de vérité
Un conteneur n’est pas un mini-serveur C’est un processus isolé, décrit par du code