GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

Commandes Docker pour la gestion du cycle de vie des conteneurs (Guide définitif)

Connaître les différents états du conteneur Docker est essentiel pour tout utilisateur sérieux de Docker.

Je vais expliquer le cycle de vie du conteneur, puis montrer les commandes Docker pour chaque étape du cycle de vie.

Mais avant d'apprendre toutes ces choses, revenons une fois de plus sur le concept de conteneur.

Que sont encore les conteneurs Docker ?

La plupart des définitions traditionnelles des conteneurs ressemblent à ceci :

Les conteneurs sont une forme de virtualisation du système d'exploitation. Alors que la virtualisation traditionnelle basée sur un hyperviseur nécessite des noyaux distincts pour des machines virtuelles distinctes, les conteneurs partagent le même noyau hôte et sont donc beaucoup plus légers et plus rapides à démarrer

La définition diffère d'une source à l'autre, mais l'essentiel est le même.

Je trouve cela ennuyeux et inutilement compliqué. J'aimerais utiliser quelque chose de différent ici pour définir les conteneurs.

Les conteneurs sont un ensemble de processus qui sont trompés.

Pourquoi est-ce que je dis ça ? Parce que les conteneurs ne sont qu'un ensemble de processus, parfois un seul processus. Et ces processus se font mentir à propos de différentes ressources de son hôte comme les réseaux, l'arborescence des processus, le système de fichiers, le nom d'hôte, etc.

Vous pouvez exécuter n'importe quel processus, même un shell comme bash , et cachez-y votre arborescence de processus réelle, donnez-lui un ensemble de réseaux différent, cachez-lui le système de fichiers racine réel, donnez-lui un nom d'hôte différent et essentiellement, ce que vous finirez par faire est de créer une version conteneurisée du processus.

Ceci est réalisé par des espaces de noms, un système de fichiers racine séparé et des groupes de contrôle.

Docker n'est qu'un wrapper autour des outils de niveau inférieur qui exécutent et gèrent les conteneurs, ou plus précisément le cycle de vie des conteneurs .

En dehors de cela, Docker fait également beaucoup d'autres choses, comme faciliter la mise en réseau des conteneurs, gérer le stockage, tirer et pousser des images de conteneurs, etc.

Docker est là pour nous faciliter la vie.

Regardons maintenant le cycle de vie du conteneur Docker

Le cycle de vie d'un conteneur est essentiellement une série d'étapes, allant de la création du conteneur à sa destruction.

Le diagramme suivant va rendre cela beaucoup plus clair.

Laissez-moi vous expliquer chaque étape du cycle de vie du conteneur.

  • Création : Beaucoup de gens pensent que lorsque vous exécutez un conteneur, il s'agit d'une seule étape. Mais ce n'est pas le cas. Il existe un processus qui crée les conteneurs avant toute autre chose. Plus d'informations à ce sujet plus tard.
  • Démarré/en cours d'exécution : Une fois qu'un conteneur est créé, il peut être démarré, après quoi le statut passe à Running . C'est à ce moment que le conteneur fait réellement quelque chose.
  • En pause : Traditionnellement, pour mettre en pause un processus (ce que sont essentiellement les conteneurs), nous utilisons le signal SIGSTOP et, pour reprendre, le signal SIGCONT. Mais comme ce signal est observable par les processus, au lieu de signaux, des congélateurs de groupes de contrôle sont utilisés. De cette façon, les processus sont suspendus en gelant le groupe de contrôle.
  • Sortie/Arrêt : Le contraire de Running , mais différent de Paused . L'arrêt d'un conteneur signifie l'envoi du signal SIGTERM au processus principal du conteneur, c'est-à-dire le PID 1 dans l'espace de noms du conteneur. Il attend ensuite 10 secondes pour laisser le processus se terminer normalement. Si ce n'est pas le cas, un SIGKILL signal est envoyé, et nous savons tous ce que cela signifie, n'est-ce pas ?
  • Détruit/Supprimé : Le conteneur n'existe plus, toutes les ressources qu'il attribuait autrefois ont maintenant disparu.

J'espère que cela a rendu le concept de cycle de vie des conteneurs plus clair maintenant. Dans la section suivante, je passerai en revue toutes les commandes docker spécifiques qui vous aideront à gérer tous ces états de conteneurs.

Commandes Docker pour gérer le cycle de vie des conteneurs

Toutes les commandes (sous-commandes, si elles sont plus spécifiques) qui contrôlent le cycle de vie du conteneur appartiennent à la sous-commande container .

Dans un terminal si vous exécutez docker container --help vous obtiendrez une liste de sous-commandes associées à plusieurs opérations pouvant être effectuées sur des conteneurs.

Mais nous ne sommes pas concernés par chacun d'eux ici. Concentrons-nous uniquement sur un sous-ensemble spécifique de ceux-ci.

