docker 容器是不是有自己的 TCP/IP 堆栈?

Posted

技术标签:

【中文标题】docker 容器是不是有自己的 TCP/IP 堆栈?【英文标题】:Does a docker container have its own TCP/IP stack?docker 容器是否有自己的 TCP/IP 堆栈? 【发布时间】:2014-08-27 23:01:53 【问题描述】:

我试图了解网络数据包的幕后情况,该网络数据包来自连接到主机的线路并被定向到 Docker 容器内的应用程序。

如果它是一个经典的 VM,我知道到达主机的数据包将由管理程序(例如 VMware、VBox 等)传输到 VM 的虚拟 NIC,并从那里通过 TCP/IP 堆栈客户操作系统,最终到达应用程序。

在 Docker 的情况下,我知道主机上的数据包从主机的网络接口转发到 docker0 网桥,该网桥连接到以虚拟接口 @ 结尾的 veth 对987654324@ 在容器内。但在那之后呢?由于所有 Docker 容器都使用宿主内核,假设数据包由宿主内核的 TCP/IP 堆栈处理是否正确?如果有,怎么做?

我真的很想阅读关于幕后真正发生的事情的详细解释(或者如果您知道资源可以随意链接它)。我已经仔细阅读了this页面,但它并没有说明一切。

提前感谢您的回复。

【问题讨论】:

是的,使用了主机 TCP/IP 堆栈。阅读您链接到的页面后,除了阅读 linux 内核和 docker 源代码之外,很难添加更多内容 - 您有什么具体问题吗? 感谢您的评论。好吧,例如,我不清楚数据如何从docker0 桥传输到主机的eth0:我尝试使用wireshark,但我只能看到从docker0 和@987654328 交换的数据包@;我还假设在docker0eth0 之间有一个 NAT,因为地址发生了变化,但我没有找到关于它的文档。 对,大部分内容,包括 docker 使用的 NAT 规则,都在该文档中进行了说明。 我的错,我跳过了“将容器端口绑定到主机”这一段,因为标题;很抱歉浪费您的时间。我建议您将您的第一条评论转换为答案,因为您回答了有关 TCP/IP 堆栈的问题,我很乐意接受:-) 【参考方案1】:

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

这是一篇简短的文章,通过一些例子介绍了这个概念:http://blog.scottlowe.org/2013/09/04/introducing-linux-network-namespaces/ 我发现这篇文章也很有帮助: http://containerops.org/2013/11/19/lxc-networking/

我希望这能给你足够的指导来深入挖掘。

【讨论】:

以上是关于docker 容器是不是有自己的 TCP/IP 堆栈?的主要内容,如果未能解决你的问题,请参考以下文章

Docker:服务器是不是在主机“localhost”(::1) 上运行并接受端口 5432 上的 TCP/IP 连接?

docker镜像为啥有自己的ip

如何在 Docker 容器内为 Wildfly 设置堆大小?

docker使用堆外内存

Linux——Docker容器四种网络模式,自定义网络

Linux——Docker容器四种网络模式,自定义网络