一、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。
3.3 docker 中的网络连接
通过docker network inspect 可以看到bridge上的连接就是0.4这个ip地址。
本地的ip a结果分析