Docker之網絡命名空間

一.測試兩個容器是否互通

1.先運行兩個容器 test1 與test2
docker run -d  --name test1 busybox /bin/sh -c "while true; do sleep 3600; done"

docker run -d  --name test2 busybox /bin/sh -c "while true; do sleep 3600; done"

生成兩個容器test1和test2,分別進入容器test1和test2,查看他們的ip地址

docker exec test1 ip a
docker exec test2 ip a

得到test1和test2的ip分別爲172.17.0.2和172.17.0.3

我們在test1容器中執行

docker exec test1 ping 172.17.0.2

結果顯示兩個容器是可以互相通信的,

底層原理

通過下面這個圖簡單的理解一下:

image
簡單來說,容器1中的網絡命名空間(namespace1)和容器2中的網絡命名空間(namespace2)通過一對叫做veth的東西(可以理解成接口)進行通信。

二.ip netns相關命令

1. 顯示所有的虛擬網絡命名空間

sudo ip netns list

也可通過查看/var/run/netns目錄下的文件來list

ls /var/run/netns/

2. 增加虛擬網絡命名空間test1

sudo ip netns add test1

3. 刪除虛擬網絡命名空間test1

sudo ip netns delete test1

4.進入虛擬機網絡環境

ip netns exec net0 command


打開虛擬網絡環境net0的bash窗口

ip netns exec net0 bash

顯示所有虛擬網絡環境的設備

ip addr

退出該網絡虛擬環境

exit

5. 增加一對veth虛擬網卡

ip link add type veth

6. 將veth0添加到net0虛擬網絡環境

ip link set veth0 netns net0

7.將虛擬網卡veth1改名並添加到net1虛擬網絡環境中

ip link set dev veth1 name net1-bridge netns net1

8. 設置虛擬網絡環境net0的veth0設備處於激活狀態

ip netns exec net0 ip link set veth0 up

9. 爲虛擬網絡環境net0的veth0設備增加IP地址

ip netns exec net0 ip address add 10.0.1.1/24 dev veth0

三.實例(建立兩個命名空間,並實現互相ping通)

1.先建立兩個虛擬空間namespace,分別爲test3和test4
sudo ip netns add test3
sudo ip netns add test4

查看當前虛擬網絡空間

[root@localhost ~]# ip netns list
test4
test3
2.建立一對veth,分別命名爲veth-test3 和veth-test4
sudo ip link add veth-test3 type veth peer name veth-test4

此時我們使用ip link命令查看一下當前宿主機中的信息:

[root@localhost ~]# 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
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:88:4d:9e brd ff:ff:ff:ff:ff:ff
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
    link/ether 52:54:00:fb:1c:42 brd ff:ff:ff:ff:ff:ff
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN mode DEFAULT group default qlen 1000
    link/ether 52:54:00:fb:1c:42 brd ff:ff:ff:ff:ff:ff
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
    link/ether 02:42:eb:92:75:9a brd ff:ff:ff:ff:ff:ff
8: veth-test4@veth-test3: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether b2:05:0d:4e:a9:e4 brd ff:ff:ff:ff:ff:ff
9: veth-test3@veth-test4: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether e6:d8:aa:4d:67:6d brd ff:ff:ff:ff:ff:ff

可以看到,我們已經成功的創建了一對veth,veth-test4@veth-test3與veth-test3@veth-test4

3.將創建的veth分別添加到命名空間test3和test4

添加到test3與test4

sudo ip link set veth-test3 netns test3
sudo ip link set veth-test4 netns test4

在test3查看是否已經添加veth,在test3執行ip link,

[root@localhost ~]# sudo ip netns exec test3 ip 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
9: veth-test3@if8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether e6:d8:aa:4d:67:6d brd ff:ff:ff:ff:ff:ff link-netnsid 1

在test4查看是否已經添加veth,在test4執行ip link,

[root@localhost ~]# sudo ip netns exec test4 ip 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
8: veth-test4@if9: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether b2:05:0d:4e:a9:e4 brd ff:ff:ff:ff:ff:ff link-netnsid 0

此時創建的veth已經成功添加到了兩個命名空間中。此時還需要最後兩個步驟,一個就是給veth添加ip,另個就是讓其狀態置爲UP

4.爲veth添加ip地址
[root@localhost ~]# sudo ip netns exec test3 ip addr add 192.168.1.3/24 dev veth-test3
[root@localhost ~]# sudo ip netns exec test4 ip addr add 192.168.1.4/24 dev veth-test4

再次查看test3與test4的ip link狀態

[root@localhost ~]# sudo ip netns exec test3 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
9: veth-test3@if8: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
    link/ether e6:d8:aa:4d:67:6d brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet 192.168.1.3/24 scope global veth-test3
       valid_lft forever preferred_lft forever
       
[root@localhost ~]#  sudo ip netns exec test4 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
8: veth-test4@if9: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether b2:05:0d:4e:a9:e4 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.1.4/24 scope global veth-test4
       valid_lft forever preferred_lft forever

發現ip地址已分別爲其設置上

4.將test3與test4狀態設置爲UP
sudo ip netns exec test3 ip link set dev veth-test3 up
 sudo ip netns exec test3 ip link set dev veth-test4 up
5.測試兩個命名空間是否已經可以ping通
 sudo ip netns exec test3 ping 192.168.1.4

結果,連接成功

[root@localhost ~]# sudo ip netns exec test3 ping 192.168.1.4
PING 192.168.1.4 (192.168.1.4) 56(84) bytes of data.
64 bytes from 192.168.1.4: icmp_seq=1 ttl=64 time=0.232 ms
64 bytes from 192.168.1.4: icmp_seq=2 ttl=64 time=0.183 ms
64 bytes from 192.168.1.4: icmp_seq=3 ttl=64 time=0.149 ms 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章