构建两个busybox容器
构建两个busybox容器
1 | docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3000; done" |
然后我们分别执行ip a命令,看看各个容器的网络地址
1 | docker exec -it test1 ip a |
可以看到test1的网络地址
1 | 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 |
看看test2
1 | docker exec -it test2 ip a |
可以看到test2的网络地址
1 | 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 |
我们通过test1 ping test2
1 | docker exec -it test2 ping 172.18.0.5 |
可以看到ping成功了
1 | 64 bytes from 172.18.0.5: seq=0 ttl=64 time=0.092 ms |
linux 构建network namespace联通
本节在linux系统设置两个namespace连接,两个network namespace就好比是docker
这样方便我们了解网络连接的原理
查看本机net namespace
1 | ip netns list |
添加network namespace
1 | sudo ip netns add network1 |
查看network1 ip link 信息
1 | sudo ip netns exec network1 ip link |
可以看到network1的link信息
1 | 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000 |
设置network1的link信息
1 | sudo ip netns exec network1 ip link set dev lo up |
可以看到lo信息不再时DOWN,而是UNKNOWN模式了
1 | 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 |
用同样的方法把network2的命名空间的模式也打开
1 | sudo ip netns exec network1 ip link set dev lo up |
通过veth技术将两个network连接起来
1 | sudo ip link add veth-network1 type veth peer name veth-network2 |
此时执行
1 | sudo ip link |
可以看到link信息新增了两个veth,接下来将veth-network1接口添加到network1里
将veth-network2接口添加到network2里
1 | sudo ip link set veth-network1 netns network1 |
接下来我们查看network1的link信息
1 | sudo ip netns exec network1 ip link |
可以看到network1的ip link信息
1 | 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 |
接下来为两个namespace设置地址
1 | sudo ip netns exec network1 ip addr add 192.168.1.1/24 dev veth-network1 |
然后将两个namespace的veth设置启动
1 | sudo ip netns exec network1 ip link set dev veth-network1 up |
这时候再查看ip信息
1 | sudo ip netns exec network1 ip link |
可以看到network1的veth端口up
1 | 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 |
然后查看两个网络的ip信息
1 | sudo ip netns exec network1 ip a |
可以看到network1的ip信息
1 | 811: veth-network1@if810: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 |
然后通过network2去ping包给network1
1 | sudo ip netns exec network2 ping 192.168.1.1 |
可以看到这两个网络现在互通了。
1 | 64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.036 ms |
以上就是linux环境下通过network的namespace方式达到网络互联的。