Quiz hebdo · Semaine 2

L'emballage
Docker

conteneur, image, cycle de vie, journaux, ports, volumes

9 questions + 3 supplément

emballer lancer observer brancher nettoyer

Cliquez Voir la solution sur chaque diapositive

naviguer · S solution · M manuel · R recommencer

Question 1 / 9 vue d'ensemble - drag & drop

Associer chaque commande Docker à son rôle

Glissez chaque commande dans la case qui décrit son rôle. Cliquez sur une commande déjà déposée pour la retirer. Le bouton Voir la solution (S) vérifie vos placements.
docker pull
docker run
docker ps
docker images
docker logs
docker stop
docker start
docker rm

8 commandes - 8 rôles. Glissez chaque commande sur sa description :

Télécharger une image
depuis Docker Hub, sans rien lancer
Créer et lancer un conteneur
à partir d'une image
Lister les conteneurs
en marche (ou tous avec -a)
Lister les images locales
les moules déjà téléchargés
Voir la sortie d'un conteneur
tout ce que le processus écrit
Arrêter proprement
le conteneur reste là, prêt à repartir
Relancer un conteneur arrêté
sans en créer un nouveau
Supprimer un conteneur
l'instance, pas le moule

Le cycle de vie complet : pull télécharge le moule, run fabrique et lance une pièce, ps et logs observent, stop / start mettent en pause et relancent, rm jette la pièce. Le moule, lui, se liste avec images et se jette avec rmi (au supplément !).

Question 2 / 9 concept

Qu'est-ce qu'un conteneur ?

Au laboratoire de la semaine 1, vous en avez monté un à la main, sans Docker. Alors, c'était quoi, au fond ?
Un processus isolé qui partage le noyau de la machine hôte
Une machine virtuelle complète avec son propre noyau
Un fichier compressé qui contient du code source
Un serveur physique réservé à une seule application

Le conteneur est un processus isolé : espaces de noms pour qu'il ne voie que son petit monde, limites de ressources pour qu'il ne mange pas tout. Mais il réutilise le noyau de l'hôte : c'est ce qui le rend si léger et si rapide à démarrer, comparé à une machine virtuelle.

Question 3 / 9 concept

Conteneur ou machine virtuelle : la grande différence ?

La machine virtuelle embarque un système complet avec son noyau, le conteneur non
Le conteneur est toujours plus lent qu'une machine virtuelle
La machine virtuelle ne peut pas exécuter Linux
Le conteneur ne peut pas accéder au réseau

La machine virtuelle simule une machine entière, noyau compris : lourde à démarrer, gourmande en mémoire. Le conteneur voyage sans noyau : il emprunte celui de l'hôte. Résultat : des dizaines de conteneurs là où on logerait deux ou trois machines virtuelles.

Question 4 / 9 image vs conteneur

Trois docker run, ça donne quoi ?

# Vous tapez ceci, trois fois de suite : docker run -d nginx docker run -d nginx docker run -d nginx
Trois conteneurs différents fabriqués à partir de la même image
Trois images différentes
Un seul conteneur partagé par les trois commandes
Une erreur : une image ne peut servir qu'une seule fois

L'image est le moule en lecture seule, le conteneur est la pièce qui en sort. Un moule, autant de pièces qu'on veut : docker ps montrera trois conteneurs nginx, chacun avec son nom aléatoire, tous nés de la même image. C'est exactement le principe qui permettra de multiplier les serveurs au module 2.

Question 5 / 9 diagnostic - à vous de taper

La vitrine ne répond plus

La vitrine web de la petite entreprise tourne dans le conteneur vitrine (image nginx). Ce matin, le site ne répond plus. Premier réflexe : observer avant de toucher.
a) Vérifier si le conteneur tourne encore (et le voir même s'il est mort) :
b) Lire tout ce que le processus a écrit pour comprendre ce qui s'est passé :
DOCKER-PS(1) - extrait du manuel
NAME
       docker ps - lister les conteneurs

SYNOPSIS
       docker ps [OPTIONS]

