Paramètres de la commande Docker Run

DockerDockerBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire (lab), nous nous concentrerons exclusivement sur la commande docker run et ses divers paramètres. La commande docker run est fondamentale pour les opérations Docker, car elle nous permet de créer et de démarrer des conteneurs avec des configurations spécifiques.

En maîtrisant les paramètres de cette commande, vous aurez un meilleur contrôle sur vos applications conteneurisées, ce qui améliorera votre capacité à déployer et à gérer efficacement les conteneurs Docker.

Nous aborderons une grande variété de paramètres, notamment ceux concernant la nomination, le mode détaché, le mappage de ports, le montage de volumes, les variables d'environnement, les contraintes de ressources, etc.

Certains des paramètres vous seront peut-être déjà familiers, tandis que d'autres pourraient vous être nouveaux.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ContainerOperationsGroup -.-> docker/port("List Container Ports") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") subgraph Lab Skills docker/run -.-> lab-389228{{"Paramètres de la commande Docker Run"}} docker/ls -.-> lab-389228{{"Paramètres de la commande Docker Run"}} docker/exec -.-> lab-389228{{"Paramètres de la commande Docker Run"}} docker/inspect -.-> lab-389228{{"Paramètres de la commande Docker Run"}} docker/port -.-> lab-389228{{"Paramètres de la commande Docker Run"}} docker/volume -.-> lab-389228{{"Paramètres de la commande Docker Run"}} docker/network -.-> lab-389228{{"Paramètres de la commande Docker Run"}} end

Exécution de base avec Docker et nomination des conteneurs

Commençons par les bases de la commande docker run et explorons comment nommer nos conteneurs.

Tout d'abord, exécutons un conteneur Nginx de base :

docker run nginx

Cette commande exécute un conteneur Nginx en mode foreground (au premier plan). Vous verrez un flux de journaux (logs) s'afficher dans votre terminal. C'est parce que le conteneur s'exécute en mode foreground et affiche directement les journaux.

Pour arrêter ce conteneur, appuyez sur Ctrl+C. Vous pourriez remarquer qu'il prend quelques secondes à s'arrêter - c'est normal, car Docker donne au conteneur le temps de s'éteindre proprement.

Maintenant, exécutons-le en mode détaché et donnons-lui un nom :

docker run -d --name my-nginx nginx

Décortiquons cette commande :

  • docker run : C'est la commande de base pour exécuter un conteneur.
  • -d : Cette option exécute le conteneur en mode détaché, c'est-à-dire qu'il s'exécute en arrière-plan. Vous ne verrez aucune sortie dans votre terminal.
  • --name my-nginx : Cela attribue le nom "my-nginx" au conteneur. Si vous ne spécifiez pas de nom, Docker attribuera un nom aléatoire.
  • nginx : C'est le nom de l'image que nous utilisons pour créer le conteneur.

Après avoir exécuté cette commande, vous verrez une longue chaîne de caractères. C'est l'ID du conteneur. Docker a démarré le conteneur en arrière-plan.

Si vous rencontrez une erreur indiquant que le nom est déjà utilisé, cela signifie qu'il existe déjà un conteneur avec ce nom. Vous pouvez soit choisir un autre nom, soit supprimer le conteneur existant (nous apprendrons à faire cela dans les laboratoires suivants).

Mappage de ports

Le paramètre -p dans la commande docker run nous permet de mapper des ports du conteneur vers l'hôte. Cela est crucial pour accéder aux services exécutés à l'intérieur du conteneur depuis votre machine hôte.

Exécutez un conteneur Nginx avec mappage de ports :

docker run -d --name nginx-mapped -p 8080:80 nginx

Décortiquons les nouvelles parties de cette commande :

  • -p 8080:80 : Cela mappe le port 8080 de votre hôte vers le port 80 dans le conteneur. Le format est toujours port_hôte:port_conteneur.

Nginx, par défaut, s'exécute sur le port 80 à l'intérieur du conteneur. En le mappant sur le port 8080 de notre hôte, nous pouvons y accéder en allant sur localhost:8080 dans un navigateur web.

