Docker TP Master 19 20
Docker TP Master 19 20
Docker TP Master 19 20
Vérifiez que Docker est bien installé en faisant l’équivalent d’un hello-world que l’on fait en
apprenant tout nouveau language de programmation : sudo docker run hello-world. Si
votre utilisateur n’est pas dans le groupe sudo, passez en root pour les manipulations du TP.
Docker liste les containers locaux (vous le ferez vous-même sous peu), découvre qu’il n’a pas
le container hello-world et va le télécharger depuis le dépôt par défaut (le hub docker). Il va
ensuite démarrer le container et l’exécuter. Vous devriez donc obtenir gobalement quelque
chose d’équivalent à :
1
sudo docker run hello-world
Unable to find image ’hello-world:latest’ locally
latest: Pulling from library/hello-world
b901d36b6f2f: Pull complete
0a6ba66e537a: Pull complete
Digest: sha256:....
Status: Downloaded newer image for hello-world:latest
2 Premier container
1. Démarrons notre premier containers ubuntu. docker run ubuntu. Que se passe-t-il ?
2. Un container ne reste en vie que si un processus est actif. On peut lister les containers actifs
avec la commande docker ps. On peut aussi lister tous les containers, actifs ou inactifs avec
docker ps -a. Que vous retourne ces commandes et pourquoi ?
3. Nous allons maintenant rediriger l’entrée standard du container avec l’option -i et ouvrir un
pseudo-terminal avec -t, le tout en exécutant le processus /bin/bash :
docker run -ti --name=ubuntu ubuntu /bin/bash
Quelle est la version d’ubuntu du container (tapez lsb release -a) ? [Erratum : lsb release ! !]
4. Ouvrez un second terminal. Listez les containers actifs ? Combien y en a-t-il ?
5. Le principe d’un container est qu’il ressemble à une VM vu de l’intérieur, mais qu’il est un
ensemble de processus vus de l’extérieur. L’extérieur ici, c’est la machine hôte Debian. Placez
vous dans votre second terminal (celui de l’hôte).
(a) Listez les processus avec top
(b) Ajoutez le namespace des processus afin de voir le namespace de votre container en tapant
f dans le top puis en allant sélectionné le champ nsPID. Une fois ce champ sélectionner
avec les flèches et la barre d’espace, retournez à l’affichage général en tapant q. Si besoin,
agrandissez la fenêtre de votre terminal pour qu’il y ait suffisamment de place pour que
la colonne nsPID puisse apparaitre à l’écran.
(c) top liste les processus par défaut par leur activité CPU. On va donc ”faire du bruit” dans
le container avec la commande yes.
(d) Alternativement, on peut classer les processus suivant le critère désiré. Nous allons les
classer de façon décroissante en tapant à nouveau f puis en se plaçant sur la colonne
nsPID et en tapant s.
Quel est le namespace id de votre container ? Vérifiez que vous voyez tous les processus de
votre container en listant également dans le container avec la commande top.
6. De la même manière, un container obtient des interfaces réseaux qui sont privées, et séparées
de la machine hôte.
(a) Listez les interfaces réseaux de votre container.
2
(b) Quelle est l’adresse IP de votre container ?
(c) Docker assigne une adresse privée à chaque container et lui donne accès au reste de l’in-
ternet au travers d’une passerelle qui est l’interface virtuelle docker de l’hôte. Pour bien
le comprendre
i. Trouvez la passerelle par défaut de votre container avec la commande route ou nets-
tat -r.
ii. Vérifiez que c’est bien une des interfaces de la machine hôte Debian (quel est son
nom ?).
7. Nous allons maintenant arrêter notre container.
(a) .. c’est pas bien compliqué, il suffit de faire un exit dans le container ou un docker stop
ubuntu depuis l’hôte debian.
(b) ...mais vous pouvez le redémarrer en tapant : docker start ubuntu. Vérifiez que le
container est actif.
(c) Le problème est qu’il faut se connecter au container (puisqu’il s’agit ici d’une machine
virtuelle légère). Il suffit de le faire avec la commande docker attach ubuntu (parfois il
faut appuyer sur une touche du clavier pour avoir le prompt). Testez avec votre container.
8. Nous allons maintenant tuer notre container. Cela se fait avec la commande docker rm
ubuntu [Erratum : ubuntu et pas bob !]. Cela n’est possible que si le container est arrêté !
2. On peut inspecter ce qui se passe dans le container depuis la machine hôte avec la commande
docker logs bob ou mieux encore docker logs -f bob qui est (un peu) l’équivalent du
tail -f /var/log/syslog que l’on ferait sur la machine hôte. On peut d’ailleurs exécuter
cette commande pour voir le démon docker qui reporte les manipulations que vous effectués
(démarrage, arrêt de containers, etc.). Faites le test en faisant un ps dans le container et en
ayant le logs ouvert en continue depuis l’hôte. Puis faites un top dans le container.
3. Si on veut surveiller efficacement un container, il faut non seulement lire ses logs, mais
également avoir une estampille temporelle avec l’option t : docker logs -ft bob [Erratum
: -ft après le log !]
4. Docker fournit aussi des statistiques sur l’usage des resources CPU/mémoire/réseau des
containers : docker stats ubuntu. Pour que cela soit intéressant, il faut que le container
soit actif. Lancez la commande yes et vérifiez les statistiques.
3
FROM ubuntu:latest
MAINTAINER Votre nom
RUN apt-get -yqq update && apt-get install -yqq apache2
WORKDIR /var/www/html
ENTRYPOINT [ "/usr/sbin/apache2" ]
CMD ["-D", "FOREGROUND"]
EXPOSE 80
(c) Créons l’image sudo docker build -t=”votre nom/apache” . Attention à ne pas le
oublier le point ’.’ à la fin de la commande (qui indique que le fichier Dockerfile est dans
le répertoire local. Le nom du container est nécessairement du votre nom/apache et non
apache car apache serait interprété comme un répertoire officiel
(d) Listez vos images : docker images.
4
<html>
Hello world
</html>
(c) démarrer votre container en montant le répertoire apache là où le serveur Apache dans le
container va chercher ses données :
docker run -d -p 80:80 -v ~/Docker/Apache/website:/var/www/html
--name=apache votre_nom/apache
(d) vérifiez que le container offre le service attendu.