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

Vue d'ensemble du réseau

Le réseau de conteneurs fait référence à la capacité des conteneurs à se connecter et communiquer entre eux, ou avec des charges de travail non-Docker.

Les conteneurs ont le réseau activé par défaut, et ils peuvent effectuer des connexions sortantes. Un conteneur n'a aucune information sur le type de réseau auquel il est attaché, ou si leurs pairs sont également des charges de travail Docker ou non. Un conteneur ne voit qu'une interface réseau avec une adresse IP, une passerelle, une table de routage, des services DNS, et d'autres détails de réseau. C'est-à-dire, sauf si le conteneur utilise le pilote réseau none.

Cette page décrit le réseau du point de vue du conteneur, et les concepts autour du réseau de conteneurs. Cette page ne décrit pas les détails spécifiques au système d'exploitation sur la façon dont les réseaux Docker fonctionnent. Pour des informations sur la façon dont Docker manipule les règles iptables sur Linux, voir Filtrage de paquets et pare-feux.

Réseaux définis par l'utilisateur

Vous pouvez créer des réseaux personnalisés, définis par l'utilisateur, et connecter plusieurs conteneurs au même réseau. Une fois connectés à un réseau défini par l'utilisateur, les conteneurs peuvent communiquer entre eux en utilisant les adresses IP des conteneurs ou les noms des conteneurs.

L'exemple suivant crée un réseau en utilisant le pilote réseau bridge et exécute un conteneur dans le réseau créé :

$ docker network create -d bridge my-net
$ docker run --network=my-net -itd --name=container3 busybox

Pilotes

Les pilotes réseau suivants sont disponibles par défaut, et fournissent une fonctionnalité réseau de base :

Pilote Description
bridge Le pilote réseau par défaut.
host Supprime l'isolation réseau entre le conteneur et l'hôte Docker.
none Isole complètement un conteneur de l'hôte et des autres conteneurs.
overlay Les réseaux overlay connectent plusieurs démons Docker ensemble.
ipvlan Les réseaux IPvlan fournissent un contrôle total sur l'adressage IPv4 et IPv6.
macvlan Attribue une adresse MAC à un conteneur.

Pour plus d'informations sur les différents pilotes, voir Vue d'ensemble des pilotes réseau.

Connexion à plusieurs réseaux

Un conteneur peut être connecté à plusieurs réseaux.

Par exemple, un conteneur frontend peut être connecté à un réseau bridge avec accès externe, et un réseau --internal pour communiquer avec des conteneurs exécutant des services backend qui n'ont pas besoin d'accès réseau externe.

Un conteneur peut également être connecté à différents types de réseau. Par exemple, un réseau ipvlan pour fournir un accès internet, et un réseau bridge pour l'accès aux services locaux.

Lors de l'envoi de paquets, si la destination est une adresse dans un réseau directement connecté, les paquets sont envoyés à ce réseau. Sinon, les paquets sont envoyés à une passerelle par défaut pour le routage vers leur destination. Dans l'exemple ci-dessus, la passerelle du réseau ipvlan doit être la passerelle par défaut.

La passerelle par défaut est sélectionnée par Docker, et peut changer chaque fois que les connexions réseau d'un conteneur changent. Pour faire en sorte que Docker choisisse une passerelle par défaut spécifique lors de la création du conteneur ou de la connexion d'un nouveau réseau, définissez une priorité de passerelle. Voir l'option gw-priority pour les commandes docker run et docker network connect.

La gw-priority par défaut est 0 et la passerelle dans le réseau avec la priorité la plus élevée est la passerelle par défaut. Donc, quand un réseau doit toujours être la passerelle par défaut, il suffit de définir sa gw-priority à 1.

$ docker run --network name=gwnet,gw-priority=1 --network anet1 --name myctr myimage
$ docker network connect anet2 myctr

Réseaux de conteneurs

En plus des réseaux définis par l'utilisateur, vous pouvez attacher un conteneur à la pile réseau d'un autre conteneur directement, en utilisant le format de drapeau --network container:<name|id>.

Les drapeaux suivants ne sont pas pris en charge pour les conteneurs utilisant le mode réseau container: :

  • --add-host
  • --hostname
  • --dns
  • --dns-search
  • --dns-option
  • --mac-address
  • --publish
  • --publish-all
  • --expose

L'exemple suivant exécute un conteneur Redis, avec Redis se liant à localhost, puis exécute la commande redis-cli et se connecte au serveur Redis via l'interface localhost.

$ docker run -d --name redis example/redis --bind 127.0.0.1
$ docker run --rm -it --network container:redis example/redis-cli -h 127.0.0.1

Ports publiés

Par défaut, lorsque vous créez ou exécutez un conteneur en utilisant docker create ou docker run, les conteneurs sur les réseaux bridge n'exposent aucun port au monde extérieur. Utilisez le drapeau --publish ou -p pour rendre un port disponible aux services à l'extérieur du réseau bridge. Cela crée une règle de pare-feu dans l'hôte, mappant un port de conteneur à un port sur l'hôte Docker vers le monde extérieur. Voici quelques exemples :

Valeur du drapeau Description
-p 8080:80 Mappe le port 8080 sur l'hôte Docker au port TCP 80 dans le conteneur.
-p 192.168.1.100:8080:80 Mappe le port 8080 sur l'IP de l'hôte Docker 192.168.1.100 au port TCP 80 dans le conteneur.
-p 8080:80/udp Mappe le port 8080 sur l'hôte Docker au port UDP 80 dans le conteneur.
-p 8080:80/tcp -p 8080:80/udp Mappe le port TCP 8080 sur l'hôte Docker au port TCP 80 dans le conteneur, et mappe le port UDP 8080 sur l'hôte Docker au port UDP 80 dans le conteneur.
Important

