Lab 2.1 : Gérer le cycle de vie¶
| Durée | 60 min |
| Niveau | Guidé |
| Prérequis | Lab 1.2 : Premiers conteneurs, cours du chapitre 2 |
| Acquis visés | AA2 |
Objectifs
- Faire passer un conteneur par tous ses états : créé, en cours d'exécution, arrêté, supprimé
- Constater le lien entre un conteneur et son processus principal
- Lire les journaux d'un conteneur et exécuter une commande dedans
- Lire l'état et le code de sortie d'un conteneur avec
docker inspect
Contexte et schéma¶
Vous manipulez quatre conteneurs aux comportements différents pour observer leur cycle de vie.
| Conteneur | Image | Comportement |
|---|---|---|
web |
nginx:1.27-alpine |
Serveur web, reste en cours d'exécution |
court |
alpine:3.20 |
Affiche un message puis se termine |
erreur |
alpine:3.20 |
Se termine avec un code d'erreur |
boucle |
alpine:3.20 |
Écrit l'heure chaque seconde, sans fin |
flowchart LR
I["Image"] -- "create" --> C["Créé"]
C -- "start" --> R["En cours<br/>d'exécution"]
R -- "stop" --> S["Arrêté"]
S -- "start" --> R
S -- "rm" --> X["Supprimé"]
Étapes¶
Étape 1 : Créer un conteneur sans le démarrer¶
docker create --name web nginx:1.27-alpine
docker ps -a
docker inspect --format '{{.State.Status}}' web
docker create crée le conteneur mais ne le démarre pas. docker ps seul n'affiche rien, car il ne liste que les conteneurs en cours d'exécution ; docker ps -a montre web avec le statut Created.
Point de contrôle
-
docker ps -aaffichewebavec le statutCreated -
docker inspectaffichecreated
Étape 2 : Démarrer le conteneur¶
Point de contrôle
-
docker psaffichewebavec un statut commençant parUp -
docker inspectafficherunning
Étape 3 : Observer un conteneur dont le processus se termine¶
Lancez deux conteneurs dont le processus principal s'arrête de lui-même :
docker run --name court alpine:3.20 echo "Bonjour depuis un conteneur"
docker run --name erreur alpine:3.20 sh -c "exit 3"
docker ps -a
Le premier affiche son message puis s'arrête. Le second ne produit rien et s'arrête avec une erreur. Lisez leur état et leur code de sortie :
docker inspect --format '{{.State.Status}} {{.State.ExitCode}}' court
docker inspect --format '{{.State.Status}} {{.State.ExitCode}}' erreur
Un code de sortie 0 indique une fin normale ; toute autre valeur signale une erreur.
Point de contrôle
-
courtest à l'étatexitedavec le code0 -
erreurest à l'étatexitedavec le code3 - Dans
docker ps -a, ces deux conteneurs apparaissent avec un statutExited
Étape 4 : Lire les journaux¶
Lancez un conteneur qui écrit l'heure chaque seconde :
docker run -d --name boucle alpine:3.20 sh -c 'while true; do date; sleep 1; done'
docker logs --tail 5 boucle
Suivez ensuite les journaux en continu :
Arrêtez le suivi avec Ctrl+C : le conteneur, lui, continue de tourner.
Point de contrôle
-
docker logs --tail 5affiche les cinq dernières lignes - Avec
-f, de nouvelles lignes apparaissent chaque seconde - Après
Ctrl+C,docker psmontre toujoursboucleà l'étatUp
Étape 5 : Exécuter une commande dans un conteneur¶
Utilisez web, qui tourne :
Dans le terminal ouvert, exécutez ps, puis exit.
Vérifiez que le conteneur n'est pas arrêté :
Point de contrôle
- La première commande liste des fichiers de la page d'accueil de nginx
-
psdans le conteneur montre le processusnginx - Après
exit,webest toujoursUp
Étape 6 : Arrêter et redémarrer¶
Arrêtez web, puis boucle, en observant la durée de chaque commande :
Un conteneur arrêté de façon normale a un code de sortie bas ; un conteneur arrêté de force, comme boucle, a un code plus élevé. Comparez :
docker inspect --format '{{.State.Status}} {{.State.ExitCode}}' web
docker inspect --format '{{.State.Status}} {{.State.ExitCode}}' boucle
Redémarrez web :
Pourquoi boucle est-il plus long à arrêter ?
docker stop demande au processus principal de s'arrêter proprement et attend, par défaut, jusqu'à 10 secondes avant de l'arrêter de force. Le programme lancé dans boucle ne réagit pas à cette demande : Docker doit donc attendre la fin du délai. nginx, lui, s'arrête immédiatement.
Point de contrôle
-
docker stop bouclea pris nettement plus de temps quedocker stop web -
docker inspectaffiche un code de sortie différent pourboucleet pourweb - Après
docker restart,webest de nouveauUp
Étape 7 : Supprimer les conteneurs¶
Essayez de supprimer web, qui tourne encore :
Docker refuse : il faut d'abord arrêter le conteneur, ou forcer la suppression :
Supprimez ensuite les trois autres :
Point de contrôle
- Docker a refusé
docker rm webtant que le conteneur tournait -
docker ps -an'affiche plus aucun des quatre conteneurs du lab
Questions de réflexion¶
Pourquoi court est-il arrêté alors que personne ne l'a arrêté ?
Son processus principal (echo) s'est terminé après avoir affiché son message. Un conteneur vit aussi longtemps que son processus principal.
Pourquoi exit dans docker exec -it web sh n'arrête-t-il pas le conteneur web ?
Le shell lancé par docker exec est un processus supplémentaire. Le processus principal du conteneur reste nginx, qui continue de tourner.
Quelle information le code de sortie apporte-t-il lors d'un diagnostic ?
Il indique si le processus principal s'est terminé normalement (0) ou en erreur (autre valeur), ce qui oriente la lecture des journaux avec docker logs.
Dépannage¶
| Symptôme | Pistes |
|---|---|
The container name "/web" is already in use |
Un conteneur web existe déjà (peut-être celui du Lab 1.2) : supprimez-le avec docker rm -f web |
docker logs n'affiche rien |
Le conteneur n'a rien écrit : vérifiez avec docker ps -a que vous interrogez le bon conteneur |
docker exec renvoie container ... is not running |
Le conteneur est arrêté : démarrez-le avec docker start |
docker stop boucle semble bloqué |
C'est normal : Docker attend jusqu'à 10 secondes avant l'arrêt forcé |
Sous PowerShell, la commande de boucle est rejetée |
Vérifiez les guillemets simples autour de while true; do date; sleep 1; done |
Nettoyage et reprise¶
Si un conteneur du lab subsiste :
Les noms absents provoquent un message d'erreur sans gravité.
Retour au chapitre¶
Chapitre 2 : Cycle de vie des conteneurs · Lab suivant : Lab 2.2 : Publier et configurer un service