[Docker 네트워크 원리 분석4] 서로 다른 네트워크 속의 용기는 어떻게 통신하는가

우리는 두 개의 용기 네트워크,network1과network2를 사용자 정의하는데 어떻게 두 개의 네트워크에서 용기 통신을 실현합니까?
사용자 정의 네트워크 네트워크 네트워크 1 (172.19.1.0/24) 및 네트워크 2 (172.19.2.0/24)
[root@localhost ~]# docker network create network1 --subnet   172.19.1.0/24
ec6f94effcea558ade7634b90ce9b015952827e968007a660993ba7d86b7cdf4
[root@localhost ~]# docker network create network2 --subnet   172.19.2.0/24
9feb392b7cd01d43ff47fb96e1549aeda7c5a590214585ec8e6c6179e3434bc8
[root@localhost ~]# docker network list
NETWORK ID          NAME                DRIVER              SCOPE
96acf619479a        bridge              bridge              local
b4a586d8b755        host                host                local
ec6f94effcea        network1            bridge              local
9feb392b7cd0        network2            bridge              local
d66905d1ffee        none                null                local

두 네트워크에서 각각 두 개의 용기를 생성하다
[root@localhost ~]# docker run -itd --network network1 --name box1-1 busybox
[root@localhost ~]# docker run -itd --network network1 --name box1-2 busybox
[root@localhost ~]# docker run -itd --network network2 --name box2-1 busybox
[root@localhost ~]# docker run -itd --network network2 --name box2-2 busybox

같은 네트워크에서 용기는 정상적으로 통신할 수 있고 한 네트워크에서 용기가 없으면 통신할 수 없다.어떻게 그들이 통신할 수 있는 것을 실현합니까?
방법1: 용기를 다른 네트워크에 넣는다
문제가 바뀌면 정상적인 상황에서 한 네트워크에 있지 않은 물리기는 어떻게 통신합니까?어떻게 물리적 조건이 허용되는지 우리는 한 물리기를 다른 물리기의 네트워크에 가입할 수 있다. 이렇게 하면 두 물리기의 통신을 실현할 수 있다. 전제는 물리적으로 도달할 수 있고 물리기에 여러 개의 네트워크 카드가 있어서 용기에 대응할 수 있다. 우리는 용기를 다른 네트워크에 가입할 수 있다. 이렇게 하면 용기와 다른 네트워크에서 용기 통신을 실현할 수 있다.
# box1-1   network2 
[root@localhost ~]# docker network connect  network2 box1-1
#  box1-1       
[root@localhost ~]# docker exec -it  box1-1  sh
/ # ip addr
1: lo:  mtu 65536 qdisc noqueue 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
17: eth0@if18:  mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:13:01:02 brd ff:ff:ff:ff:ff:ff
    inet 172.19.1.2/24 brd 172.19.1.255 scope global eth0
       valid_lft forever preferred_lft forever
25: eth1@if26:  mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:13:02:04 brd ff:ff:ff:ff:ff:ff
    inet 172.19.2.4/24 brd 172.19.2.255 scope global eth1
       valid_lft forever preferred_lft forever
#  
/ # ping  -c 2 172.19.2.3
PING 172.19.2.3 (172.19.2.3): 56 data bytes
64 bytes from 172.19.2.3: seq=0 ttl=64 time=0.851 ms
64 bytes from 172.19.2.3: seq=1 ttl=64 time=0.104 ms

--- 172.19.2.3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.104/0.477/0.851 ms
/ # ping  -c 2 172.19.1.3
PING 172.19.1.3 (172.19.1.3): 56 data bytes
64 bytes from 172.19.1.3: seq=0 ttl=64 time=0.935 ms
64 bytes from 172.19.1.3: seq=1 ttl=64 time=0.087 ms

--- 172.19.1.3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.087/0.511/0.935 ms

용기에 들어가면 박스 1-1에 새로운veth-pair 장치가 추가된 것을 볼 수 있습니다.이전의 글에서 알 수 있듯이veth-pair의 한쪽은box-1-1의 명명 공간에 넣고, 한쪽은 가입할 네트워크의 브리지에 의존한다.넷스에 넣은 한쪽에 네트워크 주소를 추가합니다.
다음에, 우리는 수동으로 box1-2를network2에 추가하고, 먼저 docker가 숨긴 box1-2의netns를 복원합니다.
#    box1-2    
[root@localhost ~]# docker inspect box1-2 |grep Pid
            "Pid": 7629,
#                (   /var/run/netns   )
ln -s /proc/     /ns/net /var/run/netns/  
[root@localhost ~]# ln -s /proc/7629/ns/net   /var/run/netns/box1-2
#     netns
[root@localhost ~]# ip netns list
box1-2 (id: 2)

