⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Remplacement des valeurs par défaut du conteneur

Explication

Lorsqu'un conteneur Docker démarre, il exécute une application ou une commande. Le conteneur obtient cet exécutable (script ou fichier) à partir de la configuration de son image. Les conteneurs sont livrés avec des paramètres par défaut qui fonctionnent généralement bien, mais vous pouvez les modifier si nécessaire. Ces ajustements aident le programme du conteneur à s'exécuter exactement comme vous le souhaitez.

Par exemple, si vous avez un conteneur de base de données existant qui écoute sur le port standard et que vous souhaitez exécuter une nouvelle instance du même conteneur de base de données, vous voudrez peut-être modifier les paramètres de port sur lesquels le nouveau conteneur écoute afin qu'il n'entre pas en conflit avec le conteneur existant. Parfois, vous voudrez peut-être augmenter la mémoire disponible pour le conteneur si le programme a besoin de plus de ressources pour gérer une charge de travail importante ou définir les variables d'environnement pour fournir des détails de configuration spécifiques dont le programme a besoin pour fonctionner correctement.

La commande docker run offre un moyen puissant de remplacer ces valeurs par défaut et d'adapter le comportement du conteneur à votre convenance. La commande offre plusieurs indicateurs qui vous permettent de personnaliser le comportement du conteneur à la volée.

Voici quelques façons d'y parvenir.

Remplacement des ports réseau

Parfois, vous voudrez peut-être utiliser des instances de base de données distinctes à des fins de développement et de test. L'exécution de ces instances de base de données sur le même port peut entrer en conflit. Vous pouvez utiliser l'option -p dans docker run pour mapper les ports du conteneur aux ports de l'hôte, ce qui vous permet d'exécuter plusieurs instances du conteneur sans aucun conflit.

$ docker run -d -p HOST_PORT:CONTAINER_PORT postgres

Définition des variables d'environnement

Cette option définit une variable d'environnement foo à l'intérieur du conteneur avec la valeur bar.

$ docker run -e foo=bar postgres env

Vous verrez une sortie comme la suivante :

HOSTNAME=2042f2e6ebe4
foo=bar
Tip

Le fichier .env constitue un moyen pratique de définir des variables d'environnement pour vos conteneurs Docker sans encombrer votre ligne de commande avec de nombreux indicateurs -e. Pour utiliser un fichier .env, vous pouvez passer l'option --env-file avec la commande docker run.

$ docker run --env-file .env postgres env

Restriction de la consommation des ressources par le conteneur

Vous pouvez utiliser les indicateurs --memory et --cpus avec la commande docker run pour restreindre la quantité de processeur et de mémoire qu'un conteneur peut utiliser. Par exemple, vous pouvez définir une limite de mémoire pour le conteneur de l'API Python, l'empêchant de consommer des ressources excessives sur votre hôte. Voici la commande :

$ docker run -e POSTGRES_PASSWORD=secret --memory="512m" --cpus="0.5" postgres

Cette commande limite l'utilisation de la mémoire du conteneur à 512 Mo et définit le quota de processeur de 0.5 pour un demi-cœur.

Surveiller l'utilisation des ressources en temps réel

Vous pouvez utiliser la commande docker stats pour surveiller l'utilisation des ressources en temps réel des conteneurs en cours d'exécution. Cela vous aide à comprendre si les ressources allouées sont suffisantes ou si elles doivent être ajustées.

En utilisant efficacement ces indicateurs docker run, vous pouvez adapter le comportement de votre application conteneurisée à vos besoins spécifiques.

Essayez-le

Dans ce guide pratique, vous verrez comment utiliser la commande docker run pour remplacer les valeurs par défaut du conteneur.

  1. Téléchargez et installez Docker Desktop.

Exécuter plusieurs instances de la base de données Postgres

  1. Démarrez un conteneur à l'aide de l'image Postgres avec la commande suivante :
```console
$ docker run -d -e POSTGRES_PASSWORD=secret -p 5432:5432 postgres
```

Cela démarrera la base de données Postgres en arrière-plan, en écoutant sur le port de conteneur standard `5432` et mappé au port `5432` sur la machine hôte.
  1. Démarrez un deuxième conteneur Postgres mappé sur un port différent.

    $ docker run -d -e POSTGRES_PASSWORD=secret -p 5433:5432 postgres
    

    Cela démarrera un autre conteneur Postgres en arrière-plan, en écoutant sur le port postgres standard 5432 dans le conteneur, mais mappé au port 5433 sur la machine hôte. Vous remplacez le port de l'hôte simplement pour vous assurer que ce nouveau conteneur n'entre pas en conflit avec le conteneur en cours d'exécution existant.

  2. Vérifiez que les deux conteneurs sont en cours d'exécution en allant dans la vue Conteneurs du tableau de bord de Docker Desktop.

    Une capture d'écran du tableau de bord de Docker Desktop montrant les instances en cours d'exécution des conteneurs Postgres

Exécuter le conteneur Postgres dans un réseau contrôlé

Par défaut, les conteneurs se connectent automatiquement à un réseau spécial appelé réseau pont lorsque vous les exécutez. Ce réseau pont agit comme un pont virtuel, permettant aux conteneurs sur le même hôte de communiquer entre eux tout en les maintenant isolés du monde extérieur et des autres hôtes. C'est un point de départ pratique pour la plupart des interactions de conteneurs. Cependant, pour des scénarios spécifiques, vous voudrez peut-être plus de contrôle sur la configuration du réseau.

