我试图了解以下之间的关系:
eth0
在主机上;和 docker0
桥;和 eth0
每个容器上的接口(interface)据我了解,Docker:
docker0
桥接,然后为其分配一个与主机上运行的任何内容不冲突的可用子网;然后 docker0
至eth0
在主机上运行;然后 docker0
,这样容器的 eth0
接口(interface)连接到docker0
在主机上,该主机又连接到 eth0
在主机上这样,当主机外部的东西试图与容器通信时,它必须将消息发送到主机 IP 上的端口,然后转发到
docker0
桥,然后广播到主机上运行的所有容器,是吗?此外,这样,当一个容器需要与主机外部的东西通信时,它有自己的 IP(从
docker0
子网租用),因此远程调用者将看到消息来自容器的 IP。因此,如果我上面所说的任何内容都不正确,请首先为我澄清!
假设我或多或少是正确的,我主要担心的是:
最佳答案
我不会说你对 Docker 中的网络概念很清楚。
让我先澄清这部分:
所以事情是这样的:
现在谈谈网络命名空间:
网络命名空间,
网络 ns。
➔ 所有虚拟接口(interface) vethXXX 都桥接在一起。 (使用桥接器 docker0)
现在,除了命名空间之外,Linux 内核中还有第二个特性可以让创建容器成为可能:c-groups(或 control-groups)。
TL/DL
简而言之:
容器之所以成为可能是因为内核的两个主要特性:
命名空间和 C 组。
Cgroups ---> Limits how much you can use.
Namespaces ---> Limits what you can see.
你不能影响你看不到的东西。
回到你的问题,当主机接收到一个用于容器的数据包时,它被封装在层中,这样每一层都可以帮助网络 Controller ,它一层一层地剥离数据包以将其发送到目的地。 (同样在传出时,数据包被逐层封装)
所以,我认为这也回答了你的两个问题。
PS:
如果有人发现某些信息有误,请在评论中告诉我。我匆忙写了这篇文章,很快就会用更好的评论文本更新它。
谢谢你。
关于networking - docker 网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32862146/