Premiers pas avec le cli Docker

Créer un premier container

$ docker run -it ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
124c757242f8: Already exists 
9d866f8bde2a: Already exists 
fa3f2f277e67: Already exists 
398d32b153e8: Already exists 
afde35469481: Already exists 
Digest: sha256:de774a3145f7ca4f0bd144c7d4ffb2931e06634f11529653b23eba85aef8e378
Status: Downloaded newer image for ubuntu:latest
root@696f3e56507b:/# 

Pour sortir simplement faire Ctrl+D ou taper exit

Détail des options et paramètres:

  • run : Lancer le container
  • -i, --interactive : Lancement interactif du container
  • -t, --tty : Attacher la console tty au container
  • ubuntu : Le nom de l'image que l'on souhaite lancer
  • /bin/bash : La commande que le container devra exécuter

Lister les containers qui tournent

$ docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS                       PORTS                    NAMES

Sortir d'un container interactif sans l'arrêter

Relançons notre premier container, mais cette plutôt que de faire Ctrl+D, on sort avec Ctrl+P Ctrl+Q

$ docker run -it ubuntu /bin/bash
root@696f3e56507b:/# ^P^Q
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
17144d667c42        ubuntu              "/bin/bash"              43 seconds ago      Up 42 seconds                              amazing_bardeen

S'attacher à un container existant

Pour revenir dans le container que l'on vient de lancer, on attache le tty de notre terminal au container :

$ docker attach amazing_bardeen
root@696f3e56507b:/

Faites Ctrl+D ou exit pour terminer votre shell et arrêter le conteneur.


Lancer un container en arrière plan

On reprend la même commande que tout à l'heure, mais on remplace -it par -d, --detach

$ docker run -d ubuntu /bin/bash
18789da7cf539ffbaa9a0b60f8421d8ad45be94ef0b847867d79fd5e4921aea1
$ docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS                       PORTS                    NAMES

On se rend compte qu'aucun container ne tourne

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
e26252c3aefc        ubuntu              "/bin/bash"              4 seconds ago       Exited (0) 4 seconds ago                        heuristic_wescoff

Le container s'est arrêté car bash s'est lancé correctement et n'était pas attaché.

Maintenant lançons un container qui exécutera une commande sans fin

$ docker run -d ubuntu /bin/bash -c 'while true; do echo "test"; sleep 3; done'
0972961dccedf2f14426b4cff0c6f154a08c8dca9276abd1ae457efc6f40bf19

Sous Powershell, lancer :

$ docker run -d ubuntu /bin/bash -c "while true; do echo 'test'; sleep 3; done"
0972961dccedf2f14426b4cff0c6f154a08c8dca9276abd1ae457efc6f40bf19

Cette fois le container continue bien de tourner en arrière plan

$ docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                    NAMES
0972961dcced        ubuntu                    "/bin/bash -c 'while…"   10 seconds ago      Up 8 seconds                                 friendly_goldstine

Consulter les logs d'un container

Et si on regarde les logs, on observe qu'il fait bien ce que l'on souhaite

$ docker logs 0972961dcced
test
test
test
test
$

Et parce qu'on est accroc aux logs on peut même faire l'équivalent d'un tail -f -n 4

$ docker logs -f --tail 4 0972961dcced
test
test
test
test

Exécuter une commande dans un container détaché

Imaginons que l'on souhaite explorer ce qui se passe dans un container, il peut être utile de pouvoir exécuter une commande directement dedans sans s'y attacher :

$ docker exec -it 0972961dcced /bin/bash
root@0972961dcced:/#

On peut également lancer une simple commande sans s'attacher :

$ docker exec 0972961dcced ps
  PID TTY          TIME CMD
    1 ?        00:00:00 bash
   12 ?        00:00:00 ps
   19 ?        00:00:00 sleep

Arrêter un container

À ce moment, on se dit qu'on a bien fait de mettre un sleep 3, sinon le processeur de la machine s'emballerait. Vient donc la question de comment arrêter le container :

$ docker stop 0972961dcced
0972961dcced

