Dans notre article Docker : Maîtrisez la conteneurisation applicative de A à Z [Guide ultime], nous avons vu la généralité sur Docker. Ici, nous allons surtout nous concentrer sur une commande essentielle de Docker qui est docker run.
Pour rappel, Docker est la plateforme qui sert à conteneuriser des applications et leurs dépendances dans le but de les manipuler, quels que soient leurs hôtes. La conteneurisation permet de séparer l’infrastructure d’une application de manière simple, rapide et légère. Elle sert entre autres d’alternative à la création de machines virtuelles qui est beaucoup plus lourde et difficile à mettre en place.
Afin de profiter de tous les avantages que Docker offre, il faut bien savoir le manipuler. C’est pour cela que, dans ce tutoriel exhaustif, nous allons vous montrer comment utiliser docker run efficacement.
Prérequis
Avant de commencer, il faut que vous ayez l’environnement de travail adéquat pour exécuter les commandes que nous allons voir. Voici ce que vous devez mettre en place :
- Télécharger docker ;
- L’installer sur votre machine locale ;
- Trouver une image à exécuter.
Comme vous pouvez le constater, nous n’avons pas besoin de beaucoup de choses pour commencer ce tutoriel. Pour obtenir ces prérequis, nous vous invitons à vous référer à l’article que nous venons de mentionner dans l’introduction.
Fonctionnement de Docker run
Docker run est la commande docker qui permet de créer un conteneur à partir d’une image et de le lancer par la suite. Pour créer une image, il faut tout d’abord créer un dockerfile que l’on va monter à l’aide de la commande docker build.
En général, docker run fonctionne comme suit :
- On exécute la commande que l’on a écrite sur l’invite de commande ;
- Docker recherche l’image à exécuter sur l’emplacement local en premier ;
- S’il ne le retrouve pas, il part à sa recherche sur le docker hub ;
- Si l’image est retrouvée sur docker hub, il procède au téléchargement de celle-ci ;
- Dès que l’image est disponible, l’exécution de docker run peut commencer ;
- Sinon, le processus s’arrête, sans aucun message d’erreur.
En réalité, docker run est la combinaison de deux autres commandes docker à savoir docker create et docker start.
Docker create est la commande qui sert à créer un conteneur à partir d’une image et le prépare à l’exécution. On peut préciser certaines options lors de cette création comme le nom du conteneur, le port exposé, les préférences d’exécution, etc. Voici la structure générale de la commande :
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
Docker start est, quant à elle, la commande qui va, comme son nom l’indique, exécuter à proprement parler le conteneur. La commande se présente comme ceci :
docker start
Utiliser docker run est donc avantageux, surtout si l’on souhaite exécuter une image qui vient tout juste d’être créée ou téléchargée. Cependant, on peut utiliser seulement docker start si le conteneur est déjà disponible sur l’hôte. Nous allons voir un peu plus bas comment afficher les conteneurs disponibles, mais également le mécanisme derrière l’exécution d’un conteneur.
Utilisation basique de Docker run
Docker run peut s’exécuter de plusieurs manières différentes, que ce soit avec ou sans options. La structure de la commande docker run ressemble à celle de docker create à savoir
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Cependant, pour une première utilisation, il vaut mieux utiliser la commande basique qui est ceci :
docker run
Dans ce cas, docker run ne dispose d’aucun paramètre mis à part le nom de l’image que vous souhaitez conteneuriser. Par conséquent, le conteneur nouvellement créé s’exécutera avec les paramètres par défaut définis dans l’image ainsi que ceux de Docker lui-même.
Afficher la liste des conteneurs
Une fois que vous avez exécuté la commande docker run, il est important de bien vérifier si tout s’est bien passé. L’une des manières d’effectuer cela est d’afficher la liste des conteneurs disponibles sur votre hôte. Pour ce faire, il faut exécuter la commande suivante :
docker ps -a
La commande de base pour lister les conteneurs est en réalité docker ps, mais en ajoutant -a ou –all, le résultat de la commande sera beaucoup plus précis. Voyons cela :
Vous voyez sur l’image ci-dessus que plusieurs colonnes sont affichées dans le résultat. Regardons les colonnes et leurs significations une à une :
- CONTAINER ID est l’identifiant du conteneur ;
- IMAGE indique le nom de l’image qui est exécutée dans ce conteneur ;
- COMMAND affiche la commande à exécuter lors du lancement du conteneur. Cette commande est spécifiée dans la partie CMD du dockerfile de l’application ;
- CREATED mentionne le délai depuis lequel le conteneur a été créé ;
- STATUS indique le statut du conteneur au moment de l’affichage. Nous voyons par exemple ici que le conteneur de l’image hello-world a été arrêté il y a 47 minutes tandis que celui de getting started est encore actif ;
- PORT affiche le port qui a été affecté au conteneur. On peut également y voir le port vers lequel le conteneur est redirigé dans le cas d’une demande d’accès externe aux applications. Nous allons voir un peu plus bas comment faire pour exposer un port dans un conteneur ;
- NAME est le nom du conteneur. Si l’on ne définit pas manuellement ce nom, docker lui en attribuera un automatiquement.
Exécuter un conteneur en mode détachée
L’objectif lors de l’exécution d’un conteneur en mode détachée est de pouvoir lancer le conteneur en arrière-plan. Cela veut dire que l’on peut à nouveau utiliser l’invite de commande, même si le processus d’exécution du conteneur que l’on vient d’exécuter n’est pas encore terminé. On peut donc exécuter d’autres commandes après docker run.
Le mot-clé qui permet d’effectuer cela est -d ou –detach, vous devez donc rajouter ce dernier à la commande de base, comme ceci :
docker run -d
Voici un exemple de commande qui illustre cela :
docker run -d hello-world
Comme vous pouvez le constater, la commande se termine avec l’affichage de l’ID long du conteneur que l’on vient de lancer et vous pouvez à nouveau écrire sur l’invite de commande.
Exécuter un conteneur en mode interactif
Contrairement à ce que nous venons de voir, on peut exécuter le conteneur docker en laissant le processus affiché sur l’invite de commande. Cela permet d’interagir directement avec le conteneur en exécutant par exemple d’autres commandes supplémentaires.
Pour ce faire, il faut rajouter le mot-clé -it, -i ou –interactive à la commande de base :
docker run -it
Prenons par exemple la commande suivante :
docker run -it alpine
Dans cet exemple, nous avons parcouru brièvement les dossiers se trouvant dans le conteneur alpine au moment où l’exécution se fait.
Renommer un conteneur avec docker run
Comme on l’a brièvement énoncé un peu plus haut, si l’on ne renomme pas un conteneur, docker lui attribue automatiquement un nom. Lorsque nous avons affiché la liste de nos conteneurs, on peut voir dans la colonne NAME le nom aléatoire donné par docker. Par exemple, sur le conteneur hello-world, le nom est objective_thompson, ce qui est plutôt difficile à retenir. Il serait donc mieux si on lui donnait un nom afin de mieux l’identifier.
Toutefois, un nom de conteneur doit être unique, il faut donc faire attention à ce que celui-ci ne soit pas attribué à un autre. La commande pour renommer un conteneur lors de l’exécution est :
docker run --name
Nous allons par exemple exécuter l’image hello-world en la renommant hello avec cette commande :
docker run --name hello hello-world
Vérifions maintenant si le nom que nous avons donné à ce conteneur a bien été pris en compte. Pour cela, affichons la liste des conteneurs en utilisant la commande docker ps -a
Nous pouvons constater que, dans la colonne NAME, nous voyons bien que le nom du conteneur est bien hello.
Exposer un port
Ici, exposer un port sous-entend que l’on veut rediriger un port de l’hôte vers un port d’un conteneur. Cela est particulièrement utile lorsque vous souhaitez utiliser un serveur web comme Nginx pour exécuter un conteneur.
Voici la commande pour exposer un port lors de l’exécution d’un conteneur :
docker run -p ::
On peut ne pas définir <ip>, dans ce cas, ce paramètre sera 0.0.0.0 par défaut, comme ce que nous voyons dans l’exemple ci-dessus.
Illustrons cela en tapant la commande donnée par Docker lors de son premier lancement :
docker run -d -p 80:80 docker/getting-started
Maintenant, si l’on vérifie la liste des conteneurs, nous allons voir le port utilisé par ce conteneur.
Définir des variables d’environnement avec docker run
Définir des variables d’environnement est utile si l’on souhaite interagir avec le conteneur lors de son exécution. Par exemple, si l’on souhaite définir le nom d’une base de données, son hôte ou encore ses informations d’authentification, on peut définir des variables d’environnement pour effectuer cela.
Les mots-clés qui servent à cette définition sont -e, –env ou –env-file et l’ensemble de la commande ressemble à ceci :
docker run -e "VAR1=Value1" -e "VAR2=Value2" alpine env
Ici, nous avons directement spécifié la valeur de chaque variable que l’on définit en utilisant la commande –env ou -e. Le résultat s’affiche directement après l’exécution de la commande.
Cependant, pour plus de sécurité, surtout lorsqu’il s’agit d’informations sensibles telles que les identifiants de base de données, il est plus judicieux d’utiliser un fichier contenant les variables d’environnement. Pour ce faire, il faut créer un fichier dans le répertoire actuel, nous allons l’appeler env_file dans notre cas. Dans ce fichier, nous allons définir nos variables d’environnement en reprenant celles que nous avons utilisées ci-dessus.
VAR1=value1
VAR2=value2
Ensuite, nous allons exécuter le conteneur, mais cette fois-ci, nous allons utiliser –env-file pour définir les variables d’environnement.
docker run --env-file=env_file_name alpine env
Vous voyez que le résultat est similaire à celui que nous venons de voir précédemment.
Monter un volume lors de l’exécution
Un volume permet de faire persister les données que l’on a manipulées lors de l’exécution du conteneur. Cela veut dire que si l’on arrête le conteneur, les données seront conservées et pourront être utilisées lors du nouveau lancement. C’est également valable pour l’export et le partage de conteneurs.
Pour exécuter un conteneur en montant un volume, le mot-clé à utiliser est –mount ou -v. Dans l’exemple suivant, nous allons utiliser la commande –mount pour monter le volume du conteneur que l’on a renommé test :
docker run -d --name test --mount source=monvol,target=/app nginx:latest
Si Docker ne retrouve pas le volume en question, monvol dans notre cas, il va le créer automatiquement, puis lancer le conteneur avec ce dernier.
Il faut toutefois noter que les deux commandes que l’on a mentionnées ci-dessus ne peuvent pas être interchangées, malgré qu’elles produisent les mêmes résultats. Si l’on souhaite utiliser par exemple -v au lieu de –mount lors d’une prochaine exécution, il faut tout d’abord supprimer le conteneur ainsi que le volume créé auparavant.
Voilà, cet article sous forme de tutoriel se termine ici. Vous pouvez maintenant vous amuser à tester plusieurs fonctionnalités de docker run et les utiliser par la suite dans vos projets de conteneurisation.
Si vous souhaitez en apprendre davantage sur le Big Data, nous vous invitons à télécharger cette formation qui vous permet d’apprendre Scala pour la Data.