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-name
ou 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_default
est créé. - Un conteneur est créé en utilisant la configuration de
web
. Il rejoint le réseaumyapp_default
sous le nomweb
. - Un conteneur est créé en utilisant la configuration de
db
. Il rejoint le réseaumyapp_default
sous 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: 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 :