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.
Contenu :
Docker run pour exécuter des conteneurs Docker de manière simple
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 :
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 :
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 à :
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
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 :
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 :
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
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.
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
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”
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.
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.
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"
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
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
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.
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
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.
Maintenant, simplement connectez vous avec les identifiants admin:pandora et vous aurez accès à la console Web Pandora FMS.
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
Traductora a francés e inglés. Me encantan las lenguas. Amante de la ropa oversize, la tarta de queso y el chocolate caliente en invierno. Me gusta leer, escuchar música, viajar y explorar cosas nuevas. Mi frase más temida por aquellos que me conocen es “he estado pensando…”
Translator into French and English. I love languages. Lover of oversized clothes, cheesecake and hot chocolate in winter. I like reading, listening to music, travelling and exploring new things. My most feared phrase by those who know me is “I’ve been thinking…”