Notes d'étude [Docker] (deux)

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
introduction
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 lscommande suivante pour répertorier ces réseaux:

Insérez la description de l'image ici

Docker a créé ces trois réseaux, lorsque vous exécutez le conteneur, vous pouvez utiliser cet –networkindicateur 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=XXXoption que vous spécifiez autrement, le démon Docker par défaut se connectera à ce conteneur réseau.

Insérez la description de l'image ici

Nous utilisons docker runlors de la création d'un conteneur Docker, vous pouvez utiliser --netles 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=hostspécifiée
  • aucun mode: utilisez pour --net=nonespécifier
  • mode pont: utiliser --net=bridgespécifié, les paramètres par défaut
  • mode conteneur: utilisation --net=container:NAME_or_IDspé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 .

Insérez la description de l'image ici

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 addrcommande 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:

Insérez la description de l'image ici

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:

  1. 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.

  2. 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
    
  3. 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
    

    Insérez la description de l'image ici

    docker inspect nginx_bridge
    

    Insérez la description de l'image ici

    docker network inspect bridge
    

    Insérez la description de l'image ici

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?

Insérez la description de l'image ici

Nous pouvons utiliser --linkpour résoudre

docker run -d -P --name tomcat03 --link tomcat02 tomcat

Insérez la description de l'image ici

Cependant, cette connexion est unidirectionnelle:

Insérez la description de l'image ici

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

Insérez la description de l'image ici

Notre propre réseau est créé:

docker network inspect mynet

Insérez la description de l'image ici

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

Insérez la description de l'image ici

À 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

Insérez la description de l'image ici

Un conteneur, 2 IP, similaire à un serveur cloud, avec IP publique et IP intranet

À ce stade, vous pouvez à nouveau envoyer un ping

Insérez la description de l'image ici

Mais tomcat02 ne peut toujours pas cingler:

Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/dreaming_coder/article/details/113881431
conseillé
Classement