Mise en réseau dans Compose
ImportantLa 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.
NoteLe 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-nameou la variable d'environnementCOMPOSE_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 :
- Un réseau appelé
myapp_defaultest créé. - Un conteneur est créé en utilisant la configuration de
web. Il rejoint le réseaumyapp_defaultsous le nomweb. - Un conteneur est créé en utilisant la configuration de
db. Il rejoint le réseaumyapp_defaultsous le nomdb.
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.
TipRé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: postgresVoir 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-driverLes 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-1Configurer 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-1Utiliser 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: trueAu 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 :