Paramètres de la commande Docker Run

DockerBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous allez vous concentrer exclusivement sur la commande docker run et ses différents paramètres. Cette commande est essentielle pour utiliser Docker : elle permet de créer et de démarrer des conteneurs avec une configuration précise.

En maîtrisant ses paramètres, vous pourrez mieux contrôler vos applications conteneurisées et déployer et gérer vos conteneurs Docker plus efficacement.

Vous découvrirez de nombreux paramètres, notamment ceux qui permettent de nommer un conteneur, de le lancer en mode détaché, de rediriger des ports, de monter des volumes, de définir des variables d’environnement et de limiter les ressources.

Vous connaissez peut-être déjà certains de ces paramètres ; d’autres vous seront peut-être nouveaux.

Lancer un conteneur avec Docker Run et lui attribuer un nom

Commencez par découvrir les bases de docker run et la manière de nommer les conteneurs.

Lancez d’abord un conteneur Nginx :

docker run nginx

Cette commande lance un conteneur Nginx au premier plan. Vous verrez défiler les journaux dans votre terminal : le conteneur s’exécute au premier plan et ses journaux s’affichent directement.

Pour arrêter le conteneur, appuyez sur Ctrl+C. Il peut mettre quelques secondes à s’arrêter : c’est normal, Docker lui laisse le temps de s’arrêter proprement.

Relancez maintenant Nginx en mode détaché et donnez un nom au conteneur :

docker run -d --name my-nginx nginx

Voici les différents éléments de cette commande :

  • docker run : commande de base pour lancer un conteneur.
  • -d : lance le conteneur en mode détaché, c’est-à-dire en arrière-plan. Aucun résultat ne s’affiche dans votre terminal.
  • --name my-nginx : attribue le nom « my-nginx » au conteneur. Si vous ne précisez pas de nom, Docker en attribue un aléatoirement.
  • nginx : nom de l’image utilisée pour créer le conteneur.

Après l’exécution de cette commande, une longue chaîne de caractères s’affiche : il s’agit de l’identifiant du conteneur. Docker a démarré le conteneur en arrière-plan.

Si un message d’erreur indique que le nom est déjà utilisé, cela signifie qu’un conteneur porte déjà ce nom. Vous pouvez choisir un autre nom ou supprimer le conteneur existant ; vous apprendrez à le faire dans des laboratoires ultérieurs.

Redirection de ports

Dans cette étape, vous allez utiliser le paramètre -p de docker run pour rediriger un port du conteneur vers l’hôte. Cette opération est indispensable pour accéder depuis votre machine hôte aux services exécutés dans le conteneur.

Lancez un conteneur Nginx en redirigeant un port :

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

Voici le nouvel élément de cette commande :

  • -p 8080:80 : redirige le port 8080 de l’hôte vers le port 80 du conteneur. Le format est toujours host_port:container_port.

Par défaut, Nginx écoute sur le port 80 à l’intérieur du conteneur. En redirigeant ce port vers le port 8080 de l’hôte, vous pouvez accéder à Nginx depuis un navigateur en ouvrant localhost:8080.

Vérifiez maintenant que la page d’accueil de Nginx est accessible. Utilisez la commande curl, qui permet d’envoyer des requêtes HTTP depuis la ligne de commande :

curl --retry 5 --retry-all-errors --retry-delay 1 http://localhost:8080

Le contenu HTML de la page d’accueil de Nginx doit s’afficher. Si curl n’est pas installé, vous pouvez l’installer avec la commande suivante :

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

Si la page reste inaccessible, vérifiez les points suivants :

  • Assurez-vous que le conteneur est en cours d’exécution : docker ps | grep nginx-mapped
  • Vérifiez que le port est bien redirigé : docker port nginx-mapped
  • Si vous utilisez un serveur cloud, vérifiez que son pare-feu autorise le trafic sur le port 8080.

Montage de volumes

Dans cette étape, vous allez utiliser le paramètre -v de docker run pour monter un volume et partager des données entre l’hôte et le conteneur. Cette méthode permet de conserver des données ou de fournir des fichiers de configuration au conteneur.

Commencez par créer une arborescence simple sur l’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 :

  • Elles créent un répertoire nginx-data dans le répertoire project, situé dans votre répertoire personnel.
  • Elles créent un fichier HTML simple nommé index.html dans ce nouveau répertoire.

Lancez maintenant un conteneur Nginx et montez-y ce répertoire :

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

