Notes sur les connaissances de base de Docker (4) – liées au réseau

Table des matières

1. Le mode réseau de docker

Docker fournit quatre modes réseau par défaut

Mode pont 1.1

1.2 Mode hôte

1.3 mode conteneur

 1.4 aucun mode

 Deux, exemple simple Tomcat

3. Interconnexion entre conteneurs

Utilisez --link (obsolète)

Commande de réseau docker réseau personnalisé


1. Le mode réseau de docker

# 使用以下命令查看所有的Docker网络:
➜  ~ docker network ls
NETWORK ID          NAME                                 DRIVER              SCOPE
b2c8f825ca64        bridge                               bridge              local
4b6ca6c1af1f        docker_standalone-fate-130_default   bridge              local
75c6b565c73c        host                                 host                local
0196d25ee724        none                                 null                local

Docker fournit quatre modes réseau par défaut

pont : le réseau par défaut du conteneur est le mode pont (le réseau construit par soi-même utilise également le mode pont par défaut, et le conteneur démarre le conteneur par défaut utilise également le mode pont). Ce mode allouera et définira une adresse 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 : aucune configuration réseau, le conteneur a un espace de noms réseau indépendant, mais aucun paramètre réseau n'a été défini pour lui, comme l'attribution d'une paire veth et d'une connexion de pont, la configuration IP, etc.

hôte : le conteneur et l'hôte partagent l'espace de noms réseau. Le conteneur ne virtualisera pas sa propre carte réseau, ne configurera pas sa propre IP, etc., mais utilisera l'IP et le port de l'hôte.

conteneur : le conteneur créé ne créera pas sa propre carte réseau et configurera sa propre connexion réseau de conteneur IP. Un conteneur partage un espace de noms réseau (adresse IP partagée, plage de ports) avec un autre conteneur.

Le conteneur utilise le mode réseau pont par défaut

Utilisez l'option docker run --network= pour spécifier le réseau utilisé par le conteneur :

Mode pont : utilisez --net=bridge pour spécifier le paramètre par défaut.

Mode hôte : utilisez --net=host pour spécifier.
mode none : utilisez --net=none pour spécifier.
mode conteneur : utilisez --net=container:NAME_or_ID pour spécifier.


Mode pont 1.1

Lorsque le processus Docker démarre, un pont de réseau 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 mode de fonctionnement du pont virtuel est similaire à celui d'un commutateur physique, de sorte que tous les conteneurs sur l'hôte sont connectés à un réseau de couche 2 via le commutateur.

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. Créez une paire de périphériques de paire veth de carte réseau virtuelle sur l'hôte. Docker place une extrémité du périphérique de paire veth dans le conteneur nouvellement créé et le nomme eth0 (la carte réseau du conteneur), et place l'autre extrémité dans l'hôte avec un nom similaire à vethxxx. Nommez-le et ajoutez ce périphérique réseau au pont docker0. Il peut être visualisé via la commande brctl show.

Lors de l'utilisation de docker run -p, docker établit en fait des règles DNAT dans iptables pour implémenter la redirection de port. Vous pouvez utiliser iptables -t nat -vnL pour afficher. Le mode pont est illustré dans la figure ci-dessous :

Le processus permettant au conteneur Docker de terminer la configuration du pont réseau est le suivant :

1. Créez une paire de périphériques de carte réseau virtuelle veth pair sur l'hôte. Les appareils Veth apparaissent toujours par paires. Ils forment un canal de données. Les données entrant d'un appareil sortiront 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 veth pair dans le conteneur nouvellement créé et le nomme eth0. L'autre extrémité est placée dans l'hôte, nommé avec un nom similaire à veth65f9, et ce périphérique réseau est ajouté au pont docker0.
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.

1.2 Mode hôte

Partagez 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 IP, etc., mais utilisera l'IP et le port de l'hôte. Cependant, 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.

Le conteneur utilisant le mode hôte peut utiliser directement l'adresse IP de l'hôte pour communiquer avec le monde extérieur, et le port de service à l'intérieur du conteneur peut également utiliser le port de l'hôte sans NAT.Le plus grand avantage de l'hôte est que le réseau les performances sont meilleures, mais l' hôte docker a Le port utilisé ne peut plus être utilisé, et l'isolation du réseau n'est pas bonne. Le diagramme de modèle du mode Host, comme illustré dans la figure suivante :

 eth0 est l'hôte 10.126.130.4 est l'adresse intranet de l'hôte.

1.3 mode conteneur

