[Docker 네트워크 원리 분석4] 서로 다른 네트워크 속의 용기는 어떻게 통신하는가
7219 단어 CloudComputingNetworking
사용자 정의 네트워크 네트워크 네트워크 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
IBM Cloud 개발 환경을 정돈하는 그 1IBM Cloud 개발 환경을 정돈하는 그 1 Cloud 개발을 시작하기 전에 로컬 개발 환경을 구축하는 것이 매우 중요합니다. IBM Cloud 라이트 계정은 무료, 했다. 그리고 개발에서 중요한 IDE(통합 개발...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.