Maintenant, vérifions que la page d'accueil de Nginx est accessible. Nous utiliserons la commande curl, qui nous permet de faire des requêtes HTTP depuis la ligne de commande :

curl http://localhost:8080

Vous devriez voir le contenu HTML de la page d'accueil de Nginx. Si vous n'avez pas curl installé, vous pouvez l'installer avec :

sudo apt-get update && sudo apt-get install -y curl

Si vous ne pouvez toujours pas accéder à la page, voici quelques éléments à vérifier :

  1. Assurez-vous que le conteneur est en cours d'exécution : docker ps | grep nginx-mapped
  2. Vérifiez si le port est bien mappé : docker port nginx-mapped
  3. Si vous utilisez un serveur cloud, assurez-vous que le pare-feu autorise le trafic sur le port 8080.

Montage de volumes

Le paramètre -v dans la commande docker run nous permet de monter des volumes, partageant ainsi des données entre l'hôte et le conteneur. Cela est incroyablement utile pour conserver des données ou pour fournir des fichiers de configuration au conteneur.

Commençons par créer une simple structure de répertoires sur notre hôte :

mkdir -p ~/project/nginx-data
echo "<html><body><h1>Hello from mounted volume</h1></body></html>" > ~/project/nginx-data/index.html

Ces commandes effectuent les opérations suivantes :

  1. Créent un nouveau répertoire nginx-data à l'intérieur du dossier project dans votre répertoire personnel.
  2. Créent un simple fichier HTML nommé index.html à l'intérieur de ce nouveau répertoire.

Maintenant, exécutons un conteneur Nginx et montons ce répertoire :

docker run -d --name nginx-volume -p 8081:80 -v ~/project/nginx-data:/usr/share/nginx/html nginx

Décortiquons cette commande :

  • docker run : C'est la commande pour exécuter un nouveau conteneur.
  • -d : Cela exécute le conteneur en mode détaché (en arrière - plan).
  • --name nginx-volume : Cela attribue le nom "nginx-volume" à notre conteneur.
  • -p 8081:80 : Cela mappe le port 8081 de l'hôte vers le port 80 dans le conteneur.
  • -v ~/project/nginx-data:/usr/share/nginx/html : Cela monte le répertoire nginx-data de notre hôte vers le répertoire /usr/share/nginx/html dans le conteneur. C'est là que Nginx cherche le contenu à servir.
  • nginx : C'est le nom de l'image que nous utilisons pour créer le conteneur.

Maintenant, vérifions que la page personnalisée est bien servie :

curl http://localhost:8081

Vous devriez voir le contenu de votre fichier HTML personnalisé : "Hello from mounted volume!"

Si vous ne voyez pas votre contenu personnalisé, voici quelques éléments à vérifier :

  1. Assurez-vous que le fichier ~/project/nginx-data/index.html existe sur votre système hôte.
  2. Vérifiez que le conteneur est en cours d'exécution : docker ps | grep nginx-volume
  3. Vérifiez les journaux (logs) de Nginx pour toute erreur : docker logs nginx-volume

Cette méthode de montage d'un répertoire hôte sur un conteneur s'appelle un bind mount (montage par liaison). C'est un moyen simple de partager des fichiers entre l'hôte et le conteneur. Voici quelques points clés à retenir :

  1. Le chemin du répertoire hôte doit être un chemin absolu.
  2. Si le répertoire hôte n'existe pas, Docker le créera automatiquement.
  3. Toute modification apportée aux fichiers dans ce répertoire (que ce soit sur l'hôte ou dans le conteneur) sera immédiatement visible à la fois pour l'hôte et le conteneur.
  4. Faites attention aux autorisations : le conteneur s'exécute par défaut en tant que root, ce qui peut créer des fichiers que votre utilisateur hôte ne peut pas modifier.

En utilisant cette méthode, nous évitons l'erreur "not a directory" (n'est pas un répertoire) car nous montons un répertoire et non un seul fichier. Cette approche vous offre plus de flexibilité pour ajouter, supprimer ou modifier des fichiers sans avoir à recréer le conteneur.

Variables d'environnement

