Lorsque Docker est installé, il créera automatiquement trois réseaux, pont (créer un conteneur pour se connecter à ce réseau par défaut), aucun, hôte
Mode réseau |
|
---|---|
Héberger | Le conteneur ne virtualisera pas sa propre carte réseau, ne configurera pas sa propre adresse IP, etc., mais utilisera l'adresse IP et le port de l'hôte. |
Pont | Ce mode allouera et définira l'IP pour chaque conteneur, connectera le conteneur à un pont virtuel docker0 et communiquera avec l'hôte via le pont docker0 et la configuration de la table nat Iptables. |
Aucun | Ce mode désactive la fonction réseau du conteneur. |
Récipient | Le conteneur créé ne créera pas sa propre carte réseau et ne configurera pas sa propre adresse IP, mais partagera l'adresse IP et la plage de ports avec un conteneur spécifié. |
1. Réseau par défaut
Lorsque vous installez Docker, il crée automatiquement trois réseaux. Vous pouvez utiliser la docker network ls
commande suivante pour répertorier ces réseaux:
Docker a créé ces trois réseaux, lorsque vous exécutez le conteneur, vous pouvez utiliser cet –network
indicateur pour spécifier quel conteneur doit être connecté au réseau.
Le représentant du réseau de ponts docker0C'est le réseau qui existe dans toutes les installations Docker. Sauf si vous utilisez cette docker run --network=XXX
option que vous spécifiez autrement, le démon Docker par défaut se connectera à ce conteneur réseau.
Nous utilisons docker run
lors de la création d'un conteneur Docker, vous pouvez utiliser --net
les options de mode réseau du conteneur spécifié, Docker peut avoir les quatre types de modes réseau suivants:
- mode hôte: utilisation
--net=host
spécifiée - aucun mode: utilisez pour
--net=none
spécifier - mode pont: utiliser
--net=bridge
spécifié, les paramètres par défaut - mode conteneur: utilisation
--net=container:NAME_or_ID
spécifiée
2. Mode hôte
Il équivaut au mode pont de VMware. Il se trouve sur le même réseau que la machine hôte, mais n'a pas d'adresse IP distincte .
Comme nous le savons tous, Docker utilise la technologie des espaces de noms de Linux pour l'isolation des ressources, comme le processus d'isolation de l'espace de noms PID, le système de fichiers d'isolation de l'espace de noms de montage, le réseau d'isolation de l'espace de noms réseau, etc.
Un espace de noms réseau fournit un environnement réseau indépendant, y compris les cartes réseau, le routage, les règles Iptable, etc., sont isolés des autres espaces de noms réseau. Un conteneur Docker se voit généralement attribuer un espace de noms réseau indépendant. Mais si le mode hôte est utilisé lors du démarrage du conteneur, le conteneur n'obtiendra pas d'espace de noms réseau indépendant, mais partagera un espace de noms réseau avec l'hôte. Le conteneur ne virtualisera pas sa propre carte réseau, ne configurera pas sa propre adresse IP, etc., mais utilisera l'adresse IP et le port de l'hôte .
Comme vous pouvez le voir, le réseau du conteneur utilise le réseau de l'hôte (voici l'adresse IP intranet de mon Tencent Cloud), mais d'autres aspects du conteneur, tels que le système de fichiers, la liste des processus, etc., sont toujours isolés de l'hôte.
3. Mode conteneur
Après avoir compris le mode hôte, ce mode est facile à comprendre. Ce mode spécifie que le conteneur nouvellement créé partage un espace de noms réseau avec un conteneur existant au lieu de le partager avec l'hôte . Le conteneur nouvellement créé ne créera pas sa propre carte réseau, ne configurera pas sa propre adresse IP, mais partagera l'adresse IP, la plage de ports, etc. avec un conteneur spécifié . De même, en plus des aspects réseau des deux conteneurs, d'autres éléments tels que les systèmes de fichiers et les listes de processus sont toujours isolés . Les processus des deux conteneurs peuvent communiquer via le périphérique de carte réseau IO.
4. Mode Aucun
Ce mode place le conteneur dans sa propre pile réseau, mais n'effectue aucune configuration. En fait, ce mode désactive la fonction réseau du conteneur , ce qui est utile dans les deux situations suivantes: le conteneur ne nécessite pas de réseau (par exemple, uniquement une tâche batch d'écriture de volumes de disque).
5. Mode pont
Équivalent au mode Nat de VMware, le conteneur utilise un espace de noms réseau indépendant et est connecté à la carte réseau virtuelle docker0 (mode par défaut). Communiquez avec l'hôte via le pont docker0 et la configuration de la table nat Iptables; le mode pont est le paramètre réseau par défaut de Docker. Ce mode allouera un espace de noms réseau, définira l'IP, etc. pour chaque conteneur et connectera le conteneur Docker à un hôte à un virtuel sur le pont. Ce qui suit se concentre sur ce mode.
5.1 Topologie du mode pont
Lorsque le serveur Docker démarre, un pont virtuel nommé docker0 sera créé sur l'hôte et le conteneur Docker démarré sur cet hôte sera connecté à ce pont virtuel. Le pont virtuel fonctionne comme un commutateur physique, de sorte que tous les conteneurs de l'hôte sont connectés à un réseau de couche 2 via le commutateur . L'étape suivante consiste à attribuer une adresse IP au conteneur. Docker sélectionnera une adresse IP et un sous-réseau différents de l'hôte dans le segment de réseau IP privé défini par RFC1918 et l'affectera à docker0. Le conteneur connecté à docker0 effectuera une sélection dans ce sous-réseau. Une adresse IP inoccupée est utilisée. Tels que Docker général utilise le segment de réseau 172.18.0.0/16 et 172.18.0.1/16 alloué au pont docker0 (sur l'hôte utilisant la ip addr
commande peut être vu, docker0 peut penser qu'il s'agit d'une interface de gestion de pont, en Utilisé comme une carte réseau virtuelle sur l'hôte).
Cela peut être dû au fait que mon intranet Tencent Cloud est
172.17.XX.XX
, donc par défaut, docker0 utilise le segment de réseau 18
La topologie du réseau dans un environnement autonome est la suivante:
5.2 Explication détaillée du mode Bridge Network
Docker termine le processus de configuration réseau ci-dessus à peu près comme ceci:
-
Créez une paire de périphériques de paires veth de carte réseau virtuelle sur l'hôte. Les appareils Veth apparaissent toujours par paires, ils forment un canal de données et les données entrent à partir d'un appareil, puis sortent d'un autre appareil . Par conséquent, les périphériques veth sont souvent utilisés pour connecter deux périphériques réseau.
-
Docker place une extrémité du périphérique de paire veth dans le conteneur nouvellement créé et le nomme eth0. L'autre extrémité est placée dans l'hôte, nommée d'après un nom similaire comme veth5f56268, et ce périphérique réseau est ajouté au pont docker0, qui peut être visualisé via la commande brctl show.
[root@VM-0-4-centos ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242652b8c9d no veth5f56268
-
Attribuez une adresse IP au conteneur à partir du sous-réseau docker0 et définissez l'adresse IP de docker0 comme passerelle par défaut du conteneur.
Exécutez le conteneur:
docker run --name=nginx_bridge --net=bridge -p 80:80 -d nginx
Voir le conteneur:
docker ps
docker inspect nginx_bridge
docker network inspect bridge
6. --link
Prenons un scénario où nous avons écrit un microservice. Comment accéder au conteneur par son nom pour éviter l'inaccessibilité du projet en raison du changement de l'adresse IP du conteneur?
Nous pouvons utiliser --link
pour résoudre
docker run -d -P --name tomcat03 --link tomcat02 tomcat
Cependant, cette connexion est unidirectionnelle:
Le vrai développement n'utilisera pas
--link
7. Réseau personnalisé
Il est recommandé d'utiliser un pont personnalisé pour contrôler quels conteneurs peuvent communiquer entre eux, et il peut également résoudre automatiquement les noms de conteneurs en adresses IP via DNS. Docker fournit des pilotes réseau par défaut pour créer ces réseaux. Vous pouvez créer un nouveau réseau Bridge, Overlay ou Macvlan. Vous pouvez également créer un plug-in réseau ou un réseau distant pour une personnalisation et un contrôle complets.
Vous pouvez créer autant de réseaux que vous le souhaitez et vous pouvez connecter des conteneurs à zéro ou plusieurs de ces réseaux à tout moment. En outre, vous pouvez connecter et déconnecter des conteneurs en cours d'exécution sur le réseau sans redémarrer le conteneur. Lorsqu'un conteneur est connecté à plusieurs réseaux, ses connexions externes sont fournies dans l'ordre lexical via le premier réseau non interne.
Un réseau Bridge est le type de réseau le plus couramment utilisé dans Docker. Le réseau ponté est similaire au réseau Bridge par défaut, mais ajoute de nouvelles fonctionnalités et supprime certaines anciennes fonctionnalités. L'exemple suivant crée des réseaux pontés et effectue des expériences sur des conteneurs sur ces réseaux.
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
Notre propre réseau est créé:
docker network inspect mynet
Démarrez le conteneur avec le réseau créé:
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
Visualisez à nouveau le réseau créé:
docker network inspect mynet
À ce stade, les deux conteneurs peuvent recevoir une requête ping
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-01 --net mynet tomcat
Les deux conteneurs peuvent se cingler!
8. Connectivité réseau
Il n'y a pas d'intercommunication entre les conteneurs basés sur docker0 et les conteneurs basés sur mynet, une connectivité réseau est donc requise, ou tomcat par exemple:
docker run -d -P --name tomcat01 tomcat
Connectez maintenant tomcat01 à mynet
docker network connect mynet tomcat01
Maintenant, consultez mynet
docker network inspect mynet
Un conteneur, 2 IP, similaire à un serveur cloud, avec IP publique et IP intranet
À ce stade, vous pouvez à nouveau envoyer un ping
Mais tomcat02 ne peut toujours pas cingler: