6. Docker : Le cycle de vie d’un container

Le démarrage / arrêt

Nous avons vu dans le chapitre précédent que pour lancer un container, nous utilisions la commande :

docker run IMAGE

Cependant, il faut savoir que la commande “docker run” exécute les deux commande suivantes :

docker create IMAGE
docker start CONTAINER

Il peut parraitre plus simple de créer directement le container en lançant ce dernier avec la commande “docker run”, mais avec les paramètre, il est souvent plus facile de créer une image avec la commande “docker create IMAGE” puis de la lancer avec “docker start CONTAINER”. Nous pourrons ainsi relancer plus facilement un container si ce dernier plante, ou éventuellement démarrer un second container avec la même image.

Afficher les log du container :

docker logs CaontainerName

Pour arrêter un container :

docker stop ContainerName

Il est aussi possible de stoper tout les container qui sont en cours d’exécution en plaçant une variable dans notre commande docker stop :

docker stop $(docker ps -aq)

Quelques explication sur la commande qnue nous venons de tapper:

“$()” est une substitution de commande qui va exécuter la commande entre parenthèse et la remplacer avec le résultat avant d’exécuter la commande docker stop.

“docker ps -aq” ou “docker container la -aq” permet de lister tous les ID des containers. Nous passons donc la liste de tous les ID de containers à la commande docker stop qui va pouvoir stopper tout les container en cours d’exécution.

Pour redémarrer un container :

docker restart ContainerName

En cas de gros plantage, il est tout a fait possible de tuer un container (arrêt brutal) :

docker kill ContainerName

Create

pour créer un container, il suffit comme vu au dessus de taper la commande :

docker create ImageSource

Pour les option du démarrage du container, il faudra mettre les options lors de la création du container.

Pour ajouter le terminal interactif, qui rendra possible la connexion au terminal dans le futur, et un nom à notre container. Ajoutons une commande qui va pinger google.com nous allons entrer la commande suivante :

Commande :
docker create -it --name ImageName ImageSource commande

Exemple :
docker create -it --name machine_test alpine ping google.com

Nous avons créer le container, mais pas encore lancé. C’est pour cela que la commande “docker ps” nous affiche notre container avec le statut “Create”.

Il faut ensuite démarrer le container :

Commande :
docker start ContainerName

Exemple :
docker start machine_test

A ce stade, la commande “docker ps” affiche notre container avec le statut “Up About a minute” car il n’est pas attacher a notre terminale. Cela montre simplement que la machine vient d’être lancé depuis moins d’une minute. Ce container est donc bien démarrer.

Si l’option -it à été activé à la création, nous utiliserons la commande “attach” pour nous attaché (se connecter) au container comme ceci :

Commande :
docker attach ContainerName

Exemple :
docker attach alpine_test

Il est aussi possible de démarrer un container et de directement lui attacher le terminale. La commande “run” et les option attache interactif “-ai” le permet :

Exemple :
docker start -ai ContainerName

Commande :
docker start -ai alpine_test

Pour quitter, la commande “exit” et c’est fait.

Attention, la commande “attach” nous force à éteindre le container en le quittant.

Exercices

Nous allons a présent lancer 3 container en arrière-plan basés sur les images suivantes : mongo, redis et postgres. Les 3 container devrons avoir le nom de l’image (histoire de savoir à quoi cela correspond) Ensuite, nous allons les éteindre tous ensemble et supprimer tous les container qui sont stopper.

Commençons par lancer les 3 container :

docker run -d --name mongo mongo
docker run -d --name redis redis
docker run -d --name postgres postgres

Nous remarquerons une erreur lors du lancement du container postgres.

Nous allons donc afficher les logs qui vont nous donner les erreur que ce container rencontre au démarrage.

docker logs postgres

Nous avons donc l’erreur suivante :

Error: Database is uninitialized and superuser password is not specified.
       You must specify POSTGRES_PASSWORD to a non-empty value for the
       superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".

       You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
       connections without a password. This is *not* recommended.

       See PostgreSQL documentation about "trust":
       https://www.postgresql.org/docs/current/auth-trust.html

Nous pouvons voir qu’il manque une variable d’environnement. Il y est indiquer 2 paramètres possible a ajouter dans notre commande pour remédier a ce problème. Le premier étant “-e POSTGRES_PASSWORD=password” qui permet d’ajouter un mot de passe a postgres. Le second qui est “-e POSTGRES_HOST_AUTH_METHOD=trust” nous permet de démarrer postgres sans mot de passe (il est indiquer que cela n’est pas recommander, mais dans exercice comme celui que nous faisons actuellement, cela n’est pas grave).

Relançons donc notre container sans mot de passe :

docker run -d --name postgres -e POSTGRES_HOST_AUTH_METHOD=trust postgres

Voila, notre container est à présent lancé !

Afficher la liste des container actif :

docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
03d60a10fd76        postgres            "docker-entrypoint.s…"   7 seconds ago       Up 6 seconds        5432/tcp            postgres
3628a246c8fa        redis               "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes        6379/tcp            redis
d6a91ab29dbb        mongo               "docker-entrypoint.s…"   5 minutes ago       Up 5 minutes        27017/tcp           mongo

Tous nos container sont bien actif.

A présent, on stop tout :

docker stop $(docker ps -aq)

OU

docker stop mongo redis postgres

Puis supprimer les container pour nettoyer le système :

docker system prune -a

Image par défaut
administrateur
Publications: 25

Laisser un commentaire