Technologie Tutoriel

Comment utiliser la commande docker run pour exécuter vos conteneurs Docker

août 18, 2020

Comment utiliser la commande docker run pour exécuter vos conteneurs Docker

This post is also available in : Anglais Espagnol

Docker run pour exécuter des conteneurs Docker de manière simple

Dans l’article précédent nous avons appris à créer nos propres images Docker pour tester et distribuer nos applications sans nous soucier de leurs dépendances. Comme nous le savons déjà, Docker est un outil incroyable pour le travail de programmation collaborative, nous permettant de travailler dans un environnement pratiquement identique, quel que soit le système d’exploitation que nous ayons.

Après avoir créé notre image d’exemple dans l’article précédent, nous finissons par exécuter la commande :

docker run --name pandora_community --rm \
-p 8085:80 \
-p 41121:41121 \
-p 162:162 \
-e DBHOST=mysqlhost.local \
-e DBNAME=pandora \
-e DBUSER=pandora \
-e DBPASS=pandora \
-e DBPORT=3306 \
-e SLEEP=5 \
-e RETRIES=3 \
-e INSTANCE_NAME=pandora_community \
-ti rameijeiras/pandorafms-community:740

Avec cette commande, nous avons initialisé notre conteneur Docker en utilisant l’image précédemment créée. Mais qu’avons-nous exécuté exactement ? Que signifient tous ces paramètres ? Pour connaître la réponse, nous allons voir aujourd’hui comment la commande docker run est exécutée et ses paramètres les plus utilisés.

Commençons par les bases ; nous pouvons exécuter la commande docker run sans aucun paramètre, par exemple en utilisant la commande :

docker run hello-world

Ce qui rendra une sortie comme celle-ci :

docker run 1

Dans ce cas, il activera un conteneur avec l’image hello-world. Si vous ne l’avez pas téléchargé, il se connectera au référentiel DockerHub, la téléchargera et l’exécutera.
Comme vous pouvez le voir, il exécute tout simplement le point d’entrée ou CMD par défaut (selon le cas) et à la fin de l’exécution, le conteneur sortira, devenant stocké sur votre ordinateur.

La commande docker ps

Si vous exécutez la commande :

docker ps -a

Vous pourrez voir tous les conteneurs que vous avez exécutés dans votre système. Le paramètre -a indique de les afficher tous, ceux qui sont en cours d’exécution et ceux qui ne le sont pas. Par défaut, sans ce paramètre, il affichera uniquement les conteneurs en cours d’exécution ; si je l’exécute sur mon système, nous verrons la sortie :

docker run 2

Nous allons analyser cette sortie pour comprendre les champs qu’elle nous montre. La première chose que nous pouvons voir est qu’il y a 3 conteneurs (3 lignes) dans ce système. La première ligne est celle qui fait référence à l’exécution de hello-world ; les deux autres conteneurs fonctionnaient déjà sur mon système et je les ai laissés pour comparer les informations qu’il nous renvoie.

Comme on peut le voir, la commande docker ps retourne des informations liées à nos conteneurs. Voyons quelles informations il nous montre :

  • Container id: C’est l’identifiant ou l’ID unique de chaque conteneur. Cet identifiant est automatiquement attribué par Docker.
  • Image: Dans cette colonne, il indique l’image que nous utilisons pour activer le conteneur. Si vous regardez la dernière ligne, vous pouvez voir que nous avons utilisé l’image hello-world dans notre première exécution docker run.
  • Command:C’est la commande de démarrage des conteneurs. Il est défini dans le dockerfile avec l’instruction CMD et c’est ce qui est exécuté par défaut au démarrage du conteneur. Cette commande peut être modifiée lorsque vous exécutez un conteneur, nous le verrons plus tard.
  • Created: Il nous indique depuis combien de temps notre conteneur a été exécuté.
  • Status: Il indique l’état actuel du conteneur. Comme vous pouvez le voir, hello-world a été exécuté et est mort, il nous montre donc l’état de sortie et le code d’erreur de cette sortie entre parenthèses, dans ce cas 0. Cela sera très utile pour déboguer votre application en cas de problème et que le conteneur se termine de manière inattendue.
  • Ports: Cette section est très importante, car elle vous indique quels ports de votre conteneur sont exposés. Dans le cas de hello-world, il n’y a pas de port exposé.Comme vous le savez, un conteneur est isolé du système, donc pour avoir accès à l’application en cours d’exécution, vous devez exposer le port correspondant. Non seulement vous pouvez exposer les ports, mais vous pouvez également les renvoyer en indiquant que le port X sur votre système hôte est redirigé vers le port Y du conteneur. De cette manière, vous pouvez donner un accès externe à vos applications sur le réseau. Il existe d’autres moyens de donner ces accès, mais ils sont plus avancés. Nous utilisons généralement la redirection de port, ce que nous apprendrons à faire dans cet article.
  • Name: C’est le nom attribué à notre conteneur. Par défaut, Docker attribue automatiquement un nom à vos conteneurs, mais il est possible d’indiquer le nom souhaité lors de l’exécution du docker run.

