【发布时间】:2015-09-30 09:08:00
【问题描述】:
我试图了解以下之间的关系:
-
eth0在主机上;和 -
docker0桥;和 -
eth0每个容器上的接口
我的理解是 Docker:
- 创建一个
docker0网桥,然后为其分配一个与主机上运行的任何东西都不冲突的可用子网;那么 - Docker将
docker0绑定到主机上运行的eth0;那么 - Docker 将它所启动的每个新容器绑定到
docker0,以便容器的eth0接口连接到主机上的docker0,而后者又连接到主机上的eth0
这样,当主机外部的东西试图与容器通信时,它必须将消息发送到主机 IP 上的端口,然后转发到 docker0 网桥,然后广播到所有容器在主机上运行,是吗?
另外,这样,当一个容器需要与主机外部的东西通信时,它有自己的 IP(从docker0 子网租用),所以远程调用者会看到消息来自容器的 IP .
因此,如果我上面所说的任何内容不正确,请先为我澄清一下!
假设我或多或少是正确的,我主要担心的是:
- 当远程服务“调用”到容器时,所有容器都会广播相同的消息,这会产生大量流量/噪音,但也可能存在安全风险(其中只有容器 1 应该是某些消息的接收者,但在其上运行的所有其他容器也会收到消息);和
- 当 Docker 在不同的主机上选择相同的子网时会发生什么?在这种情况下,位于主机 1 上的容器 1 可能与位于主机 2 上的容器 2 具有相同的 IP 地址。如果容器 1 需要“呼叫”某个外部/远程系统(不在主机上),那么如何远程系统区分容器 1 和容器 2(两者都将显示相同的出口 IP)?
【问题讨论】:
-
查找 veth(您的“绑定”概念不太正确)和带有 IP 表(伪装)的 NAT。
-
您可以为您的容器设置特定端口,以便连接到 docker 主机之外。你可以在这里找到很好的解释stackoverflow.com/questions/26539727/…
-
它不会产生大量流量/噪音,它有一个 NAT 并且确切地知道该数据包的去向。这是默认桥接网络的安全风险。这就是 Docker 创建网络概念的原因。它允许您将流量隔离到应该进行通信的容器:docs.docker.com/engine/userguide/networking/dockernetworks 如果它们选择相同的子网,没有什么不好的事情发生,事实上它们默认情况下会这样做:例如 172.17.255.255。 2 台主机有 2 个单独的 NAT,因此每个主机都负责正确的路由。在外部,他们使用的是唯一的 HOST 接口 (eth0)
标签: networking docker subnet