网络命名空间
原创大约 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通过网络命名空间,就可以看出容器之间的通信机制是怎样的。
感谢支持
更多内容,请移步《超级个体》。