Exécution de docker run

Maintenant que vous savez comment obtenir l’état et les caractéristiques de vos conteneurs, voyons ce que vous pouvez faire avec la commande docker run. Nous allons revoir les paramètres que je considère les plus utiles. Pour plus d’informations sur la commande docker run, vous pouvez consulter la documentation officielle de Docker : https://docs.docker.com/engine/reference/run/

Examinons d’abord la structure de la commande docker run :

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

Comme vous pouvez le voir, les paramètres ou les options iront juste avant le nom de l’image que vous voulez utiliser. Ensuite, vous pouvez indiquer une commande avec ses propres arguments qui remplacerait le CMD par défaut de l’image. Prenons un exemple en exécutant :

docker run alpine

Avec cette instruction, vous demandez à Docker d’exécuter un conteneur avec l’image nommée alpine avec les options par défaut. Alpine est une très petite distribution Linux, utilisée dans le monde des conteneurs. Si vous ne définissez pas une étiquette à l’image, il utilisera par défaut latest.

La sortie de cette commande sera similaire à :

docker run 3

Dans lequel l’image:tag sera téléchargée si vous ne l’avez pas, et exécutera un conteneur avec cette image. Par défaut, la commande de cette image est sh. Il s’exécute, ne donne pas de sortie et se ferme, comme vous pouvez voir si vous exécutez un docker ps -a

docker run 4

Il y a des modificateurs pour garder le conteneur en cours d’exécution avec la commande sh, mais nous verrons cela plus tard. Par exemple, nous allons écraser la commande par défaut à l’aide d’ifconfig pour obtenir l’adresse IP interne du conteneur. Donc, nous allons exécuter :
docker run alpine ifconfig

Il retournera la sortie de la commande ifconfig à l’intérieur du conteneur alpine :

docker run 5

Maintenant, nous allons exécuter le même docker run, mais en passant un paramètre avec le nom de l’interface à la commande ifconfig, de sorte qu’il ne retourne que les informations de l’interface eth0, et nous allons obtenir :

docker run 6

Comme vous pouvez le voir, vous pouvez transmettre n’importe quel paramètre à la commande que vous définissez à votre conteneur.

Jetons un coup d’œil à notre liste de conteneurs avec un docker ps -a

docker run 7

Toutes vos exécutions sont là avec les commandes que vous avez défini. Il existe une option pour dire à Docker de supprimer le conteneur une fois qu’il s’exécute ; nous verrons ça plus tard.

Deatached (-d)

Nous avons déjà appris comment exécuter un conteneur et écraser sa commande par défaut. Maintenant nous allons voir les options ou paramètres qui vous permettent de modifier ou d’ajouter des fonctionnalités à vos conteneurs.

Deatached (-d)

C’est un opérateur qui vous permet de dire à Docker d’exécuter le conteneur en arrière-plan, laissant le prompt libre tant que le conteneur est toujours actif. Par exemple, vous pouvez exécuter :

docker run -d hello-world

Vous ne verrez pas le conteneur s’exécuter car il s’exécutera en arrière-plan. Il est utile pour les services ou les tâches longs dont vous ne voulez pas occuper le prompt.

Foreground/interactive (-it)

Si, par contre, vous voulez que le conteneur continue de fonctionner et même interagir avec lui, vous pouvez utiliser le paramètre -it. Comme nous savons que la commande par défaut d’alpine est sh (un shell plus léger que bash), nous pouvons utiliser le paramètre -it pour interagir avec elle et lancer différentes commandes dans le conteneur.

docker run -it alpine

Comme on peut le voir, cela vous permettra d’interagir avec alpin directement depuis shell.

docker run 8

Name (–name)

Ce paramètre vous permettra d’attribuer un nom à votre conteneur. Comme je l’ai mentionné précédemment, Docker attribuera un nom aléatoire à vos conteneurs, mais vous pouvez l’attribuer directement à partir de l’exécution de docker run.