Le paramètre -e dans la commande docker run nous permet de définir des variables d'environnement dans le conteneur. Cela est utile pour configurer l'application exécutée dans le conteneur sans modifier son code.

Exécutez un conteneur avec des variables d'environnement :

docker run -d --name nginx-env -e NGINX_HOST=mywebsite.com -e NGINX_PORT=80 nginx

Décortiquons les nouvelles parties :

  • -e NGINX_HOST=mywebsite.com : Cela définit une variable d'environnement nommée NGINX_HOST avec la valeur mywebsite.com.
  • -e NGINX_PORT=80 : Cela définit une autre variable d'environnement NGINX_PORT avec la valeur 80.

Les variables d'environnement sont des paires clé-valeur qui peuvent être accessibles par les processus exécutés à l'intérieur du conteneur. De nombreuses images Docker sont conçues pour utiliser des variables d'environnement spécifiques pour la configuration.

Vous pouvez vérifier les variables d'environnement :

docker exec nginx-env env | grep NGINX_

Cette commande effectue les opérations suivantes :

  • docker exec nginx-env : Cela indique à Docker d'exécuter une commande dans le conteneur nginx-env en cours d'exécution.
  • env : Cette commande affiche toutes les variables d'environnement.
  • | grep NGINX_ : Cela filtre la sortie pour n'afficher que les lignes contenant "NGINX_".

Vous devriez voir vos deux variables d'environnement répertoriées.

Si vous ne voyez pas les variables d'environnement, vérifiez :

  1. Le conteneur est-il en cours d'exécution? Vérifiez avec docker ps | grep nginx-env
  2. Avez-vous correctement orthographié les noms des variables d'environnement dans votre commande docker run?

Contraintes de ressources

Docker vous permet de définir des contraintes de ressources sur les conteneurs en utilisant divers paramètres dans la commande docker run. Cela est crucial pour gérer les performances et la stabilité de votre système hôte, notamment lorsque vous exécutez plusieurs conteneurs.

Exécutez un conteneur avec des limites de mémoire et de CPU :

docker run -d --name nginx-limited --memory 256m --cpus 0.5 nginx

Décortiquons les nouvelles parties :

  • --memory 256m : Cela limite le conteneur à 256 mégaoctets de mémoire. Le 'm' signifie mégaoctets. Vous pourriez également utiliser 'g' pour gigaoctets.
  • --cpus 0.5 : Cela limite le conteneur à utiliser au maximum la moitié d'un cœur de CPU.

Ces limites empêchent le conteneur d'utiliser plus de ressources que spécifié, ce qui peut aider à empêcher qu'un seul conteneur monopolisent les ressources de l'hôte.

Vous pouvez vérifier que ces limites ont été correctement appliquées :

docker inspect -f '{{.HostConfig.Memory}}' nginx-limited
docker inspect -f '{{.HostConfig.NanoCpus}}' nginx-limited

La première commande devrait afficher 268435456 (256 Mo en octets), et la deuxième devrait afficher 500000000 (0,5 CPU en nano-unités).

Si vous voyez des valeurs différentes, vérifiez à nouveau votre commande docker run pour vous assurer que vous avez correctement spécifié les limites.

Remarque : Définir des limites de ressources trop basses peut faire que le conteneur fonctionne mal ou même plante. Si vous rencontrez des problèmes avec votre conteneur, essayez d'augmenter ces limites.

Paramètres réseau

Le paramètre --network dans la commande docker run vous permet de connecter un conteneur à un réseau. Cela est utile pour la communication entre conteneurs et pour isoler des groupes de conteneurs.

Tout d'abord, créez un réseau pont personnalisé :

docker network create my-custom-network

Cela crée un nouveau réseau pont nommé my-custom-network. Les réseaux pont sont le type de réseau le plus courant dans Docker.

Maintenant, exécutez un conteneur connecté à ce réseau :

docker run -d --name nginx-networked --network my-custom-network nginx

L'option --network my-custom-network connecte le conteneur au réseau que nous venons de créer.

Les conteneurs sur le même réseau peuvent communiquer entre eux en utilisant leurs noms de conteneur comme noms d'hôte. Cela facilite le lien entre les services.