Le conteneur partage un espace de noms réseau avec un conteneur existant , et non 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 dispositif de carte réseau lo. Le diagramme schématique du modèle en mode Conteneur est le suivant :

 1.4 aucun mode

Le conteneur a son propre espace de noms de réseau, cependant, aucune configuration réseau n'est effectuée pour le conteneur Docker. En d'autres termes, ce conteneur Docker ne contient pas de carte réseau, d'adresse IP, de routage et d'autres informations. Nous devons ajouter une carte réseau, configurer l'IP, etc. pour le conteneur Docker par nous-mêmes.

Dans ce mode réseau, le conteneur n'a que le réseau de bouclage lo et aucune autre carte réseau. Ce type de réseau ne peut pas être connecté à Internet, et un réseau fermé peut bien garantir la sécurité du conteneur .

 Deux, exemple simple Tomcat

1. Démarrez le conteneur Tomcat

        docker run -d -P --name tomcat01 tomcat:8.0

2. Afficher le réseau hôte, nouveau réseau de conteneurs Tomcat

 Héberger:

 matou:

3. Testez s'il est connecté

?  ~ ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.108 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.085 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.054 ms
64 bytes from 172.17.0.3: icmp_seq=4 ttl=64 time=0.054 ms
^Z

 4. Démarrez un autre conteneur Tomcat pour tester s'il est connecté

# 启动
➜  ~ docker run -d -P --name tomcat2 tomcat:8.0
7d1164d71e4e1daa2bd82ea746d041d3f5fd178ab504d3bf6cd2f26aea5c4e8f

#查看地址
➜  ~ docker exec -it tomcat2 ip addr           
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
59: eth0@if60: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

# ping另外一个tomcat
➜  ~ docker exec -it tomcat2 ping 172.17.0.3   
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.208 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.128 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.071 ms
^Z64 bytes from 172.17.0.3: icmp_seq=4 ttl=64 time=0.068 ms
64 bytes from 172.17.0.3: icmp_seq=5 ttl=64 time=0.092 ms
^Z64 bytes from 172.17.0.3: icmp_seq=6 ttl=64 time=0.065 ms
64 bytes from 172.17.0.3: icmp_seq=7 ttl=64 time=0.118 ms
64 bytes from 172.17.0.3: icmp_seq=8 ttl=64 time=0.102 ms
^X^C
--- 172.17.0.3 ping statistics ---

Communication réseau entre deux Tomcats 

 Tous les conteneurs qui ne spécifient pas de réseau sont acheminés par docker0, et Docker attribuera une adresse IP aléatoire disponible à notre conteneur par défaut.

3. Interconnexion entre conteneurs

L'adresse IP correspondant au microservice peut changer pendant le déploiement en ligne, vous devez donc utiliser le nom du conteneur pour configurer la connexion réseau entre les conteneurs.

Utilisez --link (obsolète)

1. Tester sans régler la connexion

➜  ~ docker exec -it tomcat2 ping tomcat1   
ping: unknown host tomcat1

2. Démarrer un autre tomcat

# 启动
➜  ~ docker run -d -P --name tomcat3 --link tomcat2 tomcat:8.0
151f95d9611d8d560cc0cc3c5afe466d18d096de76c73c7b48b27ffef6be8241

# tomcat2 ping tomcat3 ping 不通
➜  ~ docker exec -it tomcat2 ping tomcat3                     
ping: unknown host tomcat3