Voici les différents éléments de cette commande :

  • docker run : lance un nouveau conteneur.
  • -d : lance le conteneur en mode détaché, c’est-à-dire en arrière-plan.
  • --name nginx-volume : attribue le nom « nginx-volume » au conteneur.
  • -p 8081:80 : redirige le port 8081 de l’hôte vers le port 80 du conteneur.
  • -v ~/project/nginx-data:/usr/share/nginx/html : monte le répertoire nginx-data de l’hôte dans le répertoire /usr/share/nginx/html du conteneur. C’est dans ce répertoire que Nginx cherche les contenus à servir.
  • nginx : nom de l’image utilisée pour créer le conteneur.

Vérifiez maintenant que Nginx sert bien la page personnalisée :

curl --retry 5 --retry-all-errors --retry-delay 1 http://localhost:8081

Le contenu de votre fichier HTML personnalisé doit s’afficher : « Hello from mounted volume! »

Si le contenu personnalisé ne s’affiche pas, vérifiez les points suivants :

  • Assurez-vous que le fichier ~/project/nginx-data/index.html existe sur l’hôte.
  • Vérifiez que le conteneur est en cours d’exécution : docker ps | grep nginx-volume
  • Consultez les journaux de Nginx pour repérer d’éventuelles erreurs : docker logs nginx-volume

Le montage d’un répertoire de l’hôte dans un conteneur s’appelle un bind mount. C’est une méthode simple pour partager des fichiers entre l’hôte et le conteneur. Voici quelques points importants à retenir :

  • Le chemin du répertoire sur l’hôte doit être absolu.
  • Si le répertoire de l’hôte n’existe pas, Docker le crée automatiquement.
  • Toute modification apportée aux fichiers de ce répertoire, sur l’hôte ou dans le conteneur, est immédiatement visible depuis les deux.
  • Faites attention aux permissions : par défaut, le conteneur s’exécute en tant que root, ce qui peut créer des fichiers que votre utilisateur sur l’hôte ne pourra pas modifier.

Cette méthode évite l’erreur « not a directory », car vous montez un répertoire et non un fichier isolé. Vous pouvez ainsi ajouter, supprimer ou modifier des fichiers sans avoir à recréer le conteneur.

Variables d’environnement

Dans cette étape, vous allez utiliser le paramètre -e de docker run pour définir des variables d’environnement dans le conteneur. Cela permet de configurer l’application sans modifier son code.

Lancez un conteneur avec des variables d’environnement :

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

Voici les nouveaux éléments de la commande :

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

Une variable d’environnement est une paire clé-valeur accessible aux processus exécutés dans le conteneur. De nombreuses images Docker sont conçues pour utiliser certaines variables d’environnement afin de configurer leurs applications.

Vérifiez les variables d’environnement :

docker exec nginx-env env | grep NGINX_

Cette commande effectue les opérations suivantes :

  • docker exec nginx-env : demande à Docker d’exécuter une commande dans le conteneur nginx-env en cours d’exécution.
  • env : affiche toutes les variables d’environnement.
  • | grep NGINX_ : filtre le résultat pour n’afficher que les lignes contenant « NGINX_ ».

Les deux variables d’environnement doivent s’afficher.

Si elles ne s’affichent pas, vérifiez les points suivants :

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

Limites de ressources

Dans cette étape, vous allez définir des limites de ressources pour les conteneurs à l’aide des paramètres de docker run. C’est essentiel pour maîtriser les performances et la stabilité de l’hôte, surtout lorsque plusieurs conteneurs sont exécutés en même temps.

Lancez un conteneur avec des limites de mémoire et de processeur :

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

Voici les nouveaux éléments de la commande :

  • --memory 256m : limite la mémoire du conteneur à 256 mégaoctets. Le « m » désigne les mégaoctets. Vous pouvez également utiliser « g » pour les gigaoctets.
  • --cpus 0.5 : limite l’utilisation du conteneur à la moitié d’un cœur de processeur au maximum.

Ces limites empêchent le conteneur d’utiliser plus de ressources que prévu et peuvent éviter qu’un seul conteneur ne monopolise les ressources de l’hôte.

Vérifiez que ces limites ont bien été appliquées :

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

La première commande doit afficher 268435456 (256 Mo en octets) et la seconde 500000000 (0,5 processeur en nanounités).

Si les valeurs affichées sont différentes, vérifiez la commande docker run et assurez-vous d’avoir correctement défini les limites.

