docker網路(一)
阿新 • • 發佈:2020-11-30
構建兩個busybox容器
構建兩個busybox容器
docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3000; done" docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3000; done"
然後我們分別執行ip a命令,看看各個容器的網路地址
docker exec -it test1 ip a
可以看到test1的網路地址
1: lo: <LOOPBACK,UP,LOWER_UP> 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 806: eth0@if807: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:12:00:05 brd ff:ff:ff:ff:ff:ff inet 172.18.0.5/16 brd 172.18.255.255 scope global eth0 valid_lft forever preferred_lft forever
看看test2
docker exec -it test2 ip a
可以看到test2的網路地址
1: lo: <LOOPBACK,UP,LOWER_UP> 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 808: eth0@if809: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:12:00:06 brd ff:ff:ff:ff:ff:ff inet 172.18.0.6/16 brd 172.18.255.255 scope global eth0 valid_lft forever preferred_lft forever
我們通過test1 ping test2
docker exec -it test2 ping 172.18.0.5
可以看到ping成功了
64 bytes from 172.18.0.5: seq=0 ttl=64 time=0.092 ms 64 bytes from 172.18.0.5: seq=1 ttl=64 time=0.074 ms 64 bytes from 172.18.0.5: seq=2 ttl=64 time=0.073 ms
linux 構建network namespace聯通
本節在linux系統設定兩個namespace連線,兩個network namespace就好比是docker
這樣方便我們瞭解網路連線的原理
檢視本機net namespace
ip netns list
新增network namespace
sudo ip netns add network1 sudo ip netns add network2
檢視network1 ip link 資訊
sudo ip netns exec network1 ip link
可以看到network1的link資訊
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
設定network1的link資訊
sudo ip netns exec network1 ip link set dev lo up
可以看到lo資訊不再時DOWN,而是UNKNOWN模式了
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
用同樣的方法把network2的名稱空間的模式也開啟
sudo ip netns exec network2 ip link set dev lo up
通過veth技術將兩個network連線起來
sudo ip link add veth-network1 type veth peer name veth-network2
此時執行
sudo ip link
可以看到link資訊新增了兩個veth,接下來將veth-network1介面新增到network1裡
將veth-network2介面新增到network2裡
sudo ip link set veth-network1 netns network1 sudo ip link set veth-network2 netns network2
接下來我們檢視network1的link資訊
sudo ip netns exec network1 ip link
可以看到network1的ip link資訊
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 811: veth-network1@if810: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether ca:dd:69:8a:59:18 brd ff:ff:ff:ff:ff:ff link-netnsid 1
接下來為兩個namespace設定地址
sudo ip netns exec network1 ip addr add 192.168.1.1/24 dev veth-network1 sudo ip netns exec network2 ip addr add 192.168.1.2/24 dev veth-network2
然後將兩個namespace的veth設定啟動
sudo ip netns exec network1 ip link set dev veth-network1 up sudo ip netns exec network2 ip link set dev veth-network2 up
這時候再檢視ip資訊
sudo ip netns exec network1 ip link
可以看到network1的veth埠up
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 811: veth-network1@if810: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether ca:dd:69:8a:59:18 brd ff:ff:ff:ff:ff:ff link-netnsid
然後檢視兩個網路的ip資訊
sudo ip netns exec network1 ip a
可以看到network1的ip資訊
811: veth-network1@if810: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether ca:dd:69:8a:59:18 brd ff:ff:ff:ff:ff:ff link-netnsid 1 inet 192.168.1.1/24 scope global veth-network1 valid_lft forever preferred_lft forever inet6 fe80::c8dd:69ff:fe8a:5918/64 scope link valid_lft forever preferred_lft forever
然後通過network2去ping包給network1
sudo ip netns exec network2 ping 192.168.1.1
可以看到這兩個網路現在互通了。
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.036 ms 64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.024 ms 64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.046 ms
以上就是linux環境下通過network的namespace方式達到網路互聯的。