Soyez prudent avec cette option, car le nom est unique et qu’un seul conteneur peut avoir ce nom, donc si vous avez un conteneur (en cours d’exécution ou arrêté) avec un nom que vous voulez utiliser dans la commande docker run, Docker ne le permettra pas. Vous devrez choisir un autre nom ou supprimer l’ancien conteneur avec ce nom attribué.

Pour attribuer le nom « test » à un conteneur de l’image alpine, vous pouvez exécuter :

docker run --name test alpine

docker run 9

Clean up (–rm)

Avec le paramètre –rm, vous demandez à Docker de supprimer le conteneur à la fin de l’exécution. De cette façon, vous n’aurez pas toutes les exécutions de vos conteneurs stockées. Pour utiliser le paramètre –rm dans un conteneur alpine qui affiche le message « bonjour le monde » puis se supprime, vous pouvez utiliser :

docker run --rm alpine echo “hola mundo”

docker run 10

EXPOSE (ports entrants)

Vous pouvez exposer des ports sur votre ordinateur qui sont redirigés vers un autre port de votre conteneur.

Par exemple, si vous voulez exécuter un conteneur avec un serveur Web et que vous voulez que le conteneur soit accessible de l’extérieur, vous devez exposer un port.

Pour exposer un port, utilisez le format :[ip]:host_port:container_port

Le champ [ip] est utilisé pour filtrer les sources. S’il n’est pas défini, cela signifie tout (0.0.0.0).
Par exemple, pour rediriger le port 8080 de mon ordinateur, de n’importe quelle source, vers le port 80 d’un conteneur qui utilise l’image nginx:alpine il me suffit d’exécuter :

docker run -d -p 8080:80 nginx:alpine

J’ai utilisé le paramètre -d pour que le conteneur fonctionne en arrière-plan, car Nginx est un serveur Web qui continuera à fonctionner jusqu’à ce que vous l’arrêtez, et si vous n’utilisez pas -d, prompt restera occupée.

docker run 11

Comme nous pouvons le voir, le conteneur est conservé en arrière-plan dans l’état running. Si je curl ma propre machine sur le port 8080, il me redirige vers le serveur Nginx fonctionnant sur Docker, qui a le port 80 exposé.

Si vous faisez un docker ps, dans la colonne PORTS, vous pouvez voir la redirection du port 8080 vers 80 depuis toutes les sources.

Il est possible d’utiliser le paramètre -P (majuscule), qui redirigera tous les ports exposés d’un conteneur. Vous perdez le contrôle du choix du port vers lequel vous voulez rediriger, mais pour des tests rapides, cela peut être utile.

Par exemple, si vous exécutez l’image de base que vous avez créée dans l’article précédent qui exposait plusieurs ports, vous pouvez voir comment Docker les redirigera tous en attribuant des ports aléatoires.

docker run -P -d rameijeiras/pandorafms-base sleep 100

Dans ce cas, j’ai utilisé la commande sleep 100 pour maintenir le conteneur vif pendant 100 secondes. De plus, j’ai utilisé le paramètre -d pour le conserver en arrière-plan et j’ai utilisé le paramètre -P pour rediriger tous les ports exposés dans l’image.

docker run 12

ENV environment variables (-e)

Avec le paramètre -e, vous pouvez définir des variables d’environnement pour le conteneur que vous démarrez. Ceci est particulièrement utile lorsque votre conteneur est configuré pour utiliser ces variables d’environnement et modifier leur comportement. Comme nous l’avons vu dans l’article précédent, notre conteneur Pandora FMS a utilisé les variables d’environnement pour définir la base de données à laquelle il se connectera et ses informations d’identification de connexion. Pour définir des variables d’environnement, vous pouvez exécuter :

docker run -e "APP=PandoraFMS" -e "VER=740" alpine echo "$APP $VER"

docker run 13

Comme vous pouvez le voir, dans le conteneur, les variables d’environnement que vous avez définies lors de l’exécution de la commande docker run ont été affectées.

VOLUME shared filesystems (-v)

Le paramètre -v est utilisé pour gérer les volumes dans Docker. Comme vous le savez, les données que vous modifiez dans Docker sont volatiles, mais en utilisant -v, vous pouvez configurer la persistance des données. Ceci est particulièrement utile pour créer un conteneur pour des bases de données ou des serveurs Web, par exemple.

Avec le paramètre -v, vous pouvez faire 2 choses différentes. Si vous l’exécutez suivi d’un nom de volume, vous créerez un volume persistant qui sera géré par Docker, par exemple :

docker run --rm -v myvolume:/app alpine sh -c "echo persistent > /app/file"
docker run --rm myvolume:/app alpine cat /app/file

docker run 15