Remarque : des limites de ressources trop basses peuvent dégrader les performances du conteneur, voire provoquer son arrêt. Si vous rencontrez des problèmes avec votre conteneur, essayez d’augmenter ces limites.

Configuration réseau

Dans cette étape, vous allez utiliser le paramètre --network de docker run pour connecter un conteneur à un réseau. Cela permet aux conteneurs de communiquer entre eux et de séparer des groupes de conteneurs.

Créez d’abord un réseau bridge personnalisé :

docker network create my-custom-network

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

Lancez maintenant 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 vous venez de créer.

Les conteneurs connectés au même réseau peuvent communiquer en utilisant leur nom de conteneur comme nom d’hôte. Il est ainsi facile de relier des services entre eux.

Si un message d’erreur indique que le réseau n’existe pas, vérifiez que vous l’avez bien créé avec la commande docker network create.

Politiques de redémarrage

Dans cette étape, vous allez utiliser le paramètre --restart de docker run pour définir une politique de redémarrage pour le conteneur. Cette politique permet de maintenir les conteneurs en fonctionnement après un plantage ou le redémarrage du démon Docker.

Lancez un conteneur avec une politique de redémarrage :

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

L’option --restart unless-stopped définit la politique de redémarrage sur « unless-stopped » : le conteneur redémarre automatiquement, sauf si vous l’arrêtez explicitement.

Voici d’autres politiques de redémarrage :

  • no : valeur par défaut. Le conteneur ne redémarre pas automatiquement.
  • on-failure : le conteneur redémarre uniquement s’il se termine avec un code de sortie différent de zéro.
  • always : le conteneur redémarre toujours, quel que soit son code de sortie.

Vérifiez la politique de redémarrage :

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

La commande doit afficher unless-stopped.

Si le résultat ne correspond pas à celui attendu, vérifiez votre commande docker run et assurez-vous d’avoir correctement défini la politique de redémarrage.

Répertoire de travail et commande

Dans cette étape, vous allez apprendre à définir un répertoire de travail dans un conteneur et à exécuter des commandes personnalisées au démarrage de celui-ci.

Le paramètre -w de docker run définit le répertoire de travail dans le conteneur. Vous pouvez également indiquer une commande à exécuter après le nom de l’image.

Combinons ces deux possibilités :

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

Voici les différents éléments de cette commande :

  • -d : lance le conteneur en mode détaché, c’est-à-dire en arrière-plan.
  • --name nginx-custom : attribue le nom « nginx-custom » au conteneur.
  • -w /app : définit /app comme répertoire de travail dans le conteneur.
  • nginx : nom de l’image à utiliser.
  • sh -c "..." : exécute une commande shell.
    • mkdir -p /app : crée le répertoire /app s’il n’existe pas.
    • && : exécute la commande suivante uniquement si la précédente a réussi.
    • touch newfile.txt : crée un fichier vide nommé newfile.txt.
    • && : exécute la commande suivante uniquement si la précédente a réussi.
    • nginx -g 'daemon off;' : démarre Nginx au premier plan, ce qui maintient le conteneur en fonctionnement.

Vérifiez maintenant 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 doit confirmer que le conteneur est en cours d’exécution. La seconde doit afficher les informations du fichier newfile.txt dans le répertoire /app du conteneur.

Résumé

Dans ce laboratoire, vous avez étudié en détail la commande docker run et ses différents paramètres et options. Vous avez appris à :

  1. Lancer un conteneur et lui attribuer un nom
  2. Rediriger des ports pour accéder depuis l’hôte aux services exécutés dans un conteneur
  3. Monter des volumes pour partager des données entre l’hôte et le conteneur
  4. Définir des variables d’environnement pour configurer un conteneur
  5. Appliquer des limites de ressources pour restreindre l’utilisation des ressources du conteneur
  6. Configurer le réseau pour permettre la communication entre conteneurs
  7. Définir des politiques de redémarrage pour améliorer la fiabilité des conteneurs
  8. Définir le répertoire de travail et la commande à exécuter au démarrage du conteneur

Les paramètres de docker run vous permettent de configurer et de gérer vos conteneurs Docker avec précision. En les maîtrisant, vous pourrez créer des déploiements de conteneurs plus élaborés et adaptés à vos besoins. Vous pourrez contrôler la façon dont les conteneurs interagissent avec l’hôte, les ressources qu’ils peuvent utiliser et leur comportement dans différentes situations.