网络命名空间
原创大约 3 分钟
Linux的Namespace(命名空间)
技术是一种隔离技术,常用的Namespace
有User Namespace
,Process Namespace
,Network Namespace
等。
在Docker容器中,不同的容器通过Network Namespace
进行了隔离,也就是不同的容器有各自的IP
地址,路由表等,互不影响。

首先创建一个bridge
。
> brctl addbr mydocker0
> brctl show
准备一个shell
脚本。
> touch add-ns-to-br.sh
> vi add-ns-to-br.sh
保存下面的内容。
#!/bin/bash
# 定义了三个变量,第一个位置是使用的bridge,第二个位置是命名空间,第三个位置是IP地址
bridge=$1
namespace=$2
addr=$3
定义两个网络接口实现。
vethA=veth-$namespace
vethB=eth00-$namespace
sudo ip netns add $namespace
添加一个连接$vethA
和$vethB
的link
。
sudo ip link add $vethA type veth peer name $vethB
sudo ip link set $vethB netns $namespace
给$vethB
配置一个IP
地址。
sudo ip netns exec $namespace ip addr add $addr dev $vethB
先启动$vethB
。
sudo ip netns exec $namespace ip link set $vethB up
再启动$vethA
。
sudo ip link set $vethA up
sudo brctl addif $bridge $vethA
然后执行下面的脚本。
> sh add-ns-to-br.sh mydocker0 ns1 172.16.1.1/16
> sh add-ns-to-br.sh mydocker0 ns2 172.16.1.2/16
查看已有的命名空间。
> ip netns ls
执行命令,查看mydocker0上挂载的实现。
> brctl show
bridge name bridge id STP enabled interfaces
......
mydocker0 8000.a2718354cda9 no veth-ns1
veth-ns2
......
然后把mydocker0
这个bridge
启动起来。
> ip link set dev mydocker0 up
进入到ns1
的命名空间中打印出它的IP
信息。
> ip netns exec ns1 base
> ip a
或者直接用打印出它的IP
信息。
> ip netns exec ns1 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
381: eth00-ns1@if382: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 6a:fb:57:74:df:90 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.16.1.1/16 scope global eth00-ns1
valid_lft forever preferred_lft forever
inet6 fe80::68fb:57ff:fe74:df90/64 scope link
valid_lft forever preferred_lft forever
执行ping
命令。
> ping 172.16.1.2
PING 172.16.1.2 (172.16.1.2) 56(84) bytes of data.
64 bytes from 172.16.1.2: icmp_seq=1 ttl=64 time=0.105 ms
64 bytes from 172.16.1.2: icmp_seq=2 ttl=64 time=0.052 ms
^C
在ns1
的命名空间中ping 172.17.0.1
会发现网络不可达。
> ip netns exec ns1 base
> ping 172.17.0.1
connect: 网络不可达
但退出之后就可以ping
通。
> exit
> ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.052 ms
64 bytes from 172.17.0.1: icmp_seq=2 ttl=64 time=0.049 ms
^C
再来观察宿主机的ip
信息,会发现多了mydocker0
、veth-ns1
和veth-ns2
。
......
380: mydocker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether a2:71:83:54:cd:a9 brd ff:ff:ff:ff:ff:ff
inet6 fe80::a071:83ff:fe54:cda9/64 scope link
valid_lft forever preferred_lft forever
382: veth-ns1@if381: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master mydocker0 state UP group default qlen 1000
link/ether da:20:aa:8a:65:7c brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::d820:aaff:fe8a:657c/64 scope link
valid_lft forever preferred_lft forever
384: veth-ns2@if383: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master mydocker0 state UP group default qlen 1000
link/ether a2:71:83:54:cd:a9 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::a071:83ff:fe54:cda9/64 scope link
valid_lft forever preferred_lft forever
通过网络命名空间,就可以看出容器之间的通信机制是怎样的。
感谢支持
更多内容,请移步《超级个体》。