Et si on souhaite l'arrêter plus rapidement, sans attendre un arrêt propre, on peut utiliser l'équivalent d'un kill -9 :

$ docker kill 0972961dcced
0972961dcced

Démarrer un container

En revanche nos containers sont bien arrêtés, mais il sont toujours là, d'ailleurs si on souhaite en redémarrer un on peut faire :

$ docker start 0972961dcced
0972961dcced
$ docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                    NAMES
0972961dcced        ubuntu                    "/bin/bash -c 'while…"   12 seconds ago      Up 10 seconds                                 friendly_goldstine

Supprimer un container

Mais ce container ne faisant pas grand chose, on va l'arrêter et le supprimer :

$ docker stop 0972961dcced
0972961dcced
$ docker rm 0972961dcced
0972961dcced
$ docker ps -a
e26252c3aefc        ubuntu              "/bin/bash"              16 minutes ago      Exited (0) 16 minutes ago                         heuristic_wescoff

Récapitulatif

Si on récapitule, on sait maintenant :

  • Lancer un container en mode interactif docker run -it
  • Lancer un container en arrière plan docker run -d
  • Lister les containers qui tournent et ceux qui ont tourné docker ps et docker ps -a
  • S'attacher à un container existant
  • Exécuter une commande dans un container
  • Consulter les logs d'un container docker logs
  • Démarrer un container existant docker start
  • Arrêter un container docker stop
  • Tuer un container docker kill

Faire le ménage

Supprimer les images inutilisées

Afin de supprimer les images qui ne servent plus il suffit d'utiliser la commande image prune qui supprimera les images qui ne sont pas utilisées dans un container :

$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: node@sha256:3422df4f7532b26b55275ad7b6dc17ec35f77192b04ce22e62e43541f3d28eb3
deleted: sha256:8198006b2b5715ea28c15b9a9d270db3d0aa1bfa7cf60a2ee896654ebbde293f
deleted: sha256:d4dfe2017acf7809babadea61c7268bf457144152ed9c911234399ad42b83f8f
deleted: sha256:eb23969f009b658db5c751dcdb3aca9877cde7af9e526d3675548bc8351ab66b

Total reclaimed space: 61.04MB

Supprimer les containers inutilisés

Pour supprimer les images utilisées dans des containers existants, même arrêtés, il faut tout d'abord suppimer les container avec la commande container prune

$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
17144d667c42c287ac1c76b0c6ba098acbbe5c07d41d9769374c4815250440c6
a9d736fa05f9af3db79ca75d62772af1b68ab596a94bda54057fa3bebecac0f6
64a5b74e85126e33a620642f775c81582093ab1aacdf741dc59a8a6b21552e5a
4f006342e172266c2be5e19fbce1311d836b391477373e1cf8b54bd94385101d
f05da7b94243094c3e54136c59931cf62455104ec3e0fc42804ba58d4f3a0f75
8f95dcfd4e891b9068ac96300e6b2b8fd4552fea06de951d4d1aa110e9278fc0
078b6162efadc4ce334f82c825d39db44e7c030b1b4bdc865d4198ef5def1c23
a5a89cdce7ee7bb593a3bb1ad5ad313aaffcebb63ee3fa01f443b33bd356bdea

Supprimer tous les éléments inutilisés

Docker permet également de faire le ménage de manière générale avec system prune

$ docker system prune
WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all dangling images
        - all build cache
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

Supprimer les volumes inutilsés lors d'un nettoyage

Par défaut system prune supprimera tous les éléments liés à des containers inactifs sauf les volumes. Pour supprimer les volumes avec il faut rajouter l'option --volumes

$ docker volume ls
DRIVER              VOLUME NAME
local               28daf098365b68a0f4c990ea0619428941ab970b0ca5982cfca11240259de9fa
local               a157c23df2ce745e1b96ea7ae49390d297503ea0a2d4ddcd638731c05614427e
$ docker system prune --volumes
DRIVER              VOLUME NAME
$ docker volume ls
DRIVER              VOLUME NAME