Création de conteneurs

La création du conteneur est gérée par les commandes suivantes :

  1. docker container create
  2. docker create

Le premier est la forme longue, tandis que le second, vous l'avez bien deviné, est la forme courte.

Je vous recommande d'utiliser la forme longue car elle est plus détaillée et je la considère comme une bonne pratique.

Qu'est-ce que la création de conteneur ?

La création du conteneur consiste à créer la couche R/W au-dessus de la ou des couches R/O de l'image spécifiée et à la préparer pour exécuter le programme requis. La création d'un conteneur ne démarre pas le processus réel, vous pouvez spécifier tous les paramètres de configuration tels que les capacités, la limite du processeur, la limite de mémoire, l'image du conteneur, etc. directement au stade de la création, puis démarrer le conteneur à tout moment sans avoir à re-spécifier ces paramètres .

Lire docker container create --help pour une liste d'options configurables.

Exemple

Créez d'abord un conteneur comme celui-ci (j'ai utilisé un alpine image ici pour lancer la commande sleep infinity )

docker container create \
	--name alpine alpine:latest sleep infinity

Une fois le conteneur créé, vous devriez obtenir l'ID de celui-ci dans l'écran du terminal. Vous pouvez maintenant filtrer la liste des conteneurs pour trouver les conteneurs qui ne sont pas en cours d'exécution, mais qui viennent juste d'être créés .

docker container ls --filter=status=created

Ici, je filtre la liste pour n'obtenir que les conteneurs créés. Jetez un œil au STATUS colonne, c'est ce qui spécifie l'état d'un conteneur. Vous devriez voir quelque chose comme ce qui suit :-

➟ docker container ls --filter=status=created
CONTAINER ID   IMAGE           COMMAND            CREATED          STATUS    PORTS     NAMES
3f8d56fb3f78   alpine:3.13.4   "sleep infinity"   17 seconds ago   Created             alpine

Vous pouvez également inspecter le conteneur et voir dans quel état il se trouve.

➟ docker container inspect -f '{{json .State.Status}}' alpine
"created"

Utilisation de docker create ne vous donnera rien de différent.

Démarrage du conteneur

Pour démarrer un conteneur, utilisez l'une des deux commandes suivantes :-

  1. docker container start
  2. docker start

Même chose ici, une version longue et une version courte. Et je vous recommande d'utiliser le ...container start commande.

Qu'est-ce que le démarrage d'un conteneur ?

Une fois qu'un conteneur a été créé, vous pouvez le démarrer. Démarrer le conteneur signifie en fait exécuter l'application conteneurisée.

Bien que la création d'un conteneur prépare simplement toute la configuration (comment le conteneur fonctionnera, environnement d'exécution, contraintes d'exécution, nom du conteneur, etc.), elle n'alloue aucune des ressources.

Le démarrage d'un conteneur alloue les ressources nécessaires et exécute l'application.

Exemple

Considérez le conteneur précédent que nous avons créé. Lancez simplement la commande avec le nom ou l'ID du conteneur comme ceci :

docker container start alpine

Une fois le conteneur démarré, son statut passe de Created à Running . Dans la liste des conteneurs, vous pouvez à nouveau filtrer par statut comme vous l'avez fait précédemment :-

docker container ls --filter=status=running

Sur le STATUS colonne, au lieu de Running il montrera combien de temps le conteneur a fonctionné depuis son démarrage.

➟ docker container ls --filter=status=running
CONTAINER ID   IMAGE           COMMAND            CREATED         STATUS          PORTS     NAMES
3f8d56fb3f78   alpine:3.13.4   "sleep infinity"   8 minutes ago   Up 18 seconds             alpine

Vous pouvez également inspecter un conteneur pour voir son état. J'utiliserai des modèles Go pour formater la sortie sur la seule chose dont j'ai besoin, c'est-à-dire l'état.

docker container inspect \
	-f '{{json .State.Status}}' alpine

Vous devriez voir quelque chose comme ça -

➟ docker container inspect -f '{{json .State.Status}}' alpine
"running"

Ne pas sembler redondant, mais docker start fera exactement la même chose.

La commande spéciale d'exécution de Docker

Il s'agit d'une commande spéciale qui lie la création et le démarrage du conteneur et c'est la commande que nous utilisons tous le plus.

  1. docker container run
  2. docker run

Ces commandes (i) créent essentiellement le conteneur, puis immédiatement (ii) démarrent le même conteneur.

Ceci est utile car créer et laisser un conteneur pour démarrer plus tard n'est pas quelque chose que nous faisons trop souvent. Lorsque vous êtes en ligne de commande, avec la CLI docker, vous êtes ici pour exécuter un contenant. Et c'est exactement ce que ...container run la commande le fait.

Exemple

