Fonctionnement des conteneurs Docker
Précédemment, vous avez découvert que le conteneur devient l’unité que vous utilisez pour distribuer vos applications. Vous avez également appris que le format du conteneur est standardisé et utilisé à la fois par nos équipes de développement et nos équipes d’exploitation.
Dans votre exemple, vous développez un portail de suivi des commandes destiné aux différents points de vente de votre entreprise. Avec l’image Docker générée,l’équipe d’exploitation est désormais responsable du déploiement, du lancement des mises à jour et de la gestion du portail de suivi des commandes.
Dans la leçon précédente, vous avez vu comment une image Docker est générée. Ici, vous allez examiner le cycle de vie d’un conteneur Docker et découvrir comment gérer des conteneurs. Vous allez également apprendre à configurer le stockage des données et les options réseau de vos conteneurs.
Comment gérer les conteneurs Docker
Un conteneur Docker a un cycle de vie que vous pouvez gérer et qui permet de suivre l’état du conteneur.
Pour lancer l’exécution d’un conteneur, utilisez la commande Run. Vous pouvez aussi redémarrer un conteneur qui est déjà en cours d’exécution. Lors du redémarrage d’un conteneur, celui-ci reçoit un signal d’arrêt pour permettre à tous les processus en cours d’exécution de s’arrêter normalement avant l’arrêt du noyau.
Un conteneur est considéré comme étant en cours d’exécution jusqu’à ce qu’il soit suspendu, arrêté ou supprimé. Toutefois, un conteneur peut également quitter l’état d’exécution par lui-même. Un conteneur peut se quitter lui-même quand le processus en cours d’exécution se termine ou si le processus passe à un état d’erreur.
Pour mettre en pause un conteneur en cours d’exécution, utilisez la commande pause
. Cette commande suspend tous les processus dans le conteneur.
Pour arrêter un conteneur en cours d’exécution, utilisez la commande stop
. La commande stop
permet d’arrêter le processus en cours de manière appropriée en lui envoyant un signal d’arrêt. Le noyau du conteneur s’arrête une fois que le processus s’est arrêté.
Si vous devez stopper le conteneur, utilisez la commande kill
pour envoyer un signal « kill ». Le signal d’arrêt est capturé dans le noyau du conteneur, mais pas dans le processus en cours d’exécution. Cette commande force la fin du processus en cours dans le conteneur.
Enfin, pour supprimer les conteneurs en état d’arrêt, utilisez la commande remove
. Une fois un conteneur supprimé, toutes les données stockées da ns le conteneur sont détruites.
Comment voir les conteneurs disponibles
Pour répertorier des conteneurs en cours d’exécution, exécutez la commande docker ps
. Pour afficher tous les conteneurs quel que soit leur état, passez l’argument -a
.
Voici un exemple :
docker ps -a
Voyons le résultat de cette commande :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d93d40cc1ce9 tmp-ubuntu:latest "dotnet website.dll …" 6 seconds ago Up 5 seconds 8080/tcp happy_wilbur
33a6cf71f7c1 tmp-ubuntu:latest "dotnet website.dll …" 2 hours ago Exited (0) 9 seconds ago adoring_borg
Il y a trois éléments à examiner dans la sortie ci-dessus :
Le nom de l’image répertorié dans la colonne IMAGE. Dans cet exemple, tmp-ubuntu: latest. Notez que vous êtes autorisé à créer plusieurs conteneurs à partir de la même image. C’est une fonctionnalité de gestion puissante que vous pouvez utiliser pour activer la mise à l’échelle dans nos solutions.
L’état du conteneur indiqué dans la colonne STATUS. Dans cet exemple, nous avons un conteneur en cours d’exécution et un conteneur qui s’est arrêté. L’état du conteneur est généralement le premier indicateur de son l’intégrité.
Le nom du conteneur indiqué dans la colonne NAMES. Outre l’ID de conteneur dans la première colonne, les conteneurs reçoivent également un nom. Dans notre exemple, nous n’avons pas fourni explicitement un nom pour chaque conteneur : Docker a donc donné au conteneur un nom aléatoire. Pour donner un nom explicite à un conteneur en utilisant l’indicateur
--name
, utilisez la commanderun
.
Pourquoi un nom est-il attribué aux conteneurs ?
Cette fonctionnalité vous permet d’exécuter plusieurs instances de conteneurs à partir de la même image. Les noms des conteneurs sont uniques, ce qui signifie que si vous spécifiez un nom, il ne peut pas être réutilisé pour créer un autre conteneur. La seule façon de réutiliser un nom spécifique est de supprimer le conteneur précédent.
Comment exécuter un conteneur
Pour démarrer un conteneur, utilisez la commande docker run
. Vous devez seulement spécifier l’image à exécuter avec son nom ou son ID pour lancer le conteneur à partir de l’image. Un conteneur lancé de cette manière fournit une expérience interactive.
Ici, pour exécuter le conteneur avec notre site web en arrière-plan, ajoutez l’indicateur -d
.
docker run -d tmp-ubuntu
Dans ce cas, la commande retourne seulement l’ID du nouveau conteneur.
Lorsque vous spécifiez qu’une image doit s’exécuter, Docker recherche l’image, charge le conteneur à partir de l’image et exécute la commande spécifiée comme point d’entrée. C’est à ce stade que le conteneur est disponible pour la gestion.
Comment suspendre un conteneur
Pour mettre un conteneur sur Pause, exécutez la commande docker pause
. Voici un exemple :
docker pause happy_wilbur
Le fait de suspendre temporairement l’exécution d’un conteneur suspend tous les processus. Cette commande permet au conteneur de reprendre les processus à un moment ultérieur. La commande docker unpause
rétablit tous les processus dans les conteneurs spécifiés.
Comment redémarrer un conteneur
Pour redémarrer des conteneurs, exécutez la commande docker restart
. Voici un exemple :
docker restart happy_wilbur
Le conteneur reçoit une commande stop suivie d’une commande start. Si le conteneur ne répond pas à la commande stop, un signal « kill » est envoyé.
Comment arrêter un conteneur
Pour arrêter un conteneur en cours d’exécution, exécutez la commande docker stop
. Voici un exemple :
docker stop happy_wilbur
La commande stop envoie un signal d’arrêt au conteneur ainsi qu’au processus en cours d’exécution dans le conteneur.
Comment supprimer un conteneur
Pour supprimer un conteneur, exécutez la commande docker rm
. Voici un exemple :
docker rm happy_wilbur
Une fois le conteneur supprimé, toutes les données qui s’y trouvent sont détruites. Il est essentiel de toujours considérer les conteneurs comme temporaires quand vous considérez le stockage des données.
Configuration du stockage d’un conteneur Docker
Comme décrit précédemment, toujours considérer les conteneurs comme temporaires si l’application dans un conteneur doit stocker des données.
Supposons que le portail de suivi crée un fichier journal dans un sous-dossier à la racine de l’application, c’est-à-dire directement dans le système de fichiers du conteneur. Quand votre application écrit des données dans le fichier journal, le système écrit les données dans la couche du conteneur qui est accessible en écriture.
Bien que cette approche fonctionne, elle présente malheureusement plusieurs inconvénients.
Le stockage d’un conteneur est temporaire.
Votre fichier journal n’est pas conservé entre les instances du conteneur. Par exemple, supposons que vous arrêtez et supprimez le conteneur. Quand vous lancez une nouvelle instance de conteneur, celle-ci se base elle-même sur l’image spécifiée, et toutes les données précédentes sont manquantes. Rappelez-vous que toutes les données d’un conteneur sont détruites avec le conteneur quand vous supprimez un conteneur.
Le stockage du conteneur est couplé à l’ordinateur hôte sous-jacent.
Accéder au fichier journal ou le déplacer du conteneur est difficile quand le conteneur est couplé à l’ordinateur hôte sous-jacent. Il faut se connecter à l’instance du conteneur pour accéder au fichier.
Les lecteurs de stockage des conteneurs sont moins performants.
Les conteneurs implémentent un pilote de stockage pour permettre à vos applications d’écrire des données. Ce pilote introduit un niveau d’abstraction supplémentaire pour communiquer avec le noyau du système d’exploitation hôte, et il est moins performant que l’écriture directe sur le système de fichiers d’un hôte.
Les conteneurs peuvent utiliser deux options pour rendre les données persistantes. La première option est d’utiliser des volumes ; la deuxième est d’utiliser des montages de liaison.
Qu’est-ce qu’un volume ?
Un volume est stocké sur le système de fichiers de l’hôte à un emplacement de dossier spécifique. Choisissez un dossier dans lequel vous savez que les données ne seront pas modifiées par des processus non-Docker.
Docker crée et gère le nouveau volume en exécutant la commande docker volume create
. Cette commande peut faire partie de notre définition Dockerfile, ce qui signifie que vous pouvez créer des volumes dans le cadre du processus de création d’un conteneur. La première fois que vous essayez de monter un volume dans un conteneur, Docker le crée s’il n’en existe pas.
Les volumes sont stockés dans des répertoires sur le système de fichiers hôte. Docker monte et gère les volumes dans le conteneur. Une fois montés, ces volumes sont isolés de la machine hôte.
Plusieurs conteneurs peuvent utiliser simultanément les mêmes volumes. En outre, les volumes ne sont pas supprimés automatiquement quand un conteneur cesse de les utiliser.
Dans cet exemple, vous pouvez créer un répertoire sur notre conteneur hôte et monter ce volume dans le conteneur lorsque vous créez le conteneur du portail de suivi. Lorsque votre portail de suivi enregistre des données, vous pouvez accéder à ces informations via le système de fichiers de l’hôte du conteneur. Vous aurez accès à ce fichier journal même si votre conteneur est supprimé.
Docker permet également aux entreprises tierces de créer des modules complémentaires à utiliser en tant que volumes. Par exemple, Stockage Azure fournit un plug-in pour monter Stockage Azure en tant que volumes sur des conteneurs Docker.
Qu’est-ce qu’un montage de liaison ?
D’un point de vue conceptuel, un montage de liaison est identique à un volume, mais au lieu d’utiliser un dossier spécifique, vous pouvez monter n’importe quel fichier ou dossier sur l’hôte. Vous souhaitez également que l’hôte puisse modifier le contenu de ces montages. Tout comme les volumes, le montage de liaison est créé si vous le montez mais il n’existe pas encore sur l’hôte.
Les montages de liaison ont des fonctionnalités limitées par rapport aux volumes, et même s’ils sont plus performants, ils dépendent de la présence sur l’hôte d’une structure de dossiers spécifique.
Les volumes sont considérés comme étant la stratégie de prédilection pour le stockage de données avec les conteneurs.
Une autre option est disponible pour les conteneurs Windows : Vous pouvez monter un chemin d’accès SMB en tant que volume et le présenter aux conteneurs. Cela permet aux conteneurs sur différents hôtes d’utiliser le même stockage persistant.
Configuration réseau d’un conteneur Docker
La configuration réseau par défaut de Docker permet d’isoler les conteneurs sur l’hôte Docker. Cette fonctionnalité vous permet de créer et de configurer des applications qui peuvent communiquer entre elles dans un environnement sécurisé.
Docker fournit différents paramètres réseau pour Linux et Windows.
Pour Linux, il existe six options réseau préconfigurées :
- « Bridge » (pont)
- « Host » (hôte)
- Overlay
- IPvLan
- MACvLan
- Aucun
Pour Windows, il existe six options réseau préconfigurées :
- NAT (Network Address Translation)
- Mode transparent
- Overlay
- L2Bridge
- L2Tunnel
- Aucun
Vous pouvez choisir la configuration réseau à appliquer à votre conteneur en fonction des conditions requises.
Qu’est-ce que le réseau « bridge » (pont) ?
Le réseau de pont est la configuration par défaut appliquée aux conteneurs quand ils sont lancés sans autre spécification de la configuration réseau. Ce réseau est un réseau privé interne utilisé par le conteneur. Il isole le réseau du conteneur du réseau de l’hôte Docker.
Chaque conteneur dans un pont réseau se voit attribuer une adresse IP et un masque de sous-réseau avec le nom d’hôte, qui est par défaut le nom du conteneur. Les conteneurs connectés au pont réseau par défaut sont autorisés à accéder à d’autres conteneurs connectés au pont via l’adresse IP. Le réseau « bridge » (pont) n’autorise pas la communication entre des conteneurs avec des noms d’hôte.
Par défaut, Docker ne publie pas les ports des conteneurs. Pour activer le mappage de ports entre les ports du conteneur et les ports de l’hôte Docker, utilisez l’indicateur --publish
du port Docker.
L’indicateur publish configure en réalité une règle de pare-feu qui mappe les ports.
Dans notre exemple, votre portail de suivi est accessible aux clients via le port 80. Vous devrez mapper le port 80 du conteneur à un port disponible sur l’hôte. Le port 8080 est ouvert sur l’hôte, ce qui vous permet de définir l’indicateur de la manière suivante :
--publish 8080:80
Tout client qui accède à l’adresse IP et au port 8080 de l’hôte Docker peut accéder au portail de suivi.
Excepté pour les configurations propres à Linux, le réseau NAT sur les hôtes Windows fonctionne de la même manière qu’un réseau de pont. En outre, NAT étant le réseau par défaut sur Windows, tous les conteneurs s’y connectent, sauf indication contraire.
Qu’est-ce que le réseau hôte ?
Le réseau hôte vous permet d’exécuter le conteneur directement sur le réseau de l’hôte. Cette configuration supprime efficacement l’isolation entre l’hôte et le conteneur au niveau du réseau.
Dans cet exemple, supposons que vous décidons de changer la configuration réseau par l’option de réseau hôte. Votre portail de suivi est toujours accessible avec l’adresse IP de l’hôte. Vous pouvez maintenant utiliser le traditionnel port 80 au lieu d’un port mappé.
Gardez à l’esprit que le conteneur seulement peut utiliser des ports qui ne sont pas déjà utilisés par l’hôte.
Sur Windows, le réseau hôte n’est pas disponible. Sur les hôtes Windows, il n’y a pas d’option permettant de partager la même adresse IP (pile réseau) entre l’hôte et le conteneur. Le réseau NAT fonctionne essentiellement comme un pont réseau, et l’option Superposition fournit une adresse IP au conteneur à partir du même réseau que l’hôte, mais pas la même adresse IP.
Superposition et autres options réseau
Pour les scénarios plus avancés, Linux et Windows fournissent des options réseau supplémentaires. Par exemple, l’option de superposition crée un commutateur virtuel à partir du réseau hôte afin que les conteneurs de ce réseau puissent obtenir des adresses IP à partir de serveurs DHCP, ou opérer avec des adresses IP de ce segment réseau. En outre, Docker permet aux fournisseurs tiers de créer des plug-ins réseau.
Qu’est-ce que le réseau « none » (aucun) ?
Pour désactiver la mise en réseau des conteneurs, utilisez l’option réseau none. Cela peut être utile pour une application qui n’utilise pas le réseau, ou si vous souhaitez simplement vérifier qu’une application s’exécute comme prévu dans un conteneur.
Considérations relatives au système d’exploitation
N’oubliez pas qu’il existe des différences entre les systèmes d’exploitation des appareils de bureau pour les options de configuration réseau de Docker. Par exemple, l’interface réseau Docker0 n’est pas disponible sur macOS lors de l’utilisation du pont réseau. De même, l’utilisation de la configuration réseau de l’hôte n’est pas prise en charge pour les appareils de bureau Windows et macOS.
Ces différences peuvent affecter la façon dont vos développeurs configurent leur workflow pour gérer le développement des conteneurs. En outre, les orchestrateurs de conteneurs peuvent également fournir d’autres configurations réseau en plus de la configuration Docker.