Tutoriel Docker CLI

imt

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 le tag 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