Voici le quatrième volet de la formation Docker. Dans mon précédent article, nous nous sommes intéressés à la gestion des images des conteneurs Docker. Aujourd’hui nous allons voir de plus près tout ce qui tourne autour de l’exécution d’un conteneur :
- Connaître les principales options pour la commande
docker run
- Donner un nom à vos conteneurs
- Gérer ces conteneurs en utilisant leurs noms respectifs
- Afficher l’état d’un conteneur en état d’exécution ou à l’arrêt
- Configurer un conteneur de manière à ce qu’il soit relancé automatiquement en cas de redémarrage de l’hôte
- Afficher la sortie d’un conteneur qui tourne en arrière-plan
- Supprimer rapidement des conteneurs qui ont été arrêtés
Il se peut qu’au fil de ces ateliers pratiques, je reprenne en détail certaines notions que j’ai déjà mises en place précédemment. Ça ne veut pas dire que je perds la boule, mais que j’aime bien une approche itérative qui met en lumière les points importants sous un angle un peu différent.
Comprendre quelques concepts importants
Parfois, les utilisateurs qui débutent avec Docker essaient d’exécuter un conteneur et se rendent compte que le conteneur ne tourne pas. Ce qui se passe dans ces cas-là, c’est que le conteneur démarre puis s’arrête immédiatement.
Ce que les gens veulent faire en général, c’est démarrer un conteneur et le faire fonctionner en arrière-plan. Dans ce cas, il vous faut indiquer explicitement à Docker que c’est ce que vous voulez faire.
Docker traite le logiciel qui se trouve à l’intérieur du conteneur comme n’importe quel processus système. Une fois que le processus est stoppé, Docker arrête le conteneur. On doit donc le détacher pour qu’il continue à fonctionner en arrière-plan.
L’exécution en avant-plan par défaut est une option valable si un conteneur effectue une tâche unique bien précise, comme par exemple télécharger un fichier, le traiter d’une manière ou d’une autre, puis enregistrer les données traitées quelque part.
En revanche, un conteneur est généralement censé continuer à tourner et à fournir un service ou un processus permanent :
$ docker run -dit debian 3d631b930885d7e1d135b348bf34c69e002aa9d455f7f438cbcbd4dcff9dbbe8
- L’option
-d
utilisée pour détacher le conteneur peut être considérée comme une façon de le démoniser. De manière générale, un démon (de l’anglais daemon) est un programme, un processus ou un ensemble de processus qui s’exécute en arrière-plan plutôt que sous le contrôle direct d’un utilisateur. - Les options
-i
et-t
associées permettent de disposer d’un shell interactif pour pouvoir accéder à ce conteneur. - Les options
-dit
sont généralement utilisées ensemble.
Donner un nom parlant à un conteneur
Manipuler les conteneurs en utilisant leur empreinte ou leur nom aléatoire n’est pas très convivial. C’est un peu le même principe que pour les adresses IP. Au lieu de mémoriser une séquence de chiffres, on a recours au DNS pour que les humains puissent utiliser un nom pour accéder à une adresse IP.
Docker nous permet de faire quelque chose de très similaire. Vous pouvez donner un nom à un conteneur, puis utiliser ce nom plutôt que l’ID du conteneur pour pour vous y référer . Cela vous permet de donner un nom approprié à vos conteneurs.
Concrètement, au lieu de manipuler un conteneur 3e03c8cff364...
nous pouvons simplement le nommer web
:
$ docker run -dit --name web debian 3e03c8cff364c8a4e3e543c99f1f5ad243fd8877fe4fa2dc80a44cf4c4f2ad24 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3e03c8cff364 debian "bash" 4 seconds ago Up 2 seconds web c4494c0904c9 debian "bash" 3 minutes ago Up 3 minutes fervent_mendel
Ici nous avons deux conteneurs en cours d’exécution :
- Le premier que nous avons démarré a reçu un nom par Docker, en l’occurrence
fervent_mendel
. Docker génère ces noms de manière aléatoire. - Quant au second conteneur
web
, c’est nous qui l’avons nommé explicitement.
N’oubliez pas que la commande docker ps
ne vous affiche que les conteneurs en état d’exécution. Si vous souhaitez jeter un œil sur les conteneurs à l’arrêt, il vous faudra utiliser l’option -a
qui signifie all.
À présent, lancez un troisième conteneur :
$ docker run -dit --name conteneur_trois debian a50d0ce4292a23b6b5587462a30149a8f89abb48219ddfb93c6271a877f0f73b
Voici la commande qui permet de savoir quel est le dernier conteneur qui a été lancé :
$ docker ps -l CONTAINER ID IMAGE COMMAND CREATED ... NAMES a50d0ce4292a debian "bash" 19 seconds ago ... conteneur_trois
- L’option
-l
signfie latest et nous affiche le dernier conteneur qui a été créé, indépendamment de son état, c’est-à-dire qu’il peut déjà être arrêté ou encore en état d’exécution.
Si un conteneur du même nom existe déjà, Docker refusera de vous laisser exécuter un autre conteneur du même nom :
$ docker run -dit --name web debian docker: Error response from daemon: Conflict.
Arrêter et relancer un conteneur
Pour arrêter un conteneur, nous utilisons la commande docker stop
:
$ docker stop web web
- Maintenant que le conteneur
web
est arrêté, nous pouvons l’afficher avec la commande dockerps -a
. Notez que son statut estExited
. - Un simple
docker ps
ne nous permettra pas de voir le conteneurweb
, étant donné qu’il n’est pas en état d’exécution.
Supprimons ce conteneur :
$ docker rm web web $ docker ps -a
- Le conteneur
web
a été supprimé pour de bon. - Partant de là, le nom
web
est susceptible d’être réutilisé en cas de besoin.
La commande docker start
permet de démarrer un conteneur arrêté :
$ docker run -dit --name web debian b47080056050eeb4a51619687a2faa464fadd5135a2a3f0fe2017c6cf9401a6f $ docker ps CONTAINER ID IMAGE COMMAND CREATED ... NAMES b47080056050 debian "bash" 5 seconds ago ... web a50d0ce4292a debian "bash" 7 minutes ago ... conteneur_trois c4494c0904c9 debian "bash" 14 minutes ago ... fervent_mendel $ docker stop web web $ docker ps -a CONTAINER ID IMAGE COMMAND ... STATUS ... NAMES b47080056050 debian "bash" ... Exited (137) 4 seconds ago web a50d0ce4292a debian "bash" ... Up 7 minutes conteneur_trois c4494c0904c9 debian "bash" ... Up 14 minutes fervent_mendel $ docker start web web $ docker ps CONTAINER ID IMAGE COMMAND ... STATUS PORTS NAMES b47080056050 debian "bash" ... Up 5 seconds web a50d0ce4292a debian "bash" ... Up 7 minutes conteneur_trois c4494c0904c9 debian "bash" ... Up 14 minutes fervent_mendel
Arrêtez et supprimez ce conteneur :
$ docker stop web $ docker rm web $ docker ps -a
Redémarrer automatiquement un conteneur
Imaginez ce qui se passe si la machine qui exécute le moteur Docker redémarre. Il y aura très certainement une série de conteneurs que vous souhaitez relancer.
De même, au cas où un conteneur plante pour une raison ou pour une autre, vous souhaitez probablement qu’il redémarre tout seul sans l’intervention d’un administrateur humain. Docker fournit cette fonctionnalité grâce à l’option --restart
.
$ docker run -dit --restart always --name conteneur_quatre debian 497d59bd57d53ab987a511b7834db3dec43d75cf115d13a78212628319df7439
Si nous utilisons cette option, nous pouvons vérifier l’application de la politique de redémarrage automatique en inspectant le conteneur comme ceci :
$ docker inspect conteneur_quatre | grep -A 3 RestartPolicy "RestartPolicy": { "Name": "always", "MaximumRetryCount": 0 },
L’option -A 3
indique à grep
d’afficher l’occurence et les trois lignes subséquentes. Pour en avoir le cœur net, jetez un œil dans la page de manuel grep(1)
.
Voici l’ensemble des options que vous pouvez utiliser avec docker run
. Vous noterez qu’elles sont nombreuses :
$ docker run --help | less
Forcer l’arrêt d’un conteneur
Il peut arriver que vous soyez confronté à un problème lorsque vous essayez d’arrêter un conteneur :
$ docker stop tender_ellis
Lorsque Docker rencontre un problème lors de l’arrêt d’un conteneur, il vous affiche un avertissement simple qui vous permet en règle générale de résoudre le problème.
Dans certains cas de figure, vous devrez utiliser la sous-commande kill
pour forcer l’arrêt d’un conteneur :
$ docker kill tender_ellis tender_ellis
La commande docker kill
peut vous tirer d’affaire, mais attention ! Elle ne permet pas de réaliser un arrêt en bonne et due forme comme le ferait la commande docker stop
. C’est rare, mais sachez qu’en utilisant docker kill
, vous pouvez mettre votre conteneur dans un état qui l’empêchera d’être redémarré. En règle générale, cela n’a pas d’importance, puisque les conteneurs sont conçus et exécutés de manière à être jetables.
Supprimer les conteneurs arrêtés
La commande docker system prune
peut être utilisée pour supprimer des conteneurs arrêtés. C’est souvent plus simple que d’invoquer un docker rm
pour chaque conteneur à l’arrêt :
$ docker ps -a ... $ docker system prune WARNING! This will remove: - all stopped containers - all networks not used by at least one container - all dangling images - all dangling build cache Are you sure you want to continue? [y/N] y Deleted Containers: 4ee29e393a22d286e2a70de462c585cf40fdc27706f275da1fe94b8236ab6aa3 e53ad17d7fc138672d9e51acf18275ac4573b5165eb215f503e917aab8c1a0ce ...
Supprimer automatiquement un conteneur qui s’arrête
Si vous souhaitez faire le ménage derrière vous automatiquement, utilisez l’option --rm
en combinaison avec la sous-commande run
. Dès que le processus principal d’un conteneur est terminé, Docker supprime automatiquement ce conteneur si vous utilisez l’option --rm
.
$ docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:49a1c8800c94df04e9658809b006fd8a686cab8028d...
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
$ docker ps -a
- Nous ne voyons pas la moindre trace du conteneur. Ce qui s’est passé, c’est que le conteneur a été lancé, il a affiché quelque chose, il s’est arrêté, et puis Docker l’a supprimé justement parce qu’il s’est arrêté.
- Ce n’est pas une mauvaise idée d’utiliser l’option
--rm
au quotidien pour limiter le bazar sur le système.
Afficher les logs d’un conteneur
Tout à l’heure nous avons exécuté la commande docker run hello-world
, et le conteneur s’est exécuté en avant-plan en affichant ses données directement dans la console. Comment pouvons-nous voir ces données si nous exécutons le conteneur en arrière-plan ?
La solution consiste ici à utiliser la commande docker logs
:
$ docker run -dit hello-world
b9a9ba3116ec8f6341f313d5133885e28bd2535d341777ae2da...
$ docker logs b9a9
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
Affichez les options disponibles :
$ docker logs --help
L’option -t
permet d’afficher l’horodatage (timestamp) de la sortie, ce qui peut s’avérer utile pour un éventuel débogage :
$ docker logs -t b9a9
2023-06-29T06:52:24.949260256Z
2023-06-29T06:52:24.949346103Z Hello from Docker!
2023-06-29T06:52:24.949370149Z This message shows that your installation
appears to be working correctly.
...
Pour afficher la sortie du container en temps réel, utilisez l’option -f
. Si avez l’habitude d’utiliser la commande tail -f
sous Linux, le principe est exactement le même. L’option -f
signifie follow et affiche la sortie au fur et à mesure qu’elle est générée :
$ docker logs -f 8b5c
Ces options peuvent très bien être combinées :
$ docker logs -tf 8b5c
Exercice
- Arrêtez tous les conteneurs en marche et faites un peu de ménage.
- Lancez un conteneur basé sur l’image officielle du serveur Redis.
- Vérifiez si le conteneur est en état d’exécution.
- Notez l’identifiant et le nom humainement lisible du conteneur.
- Lancez un deuxième conteneur basé sur l’image officielle de Redis et nommez-le
conteneur_redis
. - Vérifiez s’il tourne comme prévu.
- Arrêtez le conteneur
conteneur_redis
. - Affichez le ou les conteneurs en état d’exécution.
- Lancez un conteneur basé sur l’image
hello-world
de manière à ce qu’il s’autodétruise juste après son exécution. - Vérifiez s’il ne reste aucune trace du conteneur que vous venez de lancer.
- Lancez un autre conteneur basé sur l’image
hello-world
, mais sans qu’il soit supprimé après exécution. - Vérifiez la présence du conteneur à l’arrêt.
- Lancez un troisième conteneur basé sur l’image
hello-world
, mais en arrière-plan. - Vérifiez s’il est en état d’exécution.
- Demandez-vous ce qui se passe.
- Le conteneur que vous venez de lancer a produit une sortie. Pouvez-vous la récupérer, et si oui, comment ?
- Pouvez-vous savoir à quelle heure exacte le conteneur a produit cette sortie ?
Lire la suite : Exposer un conteneur
La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.
0 commentaire