1. 程式人生 > 實用技巧 >docker網路(一)

docker網路(一)

構建兩個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方式達到網路互聯的。

個人公眾號