Si vous obtenez une erreur indiquant que le réseau n'existe pas, assurez-vous d'avoir correctement créé le réseau avec la commande docker network create.

Stratégies de redémarrage

Le paramètre --restart dans la commande docker run vous permet de spécifier une stratégie de redémarrage pour le conteneur. Cela est utile pour garantir que vos conteneurs restent en cours d'exécution, même s'ils plantent ou si le démon Docker redémarre.

Exécutez un conteneur avec une stratégie de redémarrage :

docker run -d --name nginx-restart --restart unless-stopped nginx

L'option --restart unless-stopped définit la stratégie de redémarrage sur "unless-stopped" (sauf si arrêté), ce qui signifie que le conteneur redémarrera automatiquement à moins qu'il ne soit explicitement arrêté par l'utilisateur.

D'autres stratégies de redémarrage incluent :

  • no : La valeur par défaut. Ne redémarrez pas automatiquement le conteneur.
  • on-failure : Redémarrez uniquement si le conteneur se termine avec un code de sortie non nul.
  • always : Redémarrez toujours le conteneur, quelle que soit le code de sortie.

Vous pouvez vérifier la stratégie de redémarrage :

docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' nginx-restart

Cela devrait afficher unless-stopped.

Si vous ne voyez pas le résultat attendu, vérifiez à nouveau votre commande docker run pour vous assurer que vous avez correctement spécifié la stratégie de redémarrage.

Répertoire de travail et commande

Dans cette étape, nous allons explorer comment définir un répertoire de travail à l'intérieur d'un conteneur et exécuter des commandes personnalisées lorsque le conteneur démarre.

Le paramètre -w dans la commande docker run définit le répertoire de travail à l'intérieur du conteneur, et vous pouvez spécifier une commande à exécuter après le nom de l'image.

Combinons ces concepts :

docker run -d --name nginx-custom -w /app nginx sh -c "touch newfile.txt && nginx -g 'daemon off;'"

Décortiquons cette commande :

  • -d : Exécute le conteneur en mode détaché (en arrière - plan).
  • --name nginx-custom : Nomme le conteneur "nginx-custom".
  • -w /app : Définit le répertoire de travail à l'intérieur du conteneur sur /app.
  • nginx : Le nom de l'image à utiliser.
  • sh -c "..." : Exécute une commande shell.
    • touch newfile.txt : Crée un fichier vide nommé newfile.txt.
    • && : Exécute la commande suivante si la précédente a réussi.
    • nginx -g 'daemon off;' : Démarre Nginx en avant - plan, permettant au conteneur de rester en cours d'exécution.

Maintenant, vérifions que le conteneur est en cours d'exécution et que le fichier a été créé :

docker ps | grep nginx-custom
docker exec nginx-custom ls -l /app/newfile.txt

La première commande devrait montrer que le conteneur est en cours d'exécution, et la deuxième commande devrait lister les détails du fichier newfile.txt dans le répertoire /app du conteneur.

Résumé

Dans ce laboratoire, nous avons approfondi la commande docker run en explorant ses divers paramètres et options. Nous avons couvert :

  1. L'exécution et la nomination de conteneurs de base
  2. Le mappage de ports pour accéder aux services des conteneurs depuis l'hôte
  3. Le montage de volumes pour partager des données entre l'hôte et le conteneur
  4. La définition de variables d'environnement pour la configuration des conteneurs
  5. L'application de contraintes de ressources pour limiter l'utilisation des ressources par les conteneurs
  6. Les paramètres réseau pour la communication entre conteneurs
  7. Les stratégies de redémarrage pour la fiabilité des conteneurs
  8. La spécification du répertoire de travail et de la commande pour le démarrage des conteneurs

Ces paramètres de la commande docker run offrent des outils puissants pour configurer et gérer vos conteneurs Docker. En maîtrisant ces options, vous pouvez créer des déploiements de conteneurs plus sophistiqués et adaptés à vos besoins. Vous pouvez contrôler la façon dont les conteneurs interagissent avec le système hôte, les ressources qu'ils peuvent consommer et leur comportement dans différents scénarios.