Il existe de nombreuses commandes Docker. La forme des commandes est la suivante : docker OBJET command
Ou OBJET peut-être égal à de nombreuses commandes :
Pour voir la liste des objets :
man docker | less
# Partie Commands
Nous allons nous intéresser aux commandes de bases les plus utilisées.
Dans un premier temps nous allons nous intéresser à la commande "docker image" :
Commande | Utilité |
---|---|
docker image ls | Liste les images |
docker image pull | Récupère une image ou un repo depuis un registry |
docker image push | Push une image ou un repo vers un registry |
docker image inspect | Retourne des informations de bas niveau sur l'image docker |
docker image import | Importe depuis un fichier tar afin de créer une image docker |
Maintenant la commande "docker container" :
Commande | Utilité |
---|---|
docker container ls | Liste les containers |
docker container run | Créer un nouveau container |
docker container inspect | Retourne des informations de bas niveau sur le container |
docker container top | Affiche les process qui tournent dans le container |
docker container restart | Redémarre un ou plusieurs containers |
docker container attach | Attachez les flux STDIN, STDOUT et STDERR à un conteneur en cours d'exécution. |
docker container stop | Stop un ou plusieurs containers |
docker container start | Start un ou plusieurs containers qui ont été stoppés |
docker container logs | Affiche les logs d'un container |
docker container stats | Affiche l'utilisation des ressources (CPU, MEM...) en live d'un container |
docker container exec | Exécute une commande dans un container spécifique (celui-ci doit tourner) |
docker container pause | Met en pause les process d'un ou plusieurs containers |
docker container unpause | Unpause les process d'un ou plusieurs containers |
docker container rm | Supprime un ou plusieurs containers |
docker container export | Export un container sour forme d'archive tar |
docker container prune | Supprime tous les containers stoppés |
Comme vu au dessus la commande docker container run nous permet de créer un container. Nous allons créer notre premier container.
Avant cela, voici quelques paramètres très utiles à la commande docker container run :
Paramètre | Utilité |
---|---|
--help | Affiche l'aide |
--rm | Supprime automatiquement le container lorsque le process a terminé |
-d, --detach | Exécute un container en arrière plan et affiche l'ID du container |
-i, --interactive | Garde STDIN ouvert même si on n'est pas attaché au container |
--name string | Attribue un nom à un container |
-p, --publish list | Publie un ou plusieurs port(s) d'un container |
-t, --tty | Alloue un tty au container |
-v, --volume list | Bind un volume à un container |
Nous allons voir différents cas. On va exécuter un container sans aucun paramètre :
$ docker container run busybox
La commande ne retourne rien, pour cause, le container s'est démarré a exécuté la commande "sh" puis s'est éteint.
$ docker container ls -a # Ou docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2868d62253f busybox "sh" 11 seconds ago Exited (0) 10 seconds ago strange_burnell
On va supprimer ce container :
$ docker container rm e2868
e2868
En utilisant le paramètre --rm cela va supprimer le container dès que le container sera quitté :
$ docker container run --rm busybox
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
On va maintenant exécuter un container en mode détaché :
$ docker container run -d nginx
47665ba870d4a74100c55a2079d2b3b912a0272a85e3c488e7d6dc9cda59cf74
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47665ba870d4 nginx "/docker-entrypoint.…" 33 seconds ago Up 31 seconds 80/tcp determined_ramanujan
On va maintenant attaché notre terminal (STDIN + STDOUT) à un container busybox :
$ docker container run -it busybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # exit
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
On va clean les container grace à la commande prune :
$ docker container prune -f
Deleted Containers:
d2496bd0d64b1ad375f7d7782d8ebb57ab8f978be07a52dd2217ebacc70b7319
Total reclaimed space: 19B
On va maintenant exécuter un container my_busybox en mode détaché, avec la commande "sleep 3600". Cela aura pour effet de laisser le container allumé pendant 1h.
Ensuite nous allons exécuter la commande "sh" dans le container fraichement crée :
# Exécution d'une commande personnalisée, sleep 3600, à la fin de la commande
$ docker container run -d --name my_busybox busybox sleep 3600
e17da80c9080de3538f5180407b32adb8f662337c45803d34bb1d128242cfc57
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e17da80c9080 busybox "sleep 3600" 2 seconds ago Up 1 second my_busybox
$ docker exec -it my_busybox sh
/ # ls
bin dev etc home proc root sys tmp usr var
/ # mkdir test
/ # exit
# On va maintenant regarder si le container tourne toujours :
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e17da80c9080 busybox "sleep 3600" 26 seconds ago Up 25 seconds my_busybox
Exposer le port d'un container va nous permettre de documenter quel port utilise le container en question.
Publier le port d'un container va nous permettre d'ouvrir notre container sur l'extérieur.
Exposer :
$ docker container run --expose 1234 <IMAGE>
Publier :
En pratique :
$ docker run -d --expose 3000 nginx
Status: Downloaded newer image for nginx:latest
7250dfb28523a3063670293e5cc7b749b34db1770741c7021c5dab215375f1b0
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7250dfb28523 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 80/tcp, 3000/tcp magical_hertz
$ docker run -d --expose 3000 -p 8080:80 nginx
11e69661223af4782ccdc9f872ef7e54e71b4f0daaf40c5bc606d1903560d2a4
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11e69661223a nginx "/docker-entrypoint.…" 2 seconds ago Up 1 second 3000/tcp, 0.0.0.0:8080->80/tcp intelligent_pare
$ curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
Voici l'explication des commandes utilisées ci-dessus :
Commande | Utilité |
---|---|
docker container run -p <HOST_PORT>:<CONTAINER_PORT> <IMAGE> | Publication d'un port tcp et udp |
docker container run -p <HOST_PORT>:<CONTAINER_PORT>/tcp -p <HOST_PORT>:<CONTAINER_PORT>/udp <IMAGE> | Publication de deux ports, un tcp l'autre udp |
docker container run -P | Publication de tous les ports exposés sur un port aléatoire de l'hôte |
docker container port <NAME> | Lister tous les ports publié d'un container |
Pour exécuter des commandes dans un container fonctionnel il existe plusieurs façon de faire :
La commande peut être une commande "one-shot" : exécute la commande et quitte. Mais celà peut aussi être une commande plus longue.
Commande | Utilité |
---|---|
docker container run <IMAGE> <CMD> | Démarre un container avec une commande spécifique (comme on l'a déjà fait plus haut). Cela écrasera la commande par défaut. |
docker container exec -it <NAME> <IMAGE> | Exécute une commande dans un container fonctionnel. |
On peut retrouver le dockerfile de nginx ici. En allant tout en bas du fichier, on peut voir la commande (CMD) par défaut qui est exécuté lorsque l'on fait un docker run. Cependant, nous pouvons écraser cette commande via la solution suivante :
$ docker container run -it nginx /bin/bash
root@aa0e0918f13b:/# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr
root@aa0e0918f13b:/# pwd
/
On peut faire pareil sur un container qui tourne déjà :
$ docker run -d nginx
a774e4c518cd98df18cab5b1b608709d780dd869d0b023a1cb14a94a0d352cca
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a774e4c518cd nginx "/docker-entrypoint.…" 2 seconds ago Up 1 second 80/tcp magical_keller
# Commande one shot
$ docker exec -it a774 ls /usr/share/nginx/html
50x.html index.html
# Commande longue et intéractive
$ docker exec -it a774 /bin/bash
root@a774e4c518cd:/# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr
root@a774e4c518cd:/#
Si on quitte le container, celui-ci continuera de tourner car le process principal tourne toujours.
Commande | Utilité |
---|---|
docker container logs <NAME> | Affiche les informations logués par le container |
docker service logs <SERVICE> | Affiche les informations logués par tous les containers d'un service |
Les logs sortants de docker container/service logs proviennent du STDOUT/STDERR.