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

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 et db, 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).
  • L'option default-gateway-v6 est optionnelle. Si non spécifiée, le défaut est la première adresse dans le sous-réseau fixed-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