L'exemple de cette commande est très simple. Pour exécuter un conteneur, au lieu de docker container create , utilisez docker container run .

Vous allez devez passer toutes les options que vous passeriez à docker container create à cette docker container run commande. En effet, docker a besoin de toutes ces informations à ce moment précis, car il n'y a plus de deuxième étape.

➟ docker container run --name echo-me alpine:3.13.4 echo "Subscribe to Linux Handbook"
Subscribe to Linux Handbook
Docker Run vs Start vs Create :Différence expliquée Cet article explique la différence avec des exemples. Manuel LinuxAbhishek Prakash

Pause du conteneur

Mettre un conteneur en pause signifie exactement comment ça sonne. Nous n'arrêtons aucun processus, nous le mettons simplement en pause. Donc, si un processus à l'intérieur d'un conteneur compte de 1 à 100, et qu'il a été mis en pause alors qu'il était au compte 50, puis repris plus tard, le compte reprendra à partir de 50.

Une chose à comprendre est que pendant la Paused est un état réel, Unpaused n'est pas. Lorsque vous réactivez un conteneur en pause, vous modifiez essentiellement l'état de Paused à Running .

Les commandes utilisées pour suspendre un conteneur sont les suivantes :-

  1. docker container pause
  2. docker pause

De même, vous pouvez réactiver un conteneur avec les contreparties réactives :-

  1. docker container unpause
  2. docker unpause

Comment un conteneur est-il mis en pause ?

Un processus est mis en pause en utilisant le signal SIGSTOP, et pour reprendre, le signal SIGCONT est utilisé. Étant donné que ces signaux peuvent être observés par les processus, au lieu de signaux, des congélateurs de groupes de contrôle sont utilisés. De cette façon, les processus sont suspendus en gelant le groupe de contrôle. Geler un groupe de contrôle fige toutes ses tâches et tous ses groupes de contrôle enfants.

Exemple :

Pour les besoins de cette démo, j'ai créé un conteneur spécial. Extrayez l'image en exécutant la commande suivante :-

docker image pull debdutdeb/pause-demo:v1

Vous pouvez vérifier le Dockerfile et le code ici.

Une fois tiré, sur un terminal, démarrez un conteneur avec cette image

docker container run --name pause-demo debdutdeb/pause-demo:v1

Il devrait maintenant montrer le comptage à partir de 0 et continuer. Devrait ressembler à ce qui suit

➟ docker container run --name pause-demo debdutdeb/pause-demo:v1 
Count at 30

Sur un autre terminal, mettez ce conteneur en pause.

docker container pause pause-demo

Au moment où vous mettez le conteneur en pause, vous devriez voir le compte à rebours s'arrêter, mais le terminal ne vous est pas encore revenu. C'est parce que le conteneur n'est pas encore arrêté (j'en parlerai plus tard dans cet article). Une fois que vous avez réactivé ce conteneur, le compte à rebours doit reprendre, et non redémarrer.

docker container unpause pause-demo

Pour récupérer le terminal, sur une exécution de terminal séparée

docker container stop pause-demo

Voici une courte vidéo qui montrera cela en action :-

Avant d'arrêter le conteneur, vous pouvez aimer les précédents, vérifiez l'état du conteneur en pause comme ceci :

➟ docker container inspect -f '{{json .State.Status}}' pause-demo 
"paused"

Arrêt du conteneur

Vous pouvez arrêter un conteneur Docker à l'aide de l'une des deux commandes suivantes :-

  1. docker container stop
  2. docker stop

Arrêter un conteneur signifie arrêter tous les processus qui lui sont associés.

Ce n'est pas la même chose que de suspendre un conteneur. Si vous arrêtez un conteneur, vous pouvez le redémarrer, mais les processus ne reprendront pas à partir de l'état dans lequel ils se trouvaient auparavant. Un processus peut enregistrer ses informations d'état dans un "fichier" et restaurer son état à partir de ce fichier, mais c'est un cas différent.

Par exemple, après avoir arrêté la précédente pause-demo container, si vous essayez de le redémarrer en utilisant le ...container start commande, il commencera à compter depuis le début, contrairement à sa pause contrepartie qui reprend le comptage.

Comment fonctionne le processus ?

Lorsque vous demandez à Docker d'arrêter un conteneur, il envoie un SIGTERM signal au PID 1 du conteneur. Après cela, il attend 10 secondes, qui est sa période de temps gracieuse, le processus est donné ce temps pour quitter gracieusement, en d'autres termes nettoyer et terminer tout ce qu'il travaillait. Une fois les 10 secondes écoulées, Docker envoie un dernier SIGKILL signal, je n'ai pas à vous dire ce qui se passera ensuite.

Docker envoie le signal au PID 1 du conteneur car tous les autres processus sont un enfant du PID 1, si ce processus est terminé/tué, les processus fils cesseront automatiquement d'exister.

