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

Mise en réseau dans Compose

Important

La documentation de Docker fait référence et décrit les fonctionnalités de Compose V2.

À compter de juillet 2023, Compose V1 a cessé de recevoir des mises à jour et n'est plus inclus dans les nouvelles versions de Docker Desktop. Compose V2 l'a remplacé et est désormais intégré à toutes les versions actuelles de Docker Desktop. Pour plus d'informations, consultez Migrer vers Compose V2.

Par défaut Compose configure un seul réseau pour votre application. Chaque conteneur pour un service rejoint le réseau par défaut et est à la fois accessible par d'autres conteneurs sur ce réseau, et découvrable par le nom du service.

Note

Le réseau de votre application reçoit un nom basé sur le "nom du projet", qui est basé sur le nom du répertoire dans lequel il se trouve. Vous pouvez remplacer le nom du projet avec soit le flag --project-name ou la variable d'environnement COMPOSE_PROJECT_NAME.

Par exemple, supposons que votre application soit dans un répertoire appelé myapp, et votre compose.yaml ressemble à ceci :

services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
    ports:
      - "8001:5432"

Quand vous exécutez docker compose up, voici ce qui se passe :

  1. Un réseau appelé myapp_default est créé.
  2. Un conteneur est créé en utilisant la configuration de web. Il rejoint le réseau myapp_default sous le nom web.
  3. Un conteneur est créé en utilisant la configuration de db. Il rejoint le réseau myapp_default sous le nom db.

Chaque conteneur peut maintenant rechercher le nom de service web ou db et obtenir en retour l'adresse IP du conteneur approprié. Par exemple, le code d'application de web pourrait se connecter à l'URL postgres://db:5432 et commencer à utiliser la base de données Postgres.

Il est important de noter la distinction entre HOST_PORT et CONTAINER_PORT. Dans l'exemple ci-dessus, pour db, le HOST_PORT est 8001 et le port du conteneur est 5432 (par défaut postgres). La communication service-à-service en réseau utilise le CONTAINER_PORT. Quand HOST_PORT est défini, le service est également accessible en dehors du swarm.

Dans le conteneur web, votre chaîne de connexion à db ressemblerait à postgres://db:5432, et depuis la machine hôte, la chaîne de connexion ressemblerait à postgres://{DOCKER_IP}:8001 par exemple postgres://localhost:8001 si votre conteneur s'exécute localement.

Mettre à jour les conteneurs sur le réseau

Si vous apportez un changement de configuration à un service et exécutez docker compose up pour le mettre à jour, l'ancien conteneur est supprimé et le nouveau rejoint le réseau sous une adresse IP différente mais le même nom. Les conteneurs en cours d'exécution peuvent rechercher ce nom et se connecter à la nouvelle adresse, mais l'ancienne adresse cesse de fonctionner.

Si des conteneurs ont des connexions ouvertes vers l'ancien conteneur, elles sont fermées. Il est de la responsabilité du conteneur de détecter cette condition, rechercher le nom à nouveau et se reconnecter.

Tip

Référencez les conteneurs par nom, pas par IP, chaque fois que possible. Sinon vous devrez constamment mettre à jour l'adresse IP que vous utilisez.

Lier les conteneurs

Les liens vous permettent de définir des alias supplémentaires par lesquels un service est accessible depuis un autre service. Ils ne sont pas requis pour permettre aux services de communiquer. Par défaut, tout service peut atteindre tout autre service au nom de ce service. Dans l'exemple suivant, db est accessible depuis web aux noms d'hôte db et database :

services:

  web:
    build: .
    links:
      - "db:database"
  db:
    image: postgres

Voir la référence des liens pour plus d'informations.

Mise en réseau multi-hôte

Lors du déploiement d'une application Compose sur un Docker Engine avec le mode Swarm activé, vous pouvez utiliser le pilote overlay intégré pour activer la communication multi-hôte.

Les réseaux overlay sont toujours créés comme attachable. Vous pouvez optionnellement définir la propriété attachable sur false.

Consultez la section mode Swarm, pour voir comment configurer un cluster Swarm, et le Démarrage avec la mise en réseau multi-hôte pour apprendre sur les réseaux overlay multi-hôte.

Spécifier des réseaux personnalisés

Au lieu d'utiliser simplement le réseau d'application par défaut, vous pouvez spécifier vos propres réseaux avec la clé networks de niveau supérieur. Cela vous permet de créer des topologies plus complexes et de spécifier des pilotes de réseau personnalisés et des options. Vous pouvez également l'utiliser pour connecter des services à des réseaux créés en externe qui ne sont pas gérés par Compose.

Chaque service peut spécifier à quels réseaux se connecter avec la clé networks au niveau du service, qui est une liste de noms référençant des entrées sous la clé networks de niveau supérieur.

L'exemple suivant montre un fichier Compose qui définit deux réseaux personnalisés. Le service proxy est isolé du service db, car ils ne partagent pas de réseau en commun. Seul app peut parler aux deux.

services:
  proxy:
    build: ./proxy
    networks:
      - frontend
  app:
    build: ./app
    networks:
      - frontend
      - backend
  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
    # Spécifier les options de pilote
    driver: bridge
    driver_opts:
      com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
  backend:
    # Utiliser un pilote personnalisé
    driver: custom-driver

Les réseaux peuvent être configurés avec des adresses IP statiques en définissant ipv4_address et/ou ipv6_address pour chaque réseau attaché.

Les réseaux peuvent également recevoir un nom personnalisé :

services:
  # ...
networks:
  frontend:
    name: custom_frontend
    driver: custom-driver-1

Configurer le réseau par défaut

Au lieu de, ou en plus de, spécifier vos propres réseaux, vous pouvez également changer les paramètres du réseau par défaut à l'échelle de l'application en définissant une entrée sous networks nommée default :

services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres

networks:
  default:
    # Utiliser un pilote personnalisé
    driver: custom-driver-1

Utiliser un réseau pré-existant

Si vous voulez que vos conteneurs rejoignent un réseau pré-existant, utilisez l' option external

services:
  # ...
networks:
  network1:
    name: my-pre-existing-network
    external: true

Au lieu d'essayer de créer un réseau appelé [nomprojet]_default, Compose recherche un réseau appelé my-pre-existing-network et connecte les conteneurs de votre application à celui-ci.

Informations de référence supplémentaires

Pour tous les détails des options de configuration réseau disponibles, voir les références suivantes :