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

32 | 浅谈容器网络

在容器和宿主机上的应用
特点
生产环境中使用容器的Host Network模式的准备工作
容器的Host Network模式
单机容器网络实现原理
软件构建覆盖网络
Overlay Network
iptables规则检查
数据包传递流程
容器连接docker0网桥
Veth Pair设备
容器使用宿主机网络栈
Network Namespace
iptables规则
路由表
回环设备
网卡
思考题
总结
容器的跨主通信问题
容器间的通信
容器的网络隔离
容器的网络栈
浅谈容器网络

该思维导图由 AI 生成,仅供参考

你好,我是张磊。今天我和你分享的主题是:浅谈容器网络。
在前面讲解容器基础时,我曾经提到过一个 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
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Linux容器的网络实现原理 本文深入介绍了在单机环境下,Linux容器的网络实现原理。通过解释容器的网络栈、网桥的概念以及Veth Pair虚拟设备的连接方式,帮助读者快速了解了容器之间的交互原理。文章通过实际操作示例和简洁的语言,清晰地阐述了容器在宿主机上的网络通信流程,包括数据包的传输过程和Linux内核Netfilter的参与。 在文章中,作者通过具体的操作示例和图示,详细介绍了容器网络的实现原理,包括容器与宿主机网络的交互过程、docker0网桥的作用以及容器间通信的实现方式。特别是对于容器的“跨主通信”问题,作者提出了Overlay Network(覆盖网络)的解决方案,通过软件构建一个覆盖在已有宿主机网络之上的、可以把所有容器连通在一起的虚拟网络,为读者提供了解决方案。 总的来说,本文通过深入浅出的方式,详细介绍了Linux容器的网络实现原理,为读者提供了重要的参考和理解。文章内容涵盖了容器网络的基本原理和解决方案,对于想要深入学习和实践容器网络的读者来说,具有很高的参考价值。 在生产环境中使用容器的Host Network模式,需要做额外的准备工作,包括网络安全、性能优化、容器间通信等方面的考量。这些内容对于读者在实际应用中的决策和实践具有指导意义。 通过本文的阅读,读者可以快速了解容器网络的实现原理,为进一步深入学习和实践提供了重要参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入剖析 Kubernetes》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(79)

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

    作者回复: 那就多留言哈

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

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

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

    作者回复: 对

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

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

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

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

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

    作者回复: OSI 哈

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

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

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

    作者回复: 是的,已修正

    2018-11-05
  • 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
    2018-11-10
    12
    236
  • Jianwen Ji
    当一个容器试图连接到另外一个宿主机时,比如:ping 10.168.0.3,它发出的请求数据包,首先经过 docker0 网桥出现在宿主机上。宿主机再把这个ping包发送出去之前会做源nat转换,把源ip改成宿主机的ip。大家可以分别在docker0和宿主机的真实网卡上tcpdump 抓包看一下。在宿主机用iptables -L -t nat就能看到相应的规则。
    2018-11-11
    7
    67
收起评论
显示
设置
留言
79
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部