veth-pair 증가 및 네트워크 설정
#  veth-pari   
ip link add veth_b_1_2 type veth name peer veth_b_1_2_peer
#     box1-2 netns 
ip link set veth_b_1_2 ns box1-2
#  IP  
ip netns exec box1-2 ip addr add 172.17.2.5/24 dev veth_b_1_2
ip netns exec box1-2 ip link set veth_b_1_2  up
#            
#         
ip addr
#     
.......
8: br-9feb392b7cd0:  mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:0c:c1:a6:7a brd ff:ff:ff:ff:ff:ff
    inet 172.19.2.1/24 brd 172.19.2.255 scope global br-9feb392b7cd0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:cff:fec1:a67a/64 scope link 
       valid_lft forever preferred_lft forever
.....
ip link set dev veth_b_1_2_peer master br-9feb392b7cd0
ip link set veth_b_1_2_peer  up

확인
[root@localhost ~]#  ip netns exec box1-2  ping -c 2 172.19.2.2
PING 172.19.2.2 (172.19.2.2) 56(84) bytes of data.
64 bytes from 172.19.2.2: icmp_seq=1 ttl=64 time=0.233 ms
64 bytes from 172.19.2.2: icmp_seq=2 ttl=64 time=0.064 ms

--- 172.19.2.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.064/0.148/0.233/0.085 ms
[root@localhost ~]# docker exec -it box1-2 sh
/ # ip addr
1: lo:  mtu 65536 qdisc noqueue 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
19: eth0@if20:  mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:13:01:03 brd ff:ff:ff:ff:ff:ff
    inet 172.19.1.3/24 brd 172.19.1.255 scope global eth0
       valid_lft forever preferred_lft forever
28: veth_b_1_2@if27:  mtu 1500 qdisc noqueue qlen 1000
    link/ether 9e:7b:c9:91:7f:b2 brd ff:ff:ff:ff:ff:ff
    inet 172.19.2.5/24 scope global veth_b_1_2
       valid_lft forever preferred_lft forever

방법2: 통신이 필요한 용기를 제3자 네트워크에 넣는다
만약 두 용기가 통신을 원한다면 두 용기를 제3자 네트워크에 넣으면 두 용기가 통신을 할 수 있다. 구체적인 사고방식은 세 번째 네트워크를 만들고 docker connect 명령을 사용하여 통신이 필요한 두 용기를 이 네트워크에 넣어 통신을 실현하는 것이다. 만약에 두 용기가 통신하지 않으려면 docker disconnect를 통해 삭제한다.밑바닥의 원리와 위의 방법이 유사하면 분석을 전개하지 않겠다.
방법3: 밑바닥의 IPtables 규칙을 수정하여 두 개의 네트워크 통신을 실현한다.
방법 1과 방법 2는 용기를 네트워크에 넣고 통신하고 싶은 용기를 네트워크에 넣는 것이다.용기 네트워크 원리 분석1에서 알 수 있듯이 정상적인 상황에서 ns를 만들고 네트워크와 루트를 설정하면 같은 숙박 호스트의 서로 다른bridge와 통신할 수 있다.왜 용기의 두 네트워크 사이에는 통신이 불가능합니까?용기 네트워크 원리 분석 기초편에서 IPtables 규칙이 가로막았다는 것을 알게 되었다.
1. 먼저 네트워크의 브리지 인터페이스 이름을 찾습니다.
[root@localhost ~]# ip addr
........
7: br-ec6f94effcea:  mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:be:93:94:2f brd ff:ff:ff:ff:ff:ff
    inet 172.19.1.1/24 brd 172.19.1.255 scope global br-ec6f94effcea
       valid_lft forever preferred_lft forever
    inet6 fe80::42:beff:fe93:942f/64 scope link 
       valid_lft forever preferred_lft forever
8: br-9feb392b7cd0:  mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:0c:c1:a6:7a brd ff:ff:ff:ff:ff:ff
    inet 172.19.2.1/24 brd 172.19.2.255 scope global br-9feb392b7cd0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:cff:fec1:a67a/64 scope link 
       valid_lft forever preferred_lft forever
........

2. iptables 규칙을 수정하여 두 개의 서브넷 통신을 실현한다
[root@localhost ~]# iptables -I DOCKER-USER -i br-ec6f94effcea -o br-9feb392b7cd0 -j ACCEPT
[root@localhost ~]# iptables -I DOCKER-USER -i br-9feb392b7cd0 -o br-ec6f94effcea -j ACCEPT

좋은 웹페이지 즐겨찾기