C'est là que le réseau personnalisé entre en jeu. Vous créez un réseau personnalisé en passant l'indicateur --network avec la commande docker run. Tous les conteneurs sans indicateur --network sont attachés au réseau pont par défaut.

Suivez les étapes pour voir comment connecter un conteneur Postgres à un réseau personnalisé.

  1. Créez un nouveau réseau personnalisé en utilisant la commande suivante :

    $ docker network create mynetwork
    
  2. Vérifiez le réseau en exécutant la commande suivante :

    $ docker network ls
    

    Cette commande liste tous les réseaux, y compris le "mynetwork" nouvellement créé.

  3. Connectez Postgres au réseau personnalisé en utilisant la commande suivante :

    $ docker run -d -e POSTGRES_PASSWORD=secret -p 5434:5432 --network mynetwork postgres
    

    Cela démarrera le conteneur Postgres en arrière-plan, mappé au port hôte 5434 et attaché au réseau mynetwork. Vous avez passé le paramètre --network pour remplacer la valeur par défaut du conteneur en connectant le conteneur au réseau Docker personnalisé pour une meilleure isolation et communication avec d'autres conteneurs. Vous pouvez utiliser la commande docker network inspect pour voir if le conteneur est lié à ce nouveau réseau pont.

    Différence clé entre le pont par défaut et les réseaux personnalisés

    1. Résolution DNS : Par défaut, les conteneurs connectés au réseau pont par défaut peuvent communiquer entre eux, mais uniquement par adresse IP. (sauf si vous utilisez l'option --link qui est considérée comme héritée). Il n'est pas recommandé pour une utilisation en production en raison des diverses lacunes techniques. Sur un réseau personnalisé, les conteneurs peuvent se résoudre mutuellement par nom ou alias.
    2. Isolation : Tous les conteneurs sans --network spécifié sont attachés au réseau pont par défaut, ce qui peut donc présenter un risque, car des conteneurs non liés peuvent alors communiquer. L'utilisation d'un réseau personnalisé fournit un réseau limité dans lequel seuls les conteneurs attachés à ce réseau peuvent communiquer, offrant ainsi une meilleure isolation.

Gérer les ressources

Par défaut, les conteneurs ne sont pas limités dans leur utilisation des ressources. Cependant, sur les systèmes partagés, il est crucial de gérer efficacement les ressources. Il est important de ne pas laisser un conteneur en cours d'exécution consommer trop de mémoire de la machine hôte.

C'est là que la commande docker run brille à nouveau. Elle offre des indicateurs comme --memory et --cpus pour restreindre la quantité de processeur et de mémoire qu'un conteneur peut utiliser.

$ docker run -d -e POSTGRES_PASSWORD=secret --memory="512m" --cpus=".5" postgres

L'indicateur --cpus spécifie le quota de processeur pour le conteneur. Ici, il est défini sur un demi-cœur de processeur (0.5) tandis que l'indicateur --memory spécifie la limite de mémoire pour le conteneur. Dans ce cas, il est défini sur 512 Mo.

Remplacer les CMD et ENTRYPOINT par défaut dans Docker Compose

Parfois, vous devrez peut-être remplacer les commandes par défaut (CMD) ou les points d'entrée (ENTRYPOINT) définis dans une image Docker, en particulier lors de l'utilisation de Docker Compose.

  1. Créez un fichier compose.yml avec le contenu suivant :

    services:
      postgres:
        image: postgres
        entrypoint: ["docker-entrypoint.sh", "postgres"]
        command: ["-h", "localhost", "-p", "5432"]
        environment:
          POSTGRES_PASSWORD: secret

    Le fichier Compose définit un service nommé postgres qui utilise l'image Postgres officielle, définit un script de point d'entrée et démarre le conteneur avec une authentification par mot de passe.

  2. Mettez en place le service en exécutant la commande suivante :

    $ docker compose up -d
    

    Cette commande démarre le service Postgres défini dans le fichier Docker Compose.

  3. Vérifiez l'authentification avec le tableau de bord Docker Desktop.

    Ouvrez le tableau de bord Docker Desktop, sélectionnez le conteneur Postgres et sélectionnez Exec pour entrer dans le shell du conteneur. Vous pouvez taper la commande suivante pour vous connecter à la base de données Postgres :

    # psql -U postgres
    
    Une capture d'écran du tableau de bord de Docker Desktop sélectionnant le conteneur Postgres et entrant dans son shell à l'aide du bouton EXEC
    Note

    L'image PostgreSQL met en place une authentification de confiance localement, vous remarquerez donc peut-être qu'un mot de passe n'est pas requis lors de la connexion depuis localhost (à l'intérieur du même conteneur). Cependant, un mot de passe sera requis si vous vous connectez depuis un hôte/conteneur différent.

Remplacer les CMD et ENTRYPOINT par défaut avec docker run

Vous pouvez également remplacer les valeurs par défaut directement à l'aide de la commande docker run avec la commande suivante :

$ docker run -e POSTGRES_PASSWORD=secret postgres docker-entrypoint.sh -h localhost -p 5432

Cette commande exécute un conteneur Postgres, définit une variable d'environnement pour l'authentification par mot de passe, remplace les commandes de démarrage par défaut et configure le mappage de nom d'hôte et de port.

Ressources supplémentaires

Prochaines étapes

Maintenant que vous avez appris à remplacer les valeurs par défaut des conteneurs, il est temps d'apprendre à conserver les données des conteneurs.