Pilote de réseau Bridge
En termes de mise en réseau, un réseau bridge est un périphérique de couche de liaison qui transfère le trafic entre les segments de réseau. Un bridge peut être un périphérique matériel ou un périphérique logiciel s'exécutant dans le noyau d'une machine hôte.
En termes de Docker, un réseau bridge utilise un bridge logiciel qui permet aux conteneurs connectés au même réseau bridge de communiquer, tout en fournissant l'isolation des conteneurs qui ne sont pas connectés à ce réseau bridge. Le pilote bridge Docker installe automatiquement des règles dans la machine hôte afin que les conteneurs sur différents réseaux bridge ne puissent pas communiquer directement entre eux.
Les réseaux bridge s'appliquent aux conteneurs s'exécutant sur le même hôte de démon Docker. Pour la communication entre conteneurs s'exécutant sur différents hôtes de démon Docker, vous pouvez soit gérer le routage au niveau de l'OS, soit utiliser un réseau overlay.
Quand vous démarrez Docker, un réseau bridge par défaut (aussi
appelé bridge
) est créé automatiquement, et les conteneurs nouvellement démarrés s'y connectent
sauf spécification contraire. Vous pouvez aussi créer des réseaux bridge personnalisés définis par l'utilisateur.
Les réseaux bridge définis par l'utilisateur sont supérieurs au réseau bridge
par défaut.
Différences entre les bridges définis par l'utilisateur et le bridge par défaut
-
Les bridges définis par l'utilisateur fournissent une résolution DNS automatique entre conteneurs.
Les conteneurs sur le réseau bridge par défaut ne peuvent accéder l'un à l'autre que par adresses IP, sauf si vous utilisez l'option
--link
, qui est considérée comme héritée. Sur un réseau bridge défini par l'utilisateur, les conteneurs peuvent se résoudre mutuellement par nom ou alias.Imaginez une application avec un front-end web et un back-end de base de données. Si vous appelez vos conteneurs
web
etdb
, le conteneur web peut se connecter au conteneur db àdb
, peu importe sur quel hôte Docker la pile d'applications s'exécute.Si vous exécutez la même pile d'applications sur le réseau bridge par défaut, vous devez créer manuellement des liens entre les conteneurs (en utilisant le drapeau hérité
--link
). Ces liens doivent être créés dans les deux directions, donc vous pouvez voir que cela devient complexe avec plus de deux conteneurs qui doivent communiquer. Alternativement, vous pouvez manipuler les fichiers/etc/hosts
dans les conteneurs, mais cela crée des problèmes difficiles à déboguer. -
Les bridges définis par l'utilisateur fournissent une meilleure isolation.
Tous les conteneurs sans
--network
spécifié, sont attachés au réseau bridge par défaut. Cela peut être un risque, car des piles/services/conteneurs non liés peuvent alors communiquer.Utiliser un réseau défini par l'utilisateur fournit un réseau délimité dans lequel seuls les conteneurs attachés à ce réseau peuvent communiquer.
-
Les conteneurs peuvent être attachés et détachés des réseaux définis par l'utilisateur à la volée.
Pendant la durée de vie d'un conteneur, vous pouvez le connecter ou le déconnecter des réseaux définis par l'utilisateur à la volée. Pour retirer un conteneur du réseau bridge par défaut, vous devez arrêter le conteneur et le recréer avec différentes options réseau.
-
Chaque réseau défini par l'utilisateur crée un bridge configurable.
Si vos conteneurs utilisent le réseau bridge par défaut, vous pouvez le configurer, mais tous les conteneurs utilisent les mêmes paramètres, tels que MTU et les règles
iptables
. De plus, configurer le réseau bridge par défaut se fait en dehors de Docker lui-même, et nécessite un redémarrage de Docker.Les réseaux bridge définis par l'utilisateur sont créés et configurés en utilisant
docker network create
. Si différents groupes d'applications ont différents besoins réseau, vous pouvez configurer chaque bridge défini par l'utilisateur séparément, au moment où vous le créez. -
Les conteneurs liés sur le réseau bridge par défaut partagent les variables d'environnement.
À l'origine, la seule façon de partager des variables d'environnement entre deux conteneurs était de les lier en utilisant le drapeau
--link
. Ce type de partage de variables n'est pas possible avec les réseaux définis par l'utilisateur. Cependant, il y a des façons supérieures de partager des variables d'environnement. Quelques idées :-
Plusieurs conteneurs peuvent monter un fichier ou répertoire contenant les informations partagées, en utilisant un volume Docker.
-
Plusieurs conteneurs peuvent être démarrés ensemble en utilisant
docker-compose
et le fichier compose peut définir les variables partagées. -
Vous pouvez utiliser les services swarm au lieu de conteneurs autonomes, et tirer parti des secrets et configs partagés.
-
Les conteneurs connectés au même réseau bridge défini par l'utilisateur exposent effectivement tous les ports
les uns aux autres. Pour qu'un port soit accessible aux conteneurs ou hôtes non-Docker sur
différents réseaux, ce port doit être publié en utilisant le drapeau -p
ou --publish
.
Options
Le tableau suivant décrit les options spécifiques au pilote que vous pouvez passer à
--opt
lors de la création d'un réseau personnalisé utilisant le pilote bridge
.
Option | Défaut | Description |
---|---|---|
com.docker.network.bridge.name |
Nom d'interface à utiliser lors de la création du bridge Linux. | |
com.docker.network.bridge.enable_ip_masquerade |
true |
Activer le masquage IP. |
com.docker.network.bridge.gateway_mode_ipv4 com.docker.network.bridge.gateway_mode_ipv6 |
nat |
Contrôler la connectivité externe. Voir Filtrage de paquets et pare-feux. |
com.docker.network.bridge.enable_icc |
true |
Activer ou désactiver la connectivité inter-conteneurs. |
com.docker.network.bridge.host_binding_ipv4 |
toutes les adresses IPv4 et IPv6 | IP par défaut lors de la liaison des ports de conteneur. |
com.docker.network.driver.mtu |
0 (pas de limite) |
Définir l'Unité de Transmission Maximale (MTU) du réseau des conteneurs. |
com.docker.network.container_iface_prefix |
eth |
Définir un préfixe personnalisé pour les interfaces de conteneur. |
com.docker.network.bridge.inhibit_ipv4 |
false |
Empêcher Docker d'assigner une adresse IP au bridge. |
Certaines de ces options sont aussi disponibles comme drapeaux pour la CLI dockerd
, et vous
pouvez les utiliser pour configurer le bridge docker0
par défaut lors du démarrage du démon Docker.
Le tableau suivant montre quelles options ont des drapeaux équivalents dans la
CLI dockerd
.
Option | Drapeau |
---|---|
com.docker.network.bridge.name |
- |
com.docker.network.bridge.enable_ip_masquerade |
--ip-masq |
com.docker.network.bridge.enable_icc |
--icc |
com.docker.network.bridge.host_binding_ipv4 |
--ip |
com.docker.network.driver.mtu |
--mtu |
com.docker.network.container_iface_prefix |
- |
Le démon Docker prend en charge un drapeau --bridge
, que vous pouvez utiliser pour définir
votre propre bridge docker0
. Utilisez cette option si vous voulez exécuter plusieurs instances de démon
sur le même hôte. Pour les détails, voir
Exécuter plusieurs démons.
Adresse de liaison d'hôte par défaut
Quand aucune adresse d'hôte n'est donnée dans les options de publication de port comme -p 80
ou -p 8080:80
, le défaut est de rendre le port 80 du conteneur disponible sur toutes
les adresses d'hôte, IPv4 et IPv6.
L'option du pilote de réseau bridge com.docker.network.bridge.host_binding_ipv4
peut être utilisée pour modifier l'adresse par défaut pour les ports publiés.
Malgré le nom de l'option, il est possible de spécifier une adresse IPv6.
Quand l'adresse de liaison par défaut est une adresse assignée à une interface spécifique, le port du conteneur ne sera accessible que via cette adresse.
Définir l'adresse de liaison par défaut à ::
signifie que les ports publiés ne seront
disponibles que sur les adresses IPv6 de l'hôte. Cependant, la définir à 0.0.0.0
signifie qu'elle
sera disponible sur les adresses IPv4 et IPv6 de l'hôte.
Pour restreindre un port publié à IPv4 seulement, l'adresse doit être incluse dans les
options de publication du conteneur. Par exemple, -p 0.0.0.0:8080:80
.
Gérer un bridge défini par l'utilisateur
Utilisez la commande docker network create
pour créer un réseau bridge
défini par l'utilisateur.
$ docker network create my-net
Vous pouvez spécifier le sous-réseau, la plage d'adresses IP, la passerelle, et autres
options. Voir la
référence
docker network create
ou la sortie de docker network create --help
pour les détails.
Utilisez la commande docker network rm
pour supprimer un réseau bridge
défini par l'utilisateur. Si des conteneurs sont actuellement connectés au réseau,
déconnectez-les
d'abord.
$ docker network rm my-net
Que se passe-t-il vraiment ?
Quand vous créez ou supprimez un bridge défini par l'utilisateur ou connectez ou déconnectez un conteneur d'un bridge défini par l'utilisateur, Docker utilise des outils spécifiques au système d'exploitation pour gérer l'infrastructure réseau sous-jacente (comme ajouter ou supprimer des périphériques bridge ou configurer des règles
iptables
sur Linux). Ces détails doivent être considérés comme des détails d'implémentation. Laissez Docker gérer vos réseaux définis par l'utilisateur pour vous.
Connecter un conteneur à un bridge défini par l'utilisateur
Quand vous créez un nouveau conteneur, vous pouvez spécifier un ou plusieurs drapeaux --network
.
Cet exemple connecte un conteneur Nginx au réseau my-net
. Il publie aussi
le port 80 dans le conteneur au port 8080 sur l'hôte Docker, donc les clients externes
peuvent accéder à ce port. Tout autre conteneur connecté au réseau my-net
a accès à tous les ports sur le conteneur my-nginx
, et vice versa.
$ docker create --name my-nginx \
--network my-net \
--publish 8080:80 \
nginx:latest
Pour connecter un conteneur en cours d'exécution à un bridge défini par l'utilisateur existant, utilisez la
commande docker network connect
. La commande suivante connecte un conteneur
my-nginx
déjà en cours d'exécution à un réseau my-net
déjà existant :
$ docker network connect my-net my-nginx
Déconnecter un conteneur d'un bridge défini par l'utilisateur
Pour déconnecter un conteneur en cours d'exécution d'un bridge défini par l'utilisateur, utilisez la
commande docker network disconnect
. La commande suivante déconnecte
le conteneur my-nginx
du réseau my-net
.
$ docker network disconnect my-net my-nginx
Utiliser IPv6 dans un réseau bridge défini par l'utilisateur
Quand vous créez votre réseau, vous pouvez spécifier le drapeau --ipv6
pour activer IPv6.
$ docker network create --ipv6 --subnet 2001:db8:1234::/64 my-net
Si vous ne fournissez pas d'option --subnet
, un préfixe d'Adresse Locale Unique (ULA)
sera choisi automatiquement.
Réseaux bridge IPv6 uniquement
Pour ignorer la configuration d'adresse IPv4 sur le bridge et dans ses conteneurs, créez
le réseau avec l'option --ipv4=false
, et activez IPv6 en utilisant --ipv6
.
$ docker network create --ipv6 --ipv4=false v6net
La configuration d'adresse IPv4 ne peut pas être désactivée dans le réseau bridge par défaut.
Utiliser le réseau bridge par défaut
Le réseau bridge
par défaut est considéré comme un détail hérité de Docker et n'est pas
recommandé pour l'utilisation en production. Le configurer est une opération manuelle, et il a
des défauts techniques.
Connecter un conteneur au réseau bridge par défaut
Si vous ne spécifiez pas de réseau en utilisant le drapeau --network
, et que vous ne spécifiez pas de
pilote réseau, votre conteneur est connecté au réseau bridge
par défaut par
défaut. Les conteneurs connectés au réseau bridge
par défaut peuvent communiquer,
mais seulement par adresse IP, sauf s'ils sont liés en utilisant le
drapeau hérité --link
.
Configurer le réseau bridge par défaut
Pour configurer le réseau bridge
par défaut, vous spécifiez des options dans daemon.json
.
Voici un exemple daemon.json
avec plusieurs options spécifiées. Spécifiez seulement
les paramètres que vous devez personnaliser.
{
"bip": "192.168.1.1/24",
"fixed-cidr": "192.168.1.0/25",
"mtu": 1500,
"default-gateway": "192.168.1.254",
"dns": ["10.20.1.2","10.20.1.3"]
}
Dans cet exemple :
- L'adresse du bridge est "192.168.1.1/24" (de
bip
). - Le sous-réseau du réseau bridge est "192.168.1.0/24" (de
bip
). - Les adresses de conteneur seront allouées de "192.168.1.0/25" (de
fixed-cidr
).
Utiliser IPv6 avec le réseau bridge par défaut
IPv6 peut être activé pour le bridge par défaut en utilisant les options suivantes dans
daemon.json
, ou leurs équivalents en ligne de commande.
Ces trois options n'affectent que le bridge par défaut, elles ne sont pas utilisées par les réseaux définis par l'utilisateur. Les adresses ci-dessous sont des exemples de la plage de documentation IPv6.
- L'option
ipv6
est requise. - L'option
bip6
est optionnelle, elle spécifie l'adresse du bridge par défaut, qui sera utilisée comme passerelle par défaut par les conteneurs. Elle spécifie aussi le sous-réseau pour le réseau bridge. - L'option
fixed-cidr-v6
est optionnelle, elle spécifie la plage d'adresses que Docker peut automatiquement allouer aux conteneurs.- Le préfixe devrait normalement être
/64
ou plus court. - Pour l'expérimentation sur un réseau local, il est mieux d'utiliser un préfixe d'Adresse Locale
Unique (ULA) (correspondant à
fd00::/8
) qu'un préfixe Link Local (correspondant àfe80::/10
).
- Le préfixe devrait normalement être
- L'option
default-gateway-v6
est optionnelle. Si non spécifiée, le défaut est la première adresse dans le sous-réseaufixed-cidr-v6
.
{
"ipv6": true,
"bip6": "2001:db8::1111/64",
"fixed-cidr-v6": "2001:db8::/64",
"default-gateway-v6": "2001:db8:abcd::89"
}
Si aucun bip6
n'est spécifié, fixed-cidr-v6
définit le sous-réseau pour le réseau
bridge. Si aucun bip6
ou fixed-cidr-v6
n'est spécifié, un préfixe ULA sera
choisi.
Redémarrez Docker pour que les changements prennent effet.
Limite de connexion pour les réseaux bridge
En raison des limitations fixées par le noyau Linux, les réseaux bridge deviennent instables et les communications inter-conteneurs peuvent se rompre quand 1000 conteneurs ou plus se connectent à un seul réseau.
Pour plus d'informations sur cette limitation, voir moby/moby#44973.
Ignorer la configuration d'adresse IP du Bridge
Le bridge se voit normalement assigné l'adresse --gateway
du réseau, qui est
utilisée comme route par défaut du réseau bridge vers d'autres réseaux.
L'option com.docker.network.bridge.inhibit_ipv4
vous permet de créer un réseau
sans que l'adresse de passerelle IPv4 soit assignée au bridge. Ceci est utile
si vous voulez configurer l'adresse IP de la passerelle pour le bridge manuellement. Par
exemple si vous ajoutez une interface physique à votre bridge, et avez besoin qu'elle ait
l'adresse de passerelle.
Avec cette configuration, le trafic nord-sud (vers et depuis le réseau bridge) ne fonctionnera pas sauf si vous avez configuré manuellement l'adresse de passerelle sur le bridge, ou un périphérique qui y est attaché.
Cette option ne peut être utilisée qu'avec les réseaux bridge définis par l'utilisateur.
Étapes suivantes
- Parcourez le tutoriel de mise en réseau autonome
- Apprenez sur la mise en réseau du point de vue du conteneur
- Apprenez sur les réseaux overlay
- Apprenez sur les réseaux Macvlan