Linux的Namespace(命名空间)技术是一种隔离技术,常用的Namespace有user namespace
, process namespace
, network namespace
等
在Docker容器中,不同的容器通过Network namespace
进行了隔离,也就是不同的容器有各自的IP地址
,路由表
等,互不影响。
准备一台Linux机器,用到一个叫 brtcl 的命令,这个命令需要安装,如果是Ubuntu的系统,可以通过 apt-get install bridge-utils
安装;如果是Centos系统,可以通过 sudo yum install bridge-utils
来安装。
我们要搭建一个如上图所示的网络。
# 创建bridge
vagrant@swarm2:~$ sudo brctl addbr mydocker0
# 查看创建的接口
vagrant@swarm2:~$ brctl show
bridge name bridge id STP enabled interfaces
mydocker0 8000.000000000000 no
准备一个脚本文件(add-ns-to-br.sh)
#!/bin/bash # 网桥名称 bridge=$1 # 网络命名空间 namespace=$2 # 网络命名空间对应的IP addr=$3 # 对应图中的veth(1/2) vethA=veth-$namespace # 对应图中的eth(1/2) ethA=eth-$namespace # 添加一个网络命名空间 sudo ip netns add $namespace # 通俗的讲就是把veth和eth建立连接 sudo ip link add $vethA type veth peer name $ethA # 把veth放到网络命名空间里 sudo ip link set $vethA netns $namespace # 给网络命名空间的veth端配置一个IP地址 sudo ip netns exec $namespace ip addr add $addr dev $vethA # 把网络命名空间的veth端启动 sudo ip netns exec $namespace ip link set $vethA up # 把eth端启动 sudo ip link set $ethA up # 把eth端放入bridge里面 sudo brctl addif $bridge $ethA
脚本执行
# 创建如上图所示的网络结构 vagrant@swarm2:~$ sh add-ns-to-br.sh mydocker0 ns1 172.16.1.1/16 vagrant@swarm2:~$ sh add-ns-to-br.sh mydocker0 ns2 172.16.1.2/16 # 把mydocker0这个bridge up起来 vagrant@swarm2:~$ sudo ip link set dev mydocker0 up
验证
vagrant@swarm2:~$ sudo ip netns exec ns1 bash vagrant@swarm2:~$# 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 5: eth00@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether f2:59:19:34:73:70 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.16.1.1/16 scope global eth00 valid_lft forever preferred_lft forever inet6 fe80::f059:19ff:fe34:7370/64 scope link valid_lft forever preferred_lft forever # ns1 和 ns2 通过mydocker0 可以互相通信 vagrant@swarm2:~$# ping 172.16.1.2
- bytes from 172.16.1.2: icmp_seq=1 ttl=64 time=0.029 ms
- bytes from 172.16.1.2: icmp_seq=2 ttl=64 time=0.080 ms
^C
--- 172.16.1.2 ping statistics --- packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.029/0.054/0.080/0.026 ms