labos-cloud

Laboratoires pour diverses technologies utilisées dans le cloud

View on GitHub

Laboratoire sur Docker

Exercice 2

Pré-requis

Pour cet exercice, vous aurez besoin d’un second terminal connecté au même hôte. Sur GCP vous pouvez utiliser la Console et l’outil ligne de commande gcloud sdk.

Apache

Exécutez sudo docker run httpd sur le premier terminal. httpd est l’image officielle du serveur web Apache. Le container lancé attend les connexions.

Introduction au réseau des containers

À partir du second terminal, sudo docker ps --help la commande liste également les containers, par défaut en cours d’exécution. sudo docker ps Nous avons maintenant 80/tcp sous la colonne PORTS et nous y reviendrons plus tard. curl localhost retourne un message d’erreur, la connexion est refusée sur le port 80… du système hôte. Pour tester la connexion au container, nous avons besoin de son adresse ip mais ps et container ls ne l’affichent pas.

Exécutez sudo docker container --help

Pour obtenir de l’information détaillée sur un container, il faut utiliser sudo docker container inspect <container name ou ID>. Pour obtenir directement l’adresse IP sudo docker container inspect <container name ou id> | grep IPAddress. Maintenant un curl <adresse container httpd> devrait fonctionner. Sur le terminal 1, vous pouvez voir les logs du serveur web. Comme le terminal 2 est sur le système hôte, l’adresse IP dans les log est celle du gateway Docker. Les logs du container sont disponibles avec sudo docker container logs <nom ou ID du container> Toujours à partir du 2e terminal, sudo docker run -ti debian:latest puis curl <ip du container httpd>. L’outil curl n’étant pas installé dû au système de fichier minimal, les apt-get update et apt-get install curl -y sont nécessaires. Maintenant, vous pouvez répéter la commande curl . Sur le terminal 1, vous pouvez voir l'adresse ip du container Debian que nous venons d'utiliser. Sur le terminal 2, sortez avec `exit`.

curl et logs

Visibilité des processus entre le système hôte et les containers

Sur le terminal 2, ps -ef pour avoir une liste des processus en exécution sur le système hôte. La première colonne est le nom d’utilisateur ayant démarré le processus, la 2e colonne le numéro du processus (PID), la 3e le numéro du processus parent(PPID), et la dernière la commande exécutée. Vous devriez voir 4 processus httpd. En remontant la hiérarchie des processus parents, vous arriverez à votre utilisateur dans son shell (bash) qui a lancé la commande sudo docker run... et au runtime containerd qui exécute le container lui-même. Vous pouvez utiliser la commande pstree <PID> avec le PID de votre terminal et du containerd. Le système hôte peut voir les processus à l’intérieur des containers. Si l’outil pstree n’est pas installé sur le système hôte, vous pouvez exécuter apt-get install avec le package psmisc ou procps, ce dernier contenant plus d’utilitaires pour examiner les processus.

ps -ef pstree

Nous allons maintenant nous connecter au container httpd. Pour se connecter à un container en cours d’exécution, il faut lancer un shell dans le container. sudo docker --help contient sûrement un outil.

La commande sudo docker exec est exactement pour ça, lancer une commande dans un container en exécution. sudo docker exec --help nous donne également les options -t et -i, comme dans le cas de run, et nous pouvons lancer un shell bash dans le container httpd ainsi : sudo docker exec -ti <container> /bin/bash. La commande ps -ef n’est pas disponible dans ce container car l’image est faite pour servir des pages web et inspecter le statut des processus n’est pas utile. Pour les fins de ce labo apt-get install procps installera l’utilitaire dont nous avons besoin. Comparez la liste à l’intérieur du container avec celle obtenue précédemment, prenez note que “/bin/bash” et “ps -ef” sont le shell que vous exécutez dans le container et la commande lancée pour avoir la liste des processus; votre container httpd n’exécute que les 4 processus httpd, quand on ne s’y connecte pas pour pour faire des tests, et ne voit pas les processus en exécution sur le système hôte.

ps -ef container

Visibilité de processus entre les container

exit pour sortir du container, sudo docker ps pour confirmer que le httpd est toujours en exécution. Bloquer un terminal pour chaque exécution de container n’est pas vraiment pratique, heureusement sudo docker run --help nous indique que l’option -d permet d’exécuter le container en arrière-plan, donc vous laisser le contrôle du terminal 2. sudo docker run -d debian et vérifiez les containers en exécution. Si vous ne voyez pas de container Debian c’est normal, aucun processus n’a été lancé. Corrigeons en utilisant le mode interactif + pseudo-terminal + arrière plan -tid. Examinez les processus avec ps -ef sur le système hôte. Vous devriez voir les processus du container httpd et le shell bash créé au lancement du container Debian (run -ti) et le shell sh (exec .. /bin/sh).

ps -ef plusieurs container

Exécutez un shell “sh” dans le container Debian avec sudo docker exec -ti <container debian> /bin/sh puis inspectez les processus en cours d’exécution dans le container. Vous verrez seulement le shell bash, votre shell sh et la commande ps -ef. Sortez avec exit.

Arrêter un container

Un container s’arrête par défaut quand il n’y a plus de processus en cours d’exécution. Pour arrêter un container avec des processus toujours en cours d’exécution nous pouvons utiliser “Ctrl+c” à partir du terminal 1 ou, sur le terminal 2, exit pour sortir du container Debian puis sudo docker stop <nom ou id container httpd> ou encore sudo docker kill <nom ou id container httpd>. stop tente de faire un graceful shutdown, un arrêt “poli” tandis que kill impose l’arrêt. Enlevez tous les container arrêtés.

Revenir à l’exercice 1 Poursuivre avec l’exercice 3