# tomcat3 可以ping通 tomcat2
➜  ~ docker exec -it tomcat3 ping tomcat2
PING tomcat2 (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat2 (172.17.0.2): icmp_seq=1 ttl=64 time=0.209 ms
64 bytes from tomcat2 (172.17.0.2): icmp_seq=2 ttl=64 time=0.105 ms
64 bytes from tomcat2 (172.17.0.2): icmp_seq=3 ttl=64 time=0.121 ms
64 bytes from tomcat2 (172.17.0.2): icmp_seq=4 ttl=64 time=0.066 ms

La raison pour laquelle le ping inversé échoue est  --linkque le principe est d'ajouter un mappage entre le nom du conteneur et l'adresse IP dans le fichier /etc/hosts sur le conteneur en cours d'exécution spécifié

Commande de réseau docker réseau personnalisé

1. Utilisation des commandes de base

# 全部网络查看
➜  ~ docker network ls
NETWORK ID          NAME                                 DRIVER              SCOPE
b2c8f825ca64        bridge                               bridge              local
4b6ca6c1af1f        docker_standalone-fate-130_default   bridge              local
75c6b565c73c        host                                 host                local
0196d25ee724        none                                 null                local

# 新建mynet
➜  ~ docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
9329391ab863d34b82d2adbd6d31744ba088ab735f3902471efe019c57ec3dea
➜  ~ docker network ls
NETWORK ID          NAME                                 DRIVER              SCOPE
b2c8f825ca64        bridge                               bridge              local
4b6ca6c1af1f        docker_standalone-fate-130_default   bridge              local
75c6b565c73c        host                                 host                local
9329391ab863        mynet                                bridge              local

# 参数说明
 # driver bridge             #指定bridge驱动程序来管理网络
 # subnet 192.168.0.0/16     #指定网段的CIDR格式的子网
 # gateway 192.168.0.1 	     #指定主子网的IPv4或IPv6网关

2. Démarrez deux conteneurs et utilisez le réseau mynet

➜  ~ docker run -d -P --name tomcat-net1 --net mynet tomcat:8.0 
92b5bb032f1dad64e9672e04fcfd68f5bbb3b36c738c8bccb305f8be4a731fe6
➜  ~ docker run -d -P --name tomcat-net2 --net mynet tomcat:8.0  
e90148594ae1f6c47312e1dfd496c2113bd9e4c5188078bf7f2e9a70dd6c9e70
➜  ~ docker network inspect mynet
[
    {
       
        ......
        "Containers": {
            "92b5bb032f1dad64e9672e04fcfd68f5bbb3b36c738c8bccb305f8be4a731fe6": {
                "Name": "tomcat-net1",
                "EndpointID": "9e11300fa301516190c8c5c67e6b7c8a8f3a28226e222b205b676df1858db9d9",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "e90148594ae1f6c47312e1dfd496c2113bd9e4c5188078bf7f2e9a70dd6c9e70": {
                "Name": "tomcat-net2",
                "EndpointID": "c2ad04bd23e6b13e670d86e1cdd57ef227ef8350a81dada533030622dfb3cf3a",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            }
        },
    }
]

3. Vérifiez le réseau interne et testez s'il est interopérable

➜  ~ docker exec -it tomcat-net2 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
70: eth0@if71: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c0:a8:00:03 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.3/16 brd 192.168.255.255 scope global eth0
       valid_lft forever preferred_lft forever

➜  ~ docker exec -it tomcat-net2 ping tomcat-net1
PING tomcat-net1 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net1.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.106 ms
64 bytes from tomcat-net1.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.109 ms
64 bytes from tomcat-net1.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.318 ms
^C
--- tomcat-net1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.106/0.177/0.318/0.100 ms

➜  ~ docker exec -it tomcat-net1 ping tomcat-net2
PING tomcat-net2 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net2.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.389 ms
64 bytes from tomcat-net2.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.120 ms
^C
--- tomcat-net2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.120/0.254/0.389/0.135 ms

4. Testez si le tomcat1 précédent peut cingler le tomcat sous tomcat-net 

# 查看一下tomcat1 中的ip地址
➜  ~ docker exec -it tomcat1 ip addr          
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
72: eth0@if73: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

# ping 名字
➜  ~ docker exec -it tomcat1 ping tomcat-net1
ping: unknown host tomcat-net1
# ping 地址
➜  ~ docker exec -it tomcat1 ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
^C
--- 192.168.0.2 ping statistics ---
11 packets transmitted, 0 received, 100% packet loss, time 10001ms

Conclusion : le ping échoue, pas un segment de réseau.

Solution : si les conteneurs entre différents réseaux Docker doivent être connectés, vous devez enregistrer une adresse IP du conteneur en tant qu'appelant du réseau où se trouve l'appelé, et utiliser docker connectla commande

5. Utilisez tomcat1 et tomcat-net pour communiquer entre eux

#进行连接网络mynet
➜  ~ docker network connect mynet tomcat1  

#查看tomcat网络,新增一个网络地址192.168.0.4
➜  ~ docker exec -it tomcat1 ip addr         
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
72: eth0@if73: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
76: eth1@if77: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c0:a8:00:04 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.4/16 brd 192.168.255.255 scope global eth1
       valid_lft forever preferred_lft forever

# ping通
➜  ~ docker exec -it tomcat1 ping tomcat-net1
PING tomcat-net1 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net1.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.337 ms
64 bytes from tomcat-net1.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.111 ms
64 bytes from tomcat-net1.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.100 ms
^C
--- tomcat-net1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.100/0.182/0.337/0.110 ms

Source de référence : https://blog.csdn.net/huangjhai/article/details/120425457

Je suppose que tu aimes

Origine blog.csdn.net/qq_38295645/article/details/124160916
conseillé
Classement