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. |
ImportantLa 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
WarningDans 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.