博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
docker 网络命名空间如何连通?
阅读量:3521 次
发布时间:2019-05-20

本文共 4190 字,大约阅读时间需要 13 分钟。

目录

 


一、busybox介绍

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

[root@iZ2vceej7yes1abpm7yec2Z ~]# docker imagesREPOSITORY                  TAG                 IMAGE ID            CREATED             SIZEpython                      3.6                 1297140c6dd2        9 days ago          874MBubuntu                      latest              d70eaf7277ea        2 weeks ago         72.9MBbusybox                     latest              f0b02e9d092d        4 weeks ago         1.23MB

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

详情参考:

二、运行两个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 -aCONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                       PORTS                    NAMES51ea3cd11968        busybox                        "/bin/sh -c 'while t…"   5 seconds ago       Up 5 seconds                                          test24209ba002f3d        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 a1: lo: 
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 forever144: eth0@if145:
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 a1: lo:
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 forever142: eth0@if143:
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.3PING 172.17.0.3 (172.17.0.3): 56 data bytes64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.093 ms64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.065 ms64 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.4PING 172.17.0.4 (172.17.0.4): 56 data bytes64 bytes from 172.17.0.4: seq=0 ttl=64 time=0.083 ms64 bytes from 172.17.0.4: seq=1 ttl=64 time=0.071 ms64 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 listnet2net1

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

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

~]# ip netns exec net1 ip a1: lo: 
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 link1: lo: 
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 link1: lo: 
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结果分析

docker container 51ea3cd11968想要连接到docker0 bridge这个namespace.

转载地址:http://zmhqj.baihongyu.com/

你可能感兴趣的文章
选择排序(java代码实现)
查看>>
插入排序
查看>>
哈夫曼树java代码实现
查看>>
快速排序
查看>>
vue路由高亮的两种方式
查看>>
vue router 报错: Uncaught (in promise) NavigationDuplicated {_name:""NavigationDuplicated"... 的解决方法
查看>>
vue跳转页面的两种方式
查看>>
存储器题目解析(持续更新中....)
查看>>
存储器知识要点
查看>>
Cache模拟器的实现
查看>>
实验2:MIPS指令系统和MIPS体系结构
查看>>
设计模式七大原则
查看>>
手写 | spring事务
查看>>
AndroidStudio Gradle手动下载
查看>>
SpringBoot入门(二)场景启动器
查看>>
SpringBoot入门--自动配置
查看>>
springboot读取配置文件 例:读取配置文件的优先顺序;在主配置文件中激活其他配置文件;加载非主配置文件
查看>>
自动配置原理
查看>>
TCP协议
查看>>
关于Linux系统使用遇到的问题-1:vi 打开只读(readonly)文件如何退出保存?
查看>>