TP1 Introduction à Docker
Benoît Benedetti
Octobre 2015
1 Premier conteneur
Le but de cette partie est de vous faire découvrir le client Docker, et de vous
familiariser avec les commandes du client, les images, les conteneurs, savoir lire
la sortie des commandes et débugger leur utilisation Dans la suite, nous mettrons
ces connaissances à profit pour passer à une utilisation pratique de Docker
Lorsque que je vous indique la commande complète, prenez le temps de lire sa
page de manuel, et de comprendre son fonctionnement.
Lorsque la commande à taper n’est pas exactement détaillée, écrivez-là dans ce
document.
Répondez au mieux dans ce document, aux différents questions : vous enverrez
ce document rempli, à l’adresse [Link]@[Link], avec comme sujet de
message TP1 Docker : Nom Prénom
1.1 Interactif
[Link].1 Lancez les conteneurs suivants
docker run ubuntu cat /etc/debian_version
docker run ubuntu uname -a
Expliquez leur sortie.
[Link].2 Exécutez les commandes ps suivantes
docker ps
docker ps -a
docker ps -q
docker ps -qa
docker ps -ql
1
Expliquez leur résultat. Quels sont les noms, identifiants, etats des différents
conteneurs ?
[Link].3 utilisez la commande rm pour faire le ménage dans vos
conteneurs
[Link].4 combinez la commande rm avec la commande ps pour sup-
primer un, plusieurs ou tous les conteneurs
1.2 Images
[Link] Commande images
Utilisez la commande images pour lister les images sur votre hôte.
Quelles sont les images, leurs identifiants ? Quelles images sont des images offi-
cielles ? Pourquoi ?
[Link].1 Commande search
Utilisez la commande search pour rechercher des images de nom busybox et
alpine.
D’après les résultats des recherches, utilisez la commande pull pour récupérer
une version officielle et utilisateur d’une image alpine et/ou busybox.
Relistez vos images avec la commande images, et essayez de répondre aux ques-
tions précédentes.
Utilisez la commande history sur les différentes images : à quoi correspond la
sortie de la commande ?
Lancez des conteneurs à partir de ces images.
Utilisez la commande rmi pour supprimer les images alpine et busybox dont
nous n’aurons plus besoin. Utilisez la commande rm pour faire du ménage dans
les conteneurs.
1.3 Conteneur en arrière-plan
[Link].1 Exécutez un shell dans un conteneur :
Lancez un conteneur comme suit :
docker run -it ubuntu /bin/bash
2
Exécutez ensuite la commande suivante dans votre conteneur :
# while /bin/date ;do /bin/sleep 1 ;done
Que fait la commande précédente ?
Faites Ctrl+c suivi de Ctrl-d, puis docker ps : est-ce que le conteneur précé-
dent apparaît ?pourquoi ?
Relancez un nouveau conteneur avec la même commande :
docker run -it ubuntu /bin/bash
Et relancez la commande dans le conteneur
# while /bin/date ;do /bin/sleep 1 ;done
Faites Ctrl+p+q, puis docker ps : est-ce que le conteneur précédent appa-
raît ?pourquoi ?
[Link].2 Utilisez les commandes suivantes pour suivre l’exécution
de ce conteneur lancé en arrière plan :
docker top
docker logs
docker logs -f
exec
attach
2 Construire ses images
Dans cette partie, nous allons suivre un cas concret d’utiisation de Docker, en
construisant notre propre image Nginx. Nous commencerons manuellement par
modifier un conteneur, puis commiter manuellement les modifications en image.
Puis nous utiliserons un Dockerfile pour automatiser le processus
2.1 Construction manuelle
2.1.1 Installer nginx
[Link] Exécutez les commandes suivantes pour installer manuelle-
ment nginx dans un conteneur :
docker run --name mynginx -it ubuntu /bin/bash
apt-get install -y nginx
exit
3
[Link] Commande diff
Utilisez la commande docker diff sur votre conteneur mynginx. Expliquez son
résultat.
[Link] Committer ses modifications
Utilisez la commande commit pour générer une image à partir de notre conteneur
nginx :
docker commit mynginx mynginximg
A quoi correspond la sortie de cette commande ? Quel est le tag par défaut
de l’image générée ? Exécutez la commande docker images pour vous aider à
répondre aux 2 question précédentes.
Exécutez la commande tag suivante pour rajouter un tag à une image :
docker tag mynginximg mynginximg :0.0
Exécutez la commande images.
Quelle est la différence entre les commandes tag et commit.
Utilisez les commandes ̀tag et commit pour ajouter des tags de votre choix.
[Link].1 Utilisez la commande docker history sur ces différentes
images, et les différentes version taggées
[Link].2 Utilisez la commande rmi pour supprimer des images myn-
ginximg, sauf celles taggées latest et 0.0
[Link] Lancez un conteneur basé sur notre image :
docker run -d mynginximg nginx
docker ps
Pourquoi ça ne marche pas ?
Lancez correctement un conteneur basé sur notre image :
docker run -d mynginximg nginx -g "daemon off ;"
docker ps
4
Lisez la page d’aide la commande docker inspect.
Utilisez la commande suivante sur le conteneur précédent :
docker inspect -f "{{.[Link]}}"
Essayez de pinger votre conteneur :
ping
Essayez un curl sur votre conteneur :
curl http ://ip
Pourquoi la commande suivante ne fonctionne pas :
curl http ://localhost :8080
Utilisez les commandes suivantes pour répondre à ces questions :
docker inspect -f "{{.[Link]}}"
docker port
[Link].1 Rediriger les ports de notre conteneur :
docker run -p 443 -p 80 -d mynginximg nginx -g "daemon off ;"
Quelle différence par raport au run d’avant ? utilisez les commandes inspect,ps,
et port pour répondre à cette question.
[Link].2 Utilisez docker port pour afficher tous les ports redirigés,
ou seulement le port 80
[Link].3 Vous devriez pouvoir afficher la page de votre serveur web
désormais en utilisant localhost et le port redirigé
5
2.2 Volumes
Nous allons nous placer dans un dossier pour la suite de ce TP :
mkdir mynginx
cd mynginx
Dans ce dossier, créez un fichier html :
echo "<h1>Ma page html</h1>" > [Link]
Toujours depuis ce dossier, lancez la commande suivante pour monter le dossier
courant comme répertoire html pour nginx de notre conteneur :
docker run -p 80 -v $(pwd) :/usr/share/nginx/html -d mynginximg nginx -g "daemon off ;"
Affichez votre site. Modifiez votre page.
2.3 Génération automatisée d’image avec un Dockerfile
Dans cette partie, nous allons recréer notre image nginx, mais en automatisant
les commandes depuis un Dockerfile.
2.3.1 Base
[Link].1 Créez un fichier Dockerfile avec le contenu suivant
FROM ubuntu
RUN apt-get install -y nginx
[Link].2 Générez votre image avec la commande suivante :
docker build -t mynginximg .
A quoi correspondent les id de la sortie de la commande ? Utilisez la commande
docker images pour répondre.
Analysez et expliquez la sortie de la commande suivante :
docker history mynginximg
6
2.3.2 Cache
Exécutez les commandes suivantes :
docker build -t mynginximg .
docker build --no-cache -t mynginximg .
Expliquez leurs différences.
Et n’oubliez pas d’exécuter un docker run pour tester votre image avant de
passer à la suite.
2.3.3 Ports
Complétez votre Dockerfile :
FROM ubuntu
RUN apt-get install -y nginx
EXPOSE 80 443
Lancez les commandes suivantes :
docker run -P -v $(pwd) :/usr/share/nginx/html -d mynginximg nginx -g "daemon off ;"
docker ps
Quelles différences avec le Dockefile précédent.
2.3.4 CMD
Complétez votre Dockerfile :
FROM ubuntu
RUN apt-get install -y nginx
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off ;"]
Lancez les commandes suivantes :
7
docker build -t mynginximg .
docker run -P -v $(pwd) :/usr/share/nginx/html -d mynginximg
docker run -it mynginximg nginx -h
docker run -it mynginximg echo Hello
Expliquez leur résultat.
2.3.5 ENTRYPOINT
Complétez votre Dockerfile
FROM ubuntu
RUN apt-get install -y nginx
EXPOSE 80 443
ENTRYPOINT ["nginx", "-g", "daemon off ;"]
Lancez les commandes suivantes :
docker build -t mynginximg .
docker run -it mynginximg echo Hello
docker run -it mynginximg nginx -h
docker run -P -v $(pwd) :/usr/share/nginx/html -d mynginximg
docker run --entrypoint=echo -it mynginximg hello
Quelles différences entre CMD et ENTRYPOINT ?
2.3.6 ENTRYPOINT et CMD
Complétez votre Dockerfile :
FROM ubuntu
RUN apt-get install -y nginx
EXPOSE 80 443
ENTRYPOINT ["nginx"]
CMD ["-g", "daemon off ;"]
Lancez les commandes suivantes :
8
docker build -t mynginximg .
docker run -P -v $(pwd) :/usr/share/nginx/html -d mynginximg
docker run -it mynginximg -h
docker run -it mynginximg echo hello
docker run --entrypoint=echo -it mynginximg hello
Expliquez leur résultat.
3 Publier et récupérer une image
3.1 Hub
[Link] créez un compte sur le Docker Hub
Connectez-vous en ligne de commande avec docker login.
[Link] Poussez votre image sur le Hub
Retaggez votre image pour que son espace de nommage corresponde à votre
utilisateur du Hub. Utilisez la commande push pour déposer votre image sur le
hub
[Link] Récupérez une image depuis le Hub
Supprimez toutes vos images et conteneurs locaux nginx. Récupérez l’image
d’un camarade, et lancez un conteneur basé sur cette image
3.2 Registre local
En suivant les instructions officielles, lancez un conteneur exécutant un registre
local.
Puis renommez votre image avec l’espace de nom de votre registre local. Poussez
cette image vers votre registre local.
Supprimez toutes vos images et conteneurs(sauf le conteneur du registre !) locaux
nginx.
Récupérer l’image nginx depuis votre registre local et lancez un conteneur basé
sur cette image
Quelles différences par rapport au Hub ?
9
4 Pour finir
S’il vous reste du temps, essayez d’améliorer votre Dockerfile, par exemple
en évitant d’inclure les logs nginx dans votre image/conteneur (étudiez
https ://[Link]/nginxinc/docker-nginx/blob/master/Dockerfile).
10