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 交换的数据包@;我还假设在docker0
和eth0
之间有一个 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 连接?