Docker 1 - Système de conteneurs - TP Module 4 et Module 5 : Dynamique des conteneurs, inspecter, RESTful API
Paul Schuhmacher
Module: Docker
Découvrir également le serveur web Caddy 2, un serveur web écrit en Go, léger et efficace.
- Télécharger l'image l'image officielle de caddy2, un serveur web open source performant et léger écrit en Go. Inspecter-là pour regarder les ports ouverts indiqués. Trouver le port auquel il faudra mapper le port de votre machine hôte pour servir un site web;
- Démarrer un premier conteneur à partir de l'image (sans volume) et inspecter la sortie avec votre navigateur préféré. En déduire où monter le volume pour servir votre fichier
content
. Lire la documentation et l'exemple pour comprendre comment utiliser l'image. - Ouvrir un shell interactif sur le conteneur (avec
sh
). Découvrir où se situe le fichier de configuration de Caddy notamment son routeur (mapping METHODE HTTP+URL => path du fichier à servir). Le fichier à chercher se nommeCaddyfile
; - Découvrir sous la clef
root
du fichier de configuration le path par défaut. Y créer un dossiersite
et y placer un fichierindex.html
avec le contenu"hello, world"
. Toujours depuis le conteneur recharger la configuration du serveur. Tester quesite/index.html
est bien servi sur l'URL racine (/
). Tip: vous avez l'éditeurvi
accessible sur le conteneur pour éditer les fichiers - Pourquoi sur la page officielle est-il indiqué (section
Building your own Caddy-based image
) :note: never use the :latest tag in a production site
?
Il est toujours utile d'inspecter avec un shell interactif un nouveau système en faisant des tests rapides, avant de préparer un Dockerfile ou la création de conteneurs et le bind de volumes.
Nous allons préparer un volume et y placer nos sources (ici un simple fichier HTML). Ainsi, nous pourrons développer le site (éditer le fichier HTML) sans reconstruire l'image à chaque modification.
Lorsqu'un volume est entièrement géré par Docker, nous n'avons pas (par design) accès au système de fichier sous-jacent. Pour le manipuler on peut passer par un conteneur en associant le volume à ce dernier.
- Créer un volume nommé
localvolume
; - Déterminer l'emplacement du contenu du volume sur votre système de fichiers;
- Écrire un fichier
index.html
dans le volumelocalvolume
avec le contenu"The Doors of Durin, Lord of Moria. Speak, friend, and enter. I, Narvi, made them. Celebrimbor of Hollin drew these signs."
. Pour cela, créer un conteneur à partir de l'image de caddy en lui associant le volume, puis copier le fichierindex.html
dans le conteneur avec la commandedocker cp
. - Arrêter et supprimer ce conteneur (le dernier lancé) en une seule commande. Tip: combiner deux commandes
docker
pour y parvenir.
Nous le voyons, lorsque nous gérons un ensemble de fichiers que l'on veut persister et gérer nous même (comme les sources), un volume entièrement géré par Docker n'est pas très commode. Il est plus simple de binder nous même le dossier local contenant nos sources et de le gérer nous même.
Un volume entièrement géré par Docker est plus approprié lorsque 1) l'on veut que les données persistantes soient entièrement intégrées au worklow Docker (un volume peut être déplacé comme une image) 2) les données sont produites durant l'execution du conteneur. Sinon, utiliser un bind est plus commode.
- Démarrer un conteneur
moria
, en background, à partir de l'image caddy- 1ère méthode : En lui associant le volume
localvolume
avec l'option --mount sur le path déterminé précédemment pour monter notre site web; - 2ème méthode (à privilégier ici) : En faisant un bind du fichier
index.html
directement;
- 1ère méthode : En lui associant le volume
La Moria, ou Khazad-dûm, est une ancien royaume nain situé sous les montagnes de Brumes, en Terres du milieu, univers fictif développé et écrit par Tolkien (et son fils Christopher). Dans le seigneur des anneaux, la compagnie se retrouve notamment face aux portes de la Moria qui restent désespérément closes...
- Mettre en pause le conteneur
moria
avec le clientdocker
. Essayer de le requêter avec cURL sur le port TCP ouvert. Que constatez-vous ? Tip: vous pouvez définir un timeout de n secondes aveccurl --max-time n url
. Enlever la pause du conteneur. A quoi sert la mise en pause d'un conteneur ? - Ouvrez un second terminal dans lequel vous afficherez les statistiques sur le conteneur
moria
. Dans le premier terminal, envoyer des requêtes pour observer les stats (notamment l'I/O). Observer la mémoire utilisée par le conteneur (sans limites imposées). - Redémarrer le conteneur avec une limite de mémoire de 10M. Vérifier que la limite est en place. Essayer de redémarrer avec une mémoire de 5M. Que s'est-il passé ?
- Que fait l'instruction
docker run -P
? Essayer avec un conteneur démarré à partir de l'image de caddy. - Bonus : sur le conteneur caddy, utiliser PHP et écrire un script qui sera associé à l'URL
POST /password
avec le bodypassword=mellon
. Le script doit vérifier le mot de passe fourni. Si le mot de passe est correct, le serveur doit répondre avec un code status 200 et le document HTML "(Les portes s'ouvrent)", avec "(Rien ne se passe)" sinon.
- A l'aide uniquement de l'API web RESTful du Docker Engine : construire(build) une image, créer un conteneur, afficher les stats d'un conteneur, arrêter un conteneur, supprimer un conteneur, etc. (et essayez d'autres actions).
Pour ce faire, vous pouvez utiliser cURL, avec jq, un équivalent de sed dédié à JSON (pretty-print, filter, edit, etc.) ou python (extension jsontool) :
#curl via le socket
curl --unix-socket /var/run/docker.sock URL
#prettyfier le json avec jq
curl --unix-socket /var/run/docker.sock URL | jq
#prettyfier le json avec python et l'extension json
curl --unix-socket /var/run/docker.sock URL | python -mjson.tool
ou votre client HTTP favori.
- Quelles possibilités s'offrent à nous pour protéger l'API du Docker Engine ?
Nous y reviendrons dans le Module 07.
- cURL, un outil en ligne de commande pour le transfert de données via des URL. Peut être utilisé comme un client HTTP. Attention, cURL sur Windows et cURL sur les systèmes UNIX (GNU/Linux et macOS) ne sont pas implémentées pareil et ont des options différentes. Tous les exemples de cURL sur le dépôt et dans les supports de cours sont au format UNIX (à adapter pour Windows), sinon installer la WSL et utiliser cURL depuis votre instance GNU/Linux
- Sur Windows, Invoke-RestMethod, un client HTTP intégré à PowerShell. Ouvrir une invite de commande PowerShell pour l'utiliser
- Postman, l'artillerie lourde. Nécessite de créer un compte