一个Docker容器有自己的TCP/IP协议栈吗?

35

我正在尝试理解从连接到主机的电线传输到Docker容器内部应用程序的网络数据包背后发生了什么。

如果它是经典虚拟机,我知道抵达主机的数据包会被 hypervisor(例如 VMware、VBox 等)传输到虚拟机的虚拟网卡上,然后通过客户操作系统的 TCP/IP 协议栈最终到达应用程序。

在 Docker 的情况下,我知道从主机接收的数据包会从主机的网络接口转发到连接到容器内部虚拟接口 eth0 上的 veth 对端的 docker0 桥。但此后呢?既然所有 Docker 容器都使用主机内核,那么可以假设该数据包由主机内核的 TCP/IP 协议栈处理吗?如此,又是如何处理的呢?

我真的希望能够阅读详细的说明(或者如果您知道相关资源,请随意提供链接)有关幕后实际发生的情况。我已经认真阅读了这个页面,但它并没有说清楚全部内容。

感谢您的回复。


1
是的,使用主机TCP/IP堆栈。阅读您提供的页面后,很难再添加更多的内容,除非查看Linux内核和Docker源代码-您是否有任何具体问题? - nos
感谢您的评论。例如,我不清楚数据是如何从docker0桥传输到主机机器的eth0,我尝试使用wireshark,但我只能看到从docker0vethXYZ交换的数据包;我还假设在docker0eth0之间存在NAT,因为地址会改变,但我没有找到相关文档。 - Manuel Durando
大部分内容,包括Docker使用的NAT规则,在那份文档中都有解释。 - nos
我的错,我因为标题跳过了“将绑定容器端口到主机”的段落;很抱歉浪费了您的时间。我建议您将第一条评论转换为答案,因为您已经回答了关于TCP/IP协议栈的问题,我会很乐意接受它 :-) - Manuel Durando
1个回答

12

网络堆栈(即“代码”)绝对不在容器中,而是在内核中,主机和所有容器共享一个内核(您已经知道这一点)。每个容器拥有自己独立的网络 命名空间,这意味着它具有自己的网络接口和路由表。

这是一篇简要介绍该概念并提供一些示例的文章: http://blog.scottlowe.org/2013/09/04/introducing-linux-network-namespaces/ 我还发现这篇文章也很有帮助: http://containerops.org/2013/11/19/lxc-networking/

希望这些指引足够让你深入挖掘。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接