Comme vous pouvez le voir, nous avons exécuté deux conteneurs qui s’autodétruisent, pointant vers le volume myvolume, mais bien que le premier conteneur ait été détruit lors de la création du fichier, le second est capable d’accéder aux données, puisque le répertoire de l’application est lié à un volume persistant sur notre machine hôte.

Vous pouvez voir les volumes créés sur votre machine en exécutant la commande docker volume ls. Nous verrons le sujet des volumes dans les conteneurs Docker dans un autre article de ce blog.

La deuxième méthode est la méthode bind, qui consiste à « passer » un répertoire de votre machine hôte au conteneur. Cela vous permettra de configurer et de modifier les fichiers sur votre machine locale et que ceux-ci affectent directement le conteneur. Si par exemple je veux montrer mon site Web, que j’ai mis dans mon répertoire local /tmp/web/index.html, dans un conteneur Nginx, je devrais exécuter la commande docker run référençant le répertoire source et destination avec ce format : -v host_path: container_path:[rw/ro], dans lequel vous pouvez éventuellement définir les droits de lecture et d’écriture de ce répertoire ; nous le laisserons par défaut. La commande serait :

docker run -d -p 8080:80 -v /tmp/web/:/usr/share/nginx/html nginx:alpine

docker run 15

Comme vous pouvez le voir, si je fais un bind sur mon conteneur et puis je modifie les fichiers localement, les modifications sont immédiates sur mon serveur Nginx.

Pandora FMS Stack

Nous connaissons déjà toutes les options de base de docker run, donc à ce stade, nous sommes déjà shinobis de Docker et nous allons tester nos compétences en utilisant tout ce que nous avons appris pour construire un stack complet de Pandora FMS.

Nous utiliserons deux conteneurs, un pour l’application et un pour la base de données. Non seulement cela, nous donnerons de la persistance au serveur de base de données afin qu’en cas d’échec, les informations stockées ne soient pas perdues.

Nous n’aurons besoin que de 2 commandes docker run. Oui, c’est aussi simple.

Dans le premier, nous allons démarrer un conteneur pour la base de données. Nous utiliserons une image Percona Sql modifiée. Vous pouvez voir le fichier docker dans mon dépôt GitHub (maintenant vous serez un maître de lecture de dockerfiles).

docker run --name Pandora_DB \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=pandora \
-e MYSQL_DATABASE=pandora \
-e MYSQL_USER=pandora \
-e MYSQL_PASSWORD=pandora \
-v mysqlvol:/var/lib/mysql \
-d rameijeiras/pandorafms-percona-base

Attendez quelques secondes et votre base de données est déjà en cours d’exécution.

docker run 16

Exécutez maintenant le conteneur Pandora FMS qui pointe vers le conteneur de base de données. Nous pouvons pointer à la fois à l’IP interne et externe. Puisque nous avons effectué la redirection de ports pour le port 3306, nous utiliserons l’adresse IP externe qui dans ce cas sera l’adresse IP de mon hôte.

docker run --name Pandora_new --rm \
-p 8081:80 \
-p 41121:41121 \
-e DBHOST=192.168.85.128 \
-e DBNAME=pandora \
-e DBUSER=pandora \
-e DBPASS=pandora \
-e DBPORT=3306 \
-e SLEEP=5 \
-e RETRIES=3 \
-e INSTANCE_NAME=pandora \
-ti rameijeiras/pandorafms-community:740

docker run 17

Et nous aurions déjà notre instance Pandora FMS Community version 740 avec seulement deux commandes. Formidable.

Vérifions que tout est en ordre; depuis le navigateur, allez à l’adresse http://:8081/pandora_console.

docker run 18

Maintenant, simplement connectez vous avec les identifiants admin:pandora et vous aurez accès à la console Web Pandora FMS.

docker run 19

Dans les articles suivants, nous allons apprendre à utiliser l’orchestrateur docker-compose pour gérer nos conteneurs Docker encore plus rapidement, facilement et efficacement. Alors ne vous perdez pas les articles à venir, pour savoir comment tirer le meilleur parti de vos applications de conteneur Docker.

Pour finir, n’oubliez pas que vous pouvez en apprendre beaucoup plus sur Pandora FMS en accédant à notre page d’accueil.

Ou si vous avez à surveiller plus de 100 appareils, vous pouvez également profiter d’une DÉMO GRATUITE de 30 jours de Pandora FMS Enterprise. Obtenez-le ici.

Sachez également que si vos besoins en supervision sont plus restreints, vous disposez de la version OpenSource de Pandora FMS. Découvrez-la ici


Leave a comment

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.