La publication des ports de conteneurs est non sécurisée par défaut. Cela signifie que lorsque vous publiez les ports d'un conteneur, ils deviennent disponibles non seulement à l'hôte Docker, mais aussi au monde extérieur.

Si vous incluez l'adresse IP localhost (127.0.0.1, ou ::1) avec le drapeau publish, seuls l'hôte Docker et ses conteneurs peuvent accéder au port de conteneur publié.

$ docker run -p 127.0.0.1:8080:80 -p '[::1]:8080:80' nginx
Warning

Dans les versions antérieures à 28.0.0, les hôtes du même segment L2 (par exemple, les hôtes connectés au même commutateur réseau) peuvent atteindre les ports publiés sur localhost. Pour plus d'informations, voir moby/moby#45610

Si vous voulez rendre un conteneur accessible à d'autres conteneurs, il n'est pas nécessaire de publier les ports du conteneur. Vous pouvez activer la communication inter-conteneurs en connectant les conteneurs au même réseau, généralement un réseau bridge.

Les ports sur les adresses IPv6 de l'hôte seront mappés à l'adresse IPv4 du conteneur si aucune IP d'hôte n'est donnée dans un mappage de port, le réseau bridge est uniquement IPv4, et --userland-proxy=true (par défaut).

Pour plus d'informations sur le mappage de ports, y compris comment le désactiver et utiliser le routage direct vers les conteneurs, voir filtrage de paquets et pare-feux.

Adresse IP et nom d'hôte

Lors de la création d'un réseau, l'allocation d'adresses IPv4 est activée par défaut, elle peut être désactivée en utilisant --ipv4=false. L'allocation d'adresses IPv6 peut être activée en utilisant --ipv6.

$ docker network create --ipv6 --ipv4=false v6net

Par défaut, le conteneur obtient une adresse IP pour chaque réseau Docker auquel il s'attache. Un conteneur reçoit une adresse IP du sous-réseau IP du réseau. Le démon Docker effectue un sous-réseautage dynamique et une allocation d'adresses IP pour les conteneurs. Chaque réseau a également un masque de sous-réseau et une passerelle par défaut.

Vous pouvez connecter un conteneur en cours d'exécution à plusieurs réseaux, soit en passant le drapeau --network plusieurs fois lors de la création du conteneur, soit en utilisant la commande docker network connect pour les conteneurs déjà en cours d'exécution. Dans les deux cas, vous pouvez utiliser les drapeaux --ip ou --ip6 pour spécifier l'adresse IP du conteneur sur ce réseau particulier.

De la même manière, le nom d'hôte d'un conteneur par défaut est l'ID du conteneur dans Docker. Vous pouvez remplacer le nom d'hôte en utilisant --hostname. Lors de la connexion à un réseau existant en utilisant docker network connect, vous pouvez utiliser le drapeau --alias pour spécifier un alias réseau supplémentaire pour le conteneur sur ce réseau.

Services DNS

Les conteneurs utilisent les mêmes serveurs DNS que l'hôte par défaut, mais vous pouvez remplacer cela avec --dns.

Par défaut, les conteneurs héritent des paramètres DNS tels que définis dans le fichier de configuration /etc/resolv.conf. Les conteneurs qui s'attachent au réseau bridge par défaut reçoivent une copie de ce fichier. Les conteneurs qui s'attachent à un réseau personnalisé utilisent le serveur DNS intégré de Docker. Le serveur DNS intégré transfère les recherches DNS externes aux serveurs DNS configurés sur l'hôte.

Vous pouvez configurer la résolution DNS sur une base par conteneur, en utilisant des drapeaux pour la commande docker run ou docker create utilisée pour démarrer le conteneur. Le tableau suivant décrit les drapeaux docker run disponibles liés à la configuration DNS.

Drapeau Description
--dns L'adresse IP d'un serveur DNS. Pour spécifier plusieurs serveurs DNS, utilisez plusieurs drapeaux --dns. Les requêtes DNS seront transférées depuis l'espace de noms réseau du conteneur donc, par exemple, --dns=127.0.0.1 fait référence à l'adresse de bouclage propre du conteneur.
--dns-search Un domaine de recherche DNS pour rechercher les noms d'hôtes non entièrement qualifiés. Pour spécifier plusieurs préfixes de recherche DNS, utilisez plusieurs drapeaux --dns-search.
--dns-opt Une paire clé-valeur représentant une option DNS et sa valeur. Voir la documentation de votre système d'exploitation pour resolv.conf pour les options valides.
--hostname Le nom d'hôte qu'un conteneur utilise pour lui-même. Par défaut à l'ID du conteneur s'il n'est pas spécifié.

Hôtes personnalisés

Votre conteneur aura des lignes dans /etc/hosts qui définissent le nom d'hôte du conteneur lui-même, ainsi que localhost et quelques autres choses communes. Les hôtes personnalisés, définis dans /etc/hosts sur la machine hôte, ne sont pas hérités par les conteneurs. Pour passer des hôtes supplémentaires dans un conteneur, reportez-vous à ajouter des entrées au fichier hosts du conteneur dans la documentation de référence de docker run.

Serveur proxy

Si votre conteneur doit utiliser un serveur proxy, voir Utiliser un serveur proxy.