Cela devient plus clair avec l'exemple ci-dessous.

Exemple :

Vous devez à nouveau extraire une image.

docker image pull debdutdeb/stop-demo:v1

Pour le Dockerfile et le code source, consultez cet essentiel.

Dans un terminal, démarrez un conteneur à partir de cette image.

docker container run --name stop-demo debdutdeb/stop-demo:v1

Une fois exécuté, vous devriez voir un écran vous indiquant son PID et qu'il attend.

➟ docker container run --name stop-demo debdutdeb/stop-demo:v1 
My PID in this container is 1
Waiting...

Ouvrez un autre terminal et exécutez la commande stop sur ce conteneur.

docker container stop stop-demo

Une fois exécuté, vous devriez voir sur le terminal qui exécutait le conteneur, vous dire ce que IT connaît, c'est-à-dire reçoit le SIGTERM signal.

Ensuite, il commence à compter les secondes et vous verrez qu'après 10 secondes, il arrête de compter. Ce n'est pas parce que je l'ai codé en dur de cette façon, en fait je l'ai codé en dur pour qu'il continue indéfiniment.

Mais après 10 secondes, docker envoie un SIGKILL signal que nous ne pouvons pas attraper ou ignorer, le processus est voué à être tué.

Vous pouvez modifier le temps d'attente du docker avant d'envoyer le SIGKILL signal en utilisant le -t option avec docker container stop .

Une fois que tout est fait, vous devriez voir quelque chose comme ça

➟ docker container run --name stop-demo debdutdeb/stop-demo:v1 
My PID in this container is 1
Waiting...
SIGTERM ignored,
Starting count..
10 seconds

Voici une petite vidéo démontrant cela :-

Vous pouvez maintenant vérifier l'état de ce conteneur en utilisant ...container inspect comme ça :-

➟ docker container inspect -f '{{json .State.Status}}' stop-demo
"exited"

Suppression de conteneur

Un conteneur est supprimé à l'aide de l'une des deux commandes suivantes :-

  1. docker container rm
  2. docker rm

La suppression d'un conteneur est l'opposé de la création d'un conteneur. Lorsque vous supprimez un conteneur, il est parti, vous ne pouvez pas apporter ce détail récipient en arrière. Vous pouvez en démarrer un nouveau à partir de la même image en utilisant la même configuration, le rendre identique, mais ce ne sera pas exactement le précédent.

Exemple :

Pour un exemple, supprimez simplement le précédent stop-demo conteneur.

docker container rm stop-demo

Jusqu'à présent, tous les conteneurs que vous avez créés puis arrêtés peuvent être supprimés avec une seule commande :-

docker container prune

Cela supprimera tous les conteneurs avec le statut Exited .

Exemple de sortie :

✗ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
ffbdd621c01d0eb3f42d348eeb75c731ddd9bd85674bb90dece32bd70357e541
21b9ed6a6198cd6ee7e162aebd936ae3e93b3b0f738161924a825a27794f2b20
f5f5149866a6ced675ad3bfff0b7386f75ee3fdbddca86be8b8ba341dba4b27f

Total reclaimed space: 0B

Ainsi, vous avez appris le concept de cycle de vie des conteneurs. Et vous avez également appris les commandes Docker pour gérer chaque étape du cycle de vie des conteneurs. Si vous voulez plus de conseils Docker, vous pouvez en apprendre davantage sur ces commandes Docker moins connues mais utiles.

3 Commandes Docker Les utilisateurs avancés de Docker devraient connaîtreVoici quelques commandes Docker que vous ne connaissez peut-être pas, mais qui pourraient s'avérer utiles lors de la gestion de vos conteneurs. Manuel LinuxDebdut Chakraborty

J'espère vraiment que cet article a rendu la théorie du cycle de vie des conteneurs facile à comprendre et a également effacé toutes les commandes dont vous avez besoin pour gérer ces différents états.

Si vous avez des questions, veuillez laisser un commentaire ci-dessous.


Docker
  1. Qu'est-ce qu'un conteneur Docker :un guide d'introduction pour les débutants

  2. Comment exécuter MySQL dans Docker Container :un guide simple et facile à suivre

  3. Une introduction à Docker

  4. Aide-mémoire de référence rapide des commandes Docker

  5. Comment changer le fuseau horaire d'un conteneur Docker

Guide définitif sur la sauvegarde et la restauration des conteneurs Docker [Une approche cloud + locale pour les serveurs autonomes]

Guide complet pour supprimer les images Docker

21 commandes essentielles que tout utilisateur de Docker devrait connaître

Guide du débutant sur la politique de redémarrage de Docker

ctop - Interface de type Top pour la surveillance des conteneurs Docker

40 commandes Docker importantes pour les développeurs de logiciels