OPTIONS
       -a, --all
              montrer aussi les conteneurs arrêtés
              (par défaut : seulement ceux en marche)

COLONNES
       CONTAINER ID, IMAGE, STATUS (Up 2 minutes,
       Exited (1) 3 hours ago...), PORTS, NAMES

EXEMPLES
       docker ps
       docker ps -a
DOCKER-LOGS(1) - extrait du manuel
NAME
       docker logs - afficher la sortie d'un conteneur

SYNOPSIS
       docker logs [OPTIONS] CONTENEUR

OPTIONS
       -f, --follow
              suivre la sortie en temps réel (comme tail -f)

       --tail NOMBRE
              afficher seulement les dernières lignes

CE QUE VOIT logs
       Tout ce que le processus principal du conteneur écrit
       sur stdout et stderr depuis son démarrage.

EXEMPLES
       docker logs vitrine
       docker logs -f vitrine
# a) Le conteneur tourne-t-il ? -a montre aussi les morts
docker ps -a

# b) Qu'a-t-il dit avant de se taire ?
docker logs vitrine

Dans la colonne STATUS de docker ps -a : Up 2 minutes veut dire vivant, Exited (1) 3 hours ago veut dire mort avec un code d'erreur. Ensuite docker logs raconte pourquoi. Observer d'abord, agir ensuite : le réflexe de tout le cours.

Question 6 / 9 docker run - à vous de taper

Lancer la vitrine, version complète

On repart à neuf. Lancez l'image nginx : en arrière-plan, avec le nom vitrine, et le port 8080 de l'hôte branché sur le 80 du conteneur.
DOCKER-RUN(1) - extrait du manuel
NAME
       docker run - créer et lancer un conteneur à partir d'une image

SYNOPSIS
       docker run [OPTIONS] IMAGE

OPTIONS
       -d, --detach
              en arrière-plan : rend la main au terminal

       --name NOM
              nommer le conteneur (sinon : nom aléatoire
              du genre quirky_einstein)

       -p PORT_HOTE:PORT_CONTENEUR
              publier un port : les requêtes qui entrent par
              PORT_HOTE sont redirigées vers PORT_CONTENEUR

NOTE
       Si l'image n'est pas sur la machine, docker run la
       télécharge d'abord depuis Docker Hub (pull automatique).

EXEMPLES
       docker run -d --name vitrine -p 8080:80 nginx
docker run -d --name vitrine -p 8080:80 nginx

Bonus : si l'image nginx n'était pas sur la machine, docker run l'aurait téléchargée tout seul depuis Docker Hub avant de lancer. C'est le grand service qu'il rend par rapport au conteneur monté à la main de la semaine 1.

Question 7 / 9 redirection de ports

Quel port pour visiter le site ?

docker run -d -p 8080:80 nginx

À quel port l'utilisateur de la machine hôte visite-t-il le site ?

8080 : le port hôte vient en premier dans -p
80 : c'est le port du serveur web
Les deux ports fonctionnent depuis l'hôte
Aucun : il manque un volume

L'ordre de -p est hôte:conteneur. La requête entre par le 8080 de l'hôte et Docker la redirige vers le 80 du conteneur, où nginx écoute. Le 80 du conteneur n'est pas visible directement de l'extérieur : c'est justement ça, l'isolation.

Question 8 / 9 l'adresse selon votre instance - drag & drop

Quelle adresse dans le navigateur ?

Le même docker run -p 8080:80 nginx a été lancé sur trois instances différentes. Glissez chaque adresse sur l'instance où elle est la bonne.
http://localhost:8080
http://192.168.56.2:8080
http://adresse-du-vps:8080

3 adresses - 3 instances :

Docker sur votre poste
Docker Desktop ou DinD
VirtualBox
Docker tourne dans la machine virtuelle
VPS
serveur loué avec adresse publique

La règle : l'adresse IP de la machine où Docker tourne, suivie du port externe choisi avec -p. localhost n'est vrai que si Docker tourne sur votre poste ; dans VirtualBox c'est l'adresse IP de la machine virtuelle, sur un VPS c'est son adresse publique (et le port doit être ouvert dans le pare-feu).

Question 9 / 9 volumes

Le conteneur meurt, et les données ?

Un conteneur est détruit avec docker rm. Que deviennent les données écrites dans son volume ?
Elles survivent : le volume vit en dehors du conteneur
Elles disparaissent avec le conteneur
Elles sont archivées automatiquement dans l'image
Elles sont envoyées sur Docker Hub

Le volume est une malle rangée chez l'hôte : le conteneur peut mourir, la malle reste, et le prochain conteneur peut la reprendre. Sans volume, tout ce qui a été écrit dans le conteneur part avec lui. Règle d'or : le conteneur est jetable, les données ne le sont pas.

Supplément 1 / 3 nettoyage - à vous de taper

Tout démonter : stop, rm, rmi

Fin de l'expérience : on veut arrêter proprement le conteneur vitrine, le supprimer, puis supprimer l'image nginx pour libérer le disque.
a) Arrêter proprement le conteneur :
b) Supprimer le conteneur (la pièce) :
c) Supprimer l'image (le moule) :
DOCKER-STOP(1) - extrait du manuel
NAME
       docker stop - arrêter proprement un conteneur

DESCRIPTION
       Envoie SIGTERM au processus principal (arrêt poli),
       puis SIGKILL s'il ne s'est pas arrêté après 10 secondes.
       Le conteneur arrêté existe toujours : visible avec
       docker ps -a, relançable avec docker start.
DOCKER-RM(1) / DOCKER-RMI(1) - extrait du manuel
docker rm CONTENEUR
       supprime un conteneur arrêté (l'instance)

docker rmi IMAGE
       supprime une image (le moule)
       ERREUR si un conteneur, même arrêté, l'utilise encore :
       il faut d'abord docker rm ce conteneur
# a) Arrêt poli : SIGTERM, puis SIGKILL après 10 s
docker stop vitrine

# b) Jeter la pièce
docker rm vitrine

# c) Jeter le moule
docker rmi nginx

L'ordre est obligatoire : rmi refuse de supprimer une image tant qu'un conteneur, même arrêté, s'en sert encore. On jette les pièces avant de jeter le moule.

Supplément 2 / 3 vocabulaire - drag & drop

Le vocabulaire de l'emballage

image
conteneur
volume
Docker Hub
journaux (logs)

5 mots - 5 définitions :

Le moule en lecture seule
on ne le modifie jamais en le lançant
La pièce vivante
un processus isolé, jetable
La malle de données
survit à la mort du conteneur
La bibliothèque d'images en ligne
d'où docker run télécharge
Tout ce que le processus écrit
se lit sans entrer dans le conteneur

Cinq mots qui reviendront toute la session : l'image (le moule), le conteneur (la pièce), le volume (la malle), Docker Hub (la bibliothèque) et les journaux (la boîte noire). Si vous savez raconter cette phrase à quelqu'un d'autre, la semaine 2 est gagnée.

Supplément 3 / 3 le scénario de la session

Piraté ? On jette, on redéploie

Le WordPress de la petite entreprise vient de se faire pirater. Plutôt que de nettoyer le serveur à la main pendant des heures, l'équipe fait docker rm du conteneur compromis puis docker run d'un neuf. Pourquoi ça redonne un serveur sain ?
L'image est en lecture seule : le pirate a modifié le conteneur, jamais la recette
Docker détecte et supprime les fichiers infectés au redémarrage
Un conteneur ne peut tout simplement pas être piraté
Le redéploiement change automatiquement tous les mots de passe

Le pirate a modifié la pièce, pas le moule : relancer depuis l'image redonne un serveur identique au premier jour, pendant que les données vivent en sécurité dans les volumes. La nuance qui compte : redéployer efface l'intrusion, pas la faille. Si on ne corrige pas ce qui a laissé entrer le pirate (extension à jour, bonnes permissions), il reviendra par la même porte.

Bilan

Ce que vous venez de pratiquer

R pour recommencer.

« Retour aux quiz hebdo