docker 网络命名空间如何连通?

2020/11/14 11:46
阅读数 18

一、busybox介绍

busybox是一个集成了一百多个最常用linux命令和工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小.我们平时用的那些linux命令就好比是分立式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式linux应用中,busybox有非常广的应用。

[root@iZ2vceej7yes1abpm7yec2Z ~]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
python                      3.6                 1297140c6dd2        9 days ago          874MB
ubuntu                      latest              d70eaf7277ea        2 weeks ago         72.9MB
busybox                     latest              f0b02e9d092d        4 weeks ago         1.23MB

看到了吧,busybox 这个images只有1.23MB, 这一般用于嵌入式linux系统。

详情参考:https://www.ibm.com/developerworks/cn/linux/l-busybox/index.html

二、运行两个busybox contain,尝试互ping 和 telnet

在busybox的sh下运行一个sleep脚本

1、busybox test1

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

2、busybox test2

~]# docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600; done"
~]# docker container  ls -a
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                       PORTS                    NAMES
51ea3cd11968        busybox                        "/bin/sh -c 'while t…"   5 seconds ago       Up 5 seconds                                          test2
4209ba002f3d        busybox                        "/bin/sh -c 'while t…"   3 minutes ago       Up 3 minutes                                          gallant_ramanujan

在container test2中ping 另外一个container

docker exec 在运行中的container中查询ip

 ~]# docker exec  51ea ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
144: eth0@if145: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@iZ2vceej7yes1abpm7yec2Z ~]# 
[root@iZ2vceej7yes1abpm7yec2Z ~]# docker exec  420 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
142: eth0@if143: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

两个容器相互ping,可以ping通

 ~]# docker exec 51e ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.093 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.065 ms
64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.070 ms
^C
[root@iZ2vceej7yes1abpm7yec2Z ~]# 
[root@iZ2vceej7yes1abpm7yec2Z ~]# docker exec 420 ping 172.17.0.4
PING 172.17.0.4 (172.17.0.4): 56 data bytes
64 bytes from 172.17.0.4: seq=0 ttl=64 time=0.083 ms
64 bytes from 172.17.0.4: seq=1 ttl=64 time=0.071 ms
64 bytes from 172.17.0.4: seq=2 ttl=64 time=0.068 ms

这是如何实现的呢?

三、networknamespace的实现原理

3.1 如何创建和销毁linux 的netns?

~]# ip netns add net1
[root@iZ2vceej7yes1abpm7yec2Z ~]# ip netns add net2
[root@iZ2vceej7yes1abpm7yec2Z ~]# 
[root@iZ2vceej7yes1abpm7yec2Z ~]# ip netns list
net2
net1

3.2 如何在linux中查看netns的ip?

上面创建的这两个容器都有自己的netns,通过docker exec查看ip和端口。linux中也有同样的命令。

 ~]# ip netns exec net1 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

执行ip link

 ~]# ip netns exec net1 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

只有一个link,是本地回环口。

稍后会绑定一个link 和另外一个netns互通。

启动l0端口

~]# ip netns exec net1 ip link set dev lo up
[root@iZ2vceej7yes1abpm7yec2Z ~]# 
[root@iZ2vceej7yes1abpm7yec2Z ~]# ip netns exec net1 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

状态现在变为unknown,这和本地的回环口一样,只有两端都连接时,例如eth0会和mac的虚拟端口连接起来,必须是一对才会显示up。

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部