Tutoriel Docker CLI
1. Objectif
Nous allons dans ce tutoriel explorer toutes les commandes de base de Docker CLI. Cela va vous permettre de comprendre comment utiliser Docker sans interface graphique.
CLI = Command Line Interface
2. Aide Docker CLI
Docker CLI est muni d’un helper assez bien fait puisque chaque commande et sous commande possède son aide.
Par exemple, voici l’aide racine de la CLI
docker -h
Et par exemple on peut afficher le helper pour la commande images
docker images -h
Vous ne devriez donc jamais être vraiment perdus ! Vous pouvez essayer de naviguer ainsi dans les différents helper.
3. Manipuler des images Docker prêtes à usage sur DockerHub
Nous allons commencer par télécharger une image Docker hello-world
de démonstration.
Voici l’image en question : https://hub.docker.com/_/hello-world
En allant sur cette page vous pouvez voir les informations suivantes :
-
il s’agit d’une image officielle et cela est important pour des raisons de sécurité, les images officielles sont maintenues et mises à jour
-
il existe différentes versions pour cette image. Par défaut la plus récente (
latest
) sera utilisée mais nous pourrions préciser letag
de la version souhaitée lors du téléchargement de l’image
Téléchargeons donc cette image comme indiqué sur la page avec la CLI
docker pull hello-world
Le téléchargement devrait être rapide car l’image est légère
Une fois le pull
terminé allez inspecter vos images Docker avec l’une des commandes suivantes :
docker images
docker image ls
Vous pouvez aussi aller regarder les détails sur l’image
docker image inspect id
Plus généralement tout ce qui peut être fait sur une image Docker avec la CLI est listé en faisant
docker image -h
4. Manipuler les conteneurs Docker
Une image n’est pas un conteneur, il faut créer et démarrer un conteneur à partir d’une image. La commande run
permet les deux à la fois
docker run hello-world
Ici nous créons le conteneur à partir de l’image nommée hello-world
et lançons le conteneur
Le conteneur est alors créé et démarré dans la foulée et retourne le résultat de son démarrage
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Si l’on regarde les conteneurs en cours d’exécution
docker ps
la liste est vide car le conteneur que nous avons créé a déjà terminé son exécution ! Il est toutefois présent dans la liste des conteneurs au status exited
docker ps -a
si l’on ré-exécute les commandes suivantes :
docker run hello-world
docker ps -a
vous devriez observer deux conteneurs exited
correspondant aux deux commandes run
. Chaque commande créée un conteneur puis exécute la commande sur celui-ci.
Comme pour toute ressource Docker, les conteneurs peuvent aussi être inspectés
docker container inspect id
5. Nettoyages et suppressions
Avant de passer à la suite nous allons faire un peu de nettoyage !
Nous pouvons commencer par supprimer les conteneurs qui ne sont plus utilisés (terminés) :
docker container prune
Nous pouvons ensuite supprimer l’image hello-world
qui ne nous sera plus utile
docker image rm hello-world
6. Travail sur une image Ubuntu
Nous allons récupérer une image Ubuntu, plus lourde cette fois (profitez en pour aller explorer DockerHub)
docker pull ubuntu
Cette image contient un Linux distribution Ubuntu. Si je run
cette image simplement il ne va rien se passer de visible.
docker run ubuntu
docker ps -a
En fait, on voit avec le ps
que la commande \bin\bash
a été lancée dans le conteneur, c’est l’instruction lancée par défaut au démarrage du conteneur. Mais pour y accèder mieux vaut lancer le conteneur en mode intéractif (-i) avec terminal (-t) :
docker run -it ubuntu /bin/bash
apt-get update
apt-get install htop
export TERM=xterm
htop
Dans un autre terminal on peut voir le conteneur actif
docker ps
Toujours dans cet autre terminal nous allons nous attacher au conteneur actif
docker container attach id
Vous devriez voir apparaître le htop intéractif également car nous nous sommes attachés aux entrées/sorties du conteneur.
Tuons ce conteneur maintenant !
docker container kill id
Par contre si on redémarre un conteneur à partir de l’image, les modifications effectuées sur le conteneur sont perdues !
docker run -it ubuntu /bin/bash
htop
7. Commit une image
Nous allons recommencer les étapes précédentes pour un conteneur Ubuntu sur lequel on installe htop
.
docker run -it ubuntu /bin/bash
apt-get update
apt-get install htop
Dans un autre terminal nous allons faire un commit
pour créer une image à partir du conteneur indiqué.
docker commit id-container
Vous pouvez maintenant vérifier la nouvelle image :
docker run -it id-new-image /bin/bash
htop
8. Exposition des ports d’un conteneur
Nous allons utiliser l’image whoami
de DockerHub pour illustrer l’exposition des ports d’un conteneur.
docker pull containous/whoami
docker run containous/whoami
Ceci devrait s’afficher, attestant du démarrage du service sur le port 80
Starting up on port 80
Dans un autre terminal testons le service
curl http://localhost:80/
Vous devriez avoir le message suivant
curl: (7) Failed to connect to localhost port 80 after 0 ms: Connection refused
Le port 80 est celui utilisé sur le conteneur mais nous n’avons pas exposé le port pour un accès depuis l’extérieur du conteneur ! Pour cela nous pouvons explicitement demander l’exposition du port 80 à l’intérieur du conteneur sur le port 80 à l’extérieur du conteneur :
docker run -p 80:80 containous/whoami
curl http://localhost:80/
Ou bien laisser Docker choisir un port aléatoire ce qui demande d’aller inspecter le port sélectionné ensuite
docker run -P containous/whoami
docker inspect --format '{{ .NetworkSettings.Ports }}' container-id
curl http://localhost:found-port/
Pour terminer, vous pouvez afficher des statistiques sur vos conteneurs
docker stats container-id