深入剖析 Kubernetes
张磊
Kubernetes 社区资深成员与项目维护者
113629 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
再谈开源与社区 (1讲)
结束语 (1讲)
深入剖析 Kubernetes
15
15
1.0x
00:00/00:00
登录|注册

32 | 浅谈容器网络

你好,我是张磊。今天我和你分享的主题是:浅谈容器网络。
在前面讲解容器基础时,我曾经提到过一个 Linux 容器能看见的“网络栈”,实际上是被隔离在它自己的 Network Namespace 当中的。
而所谓“网络栈”,就包括了:网卡(Network Interface)、回环设备(Loopback Device)、路由表(Routing Table)和 iptables 规则。对于一个进程来说,这些要素,其实就构成了它发起和响应网络请求的基本环境。
需要指出的是,作为一个容器,它可以声明直接使用宿主机的网络栈(–net=host),即:不开启 Network Namespace,比如:
$ docker run –d –net=host --name nginx-host nginx
在这种情况下,这个容器启动后,直接监听的就是宿主机的 80 端口。
像这样直接使用宿主机网络栈的方式,虽然可以为容器提供良好的网络性能,但也会不可避免地引入共享网络资源的问题,比如端口冲突。所以,在大多数情况下,我们都希望容器进程能使用自己 Network Namespace 里的网络栈,即:拥有属于自己的 IP 地址和端口。
这时候,一个显而易见的问题就是:这个被隔离的容器进程,该如何跟其他 Network Namespace 里的容器进程进行交互呢?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入剖析 Kubernetes》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(78)

  • 最新
  • 精选
  • 心蓝
    张老师对网络的讲解实在是太棒了,棒在并不使用高深的网络词语,那些高深的网络词语让人不知所述,头晕转向的,而是用最直白的讲话式加上配图来讲解,一看就懂,太喜欢了!少留言的我,都忍不住写留言!

    作者回复: 那就多留言哈

    39
  • loda
    请教个问题,默认情况两台主机的docker0无法互通,那么如果在这两台机器上配置了路由规则,将docker0的数据转发到eth0,两台机器通过网线或者交换机相连,这样是不是可以保证不用引入overlay network,容器之间也能互通

    作者回复: 当然可以。但这还是overlay,只是没用隧道。

    10
    14
  • 老师你好,网络的章节中讲到的二层网络和三层网络是分别指数据链路层和网络层么?

    作者回复: 对

    10
  • kissingers
    老师,容器1访问容器2,直接docker0网桥根据转发表转发就行了,怎么还有先到docker0接口,路由选择,再回到docker0转发的过程?访问外网时才会有到docker0这个网关,再路由出去的过程吧?

    作者回复: 对。这里其实都在二层ebtables处理的。我修改一下。

    8
  • kissingers
    docker0网桥有没有dhcp 功能?主机上的容器访问外网没有NAT?主机网卡没连到docker0?

    作者回复: 静态IP。访问外网为什么要NAT。同主机两张网卡要用什么连。

    2
    4
  • 不好意思,这里想请教一下,文中提到的二层网络,以及后面提到的三层网络,指的是OSI模型,还是TCP/IP 模型

    作者回复: OSI 哈

  • 林辉
    老师,你的第一条命令-d的-样式不对。。。

    作者回复: 是么……编辑看一下?

  • loda
    在宿主机上ifconfig看到的虚拟网卡应该是veth9c02e56,而不是vethb4963f3,12行代码应该有点问题

    作者回复: 是的,已修正

  • blackpiglet
    看到有位同学问怎么找 docker 和 宿主机上 veth 设备的关系,学完后我也有这个疑问,查了一下,结论是没有命令可以直接查到。但是可以查看 container 里的 eth0 网卡的 iflink 找到对应关系。 # 宿主机上 $ ip link ...... 9: veth0e9cd8d@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default link/ether 6a:fb:59:e5:7e:da brd ff:ff:ff:ff:ff:ff link-netnsid 1 # 容器内 $ sudo docker exec -it e151 bash root@e1517e9d9e1a:/# cat /sys/class/net/eth0/iflink 9 这样就可以确定 container e1517e9d9e1a 在物理机上对应的 veth pair 是 veth0e9cd8d 了。 这种方式需要登录到 docker 里执行命令,不是所有的容器都能这么做,不过 github 上有人专门做了个脚本来用实现这个功能,可以参考一下: https://github.com/micahculpepper/dockerveth
    11
    232
  • Jianwen Ji
    当一个容器试图连接到另外一个宿主机时,比如:ping 10.168.0.3,它发出的请求数据包,首先经过 docker0 网桥出现在宿主机上。宿主机再把这个ping包发送出去之前会做源nat转换,把源ip改成宿主机的ip。大家可以分别在docker0和宿主机的真实网卡上tcpdump 抓包看一下。在宿主机用iptables -L -t nat就能看到相应的规则。
    7
    67
收起评论
显示
设置
留言
78
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部