我试图理解之间的关系:在主机上泊坞窗网络
eth0
;和docker0
桥;并且每个容器上eth0
接口
这是我理解是码头工人:
- 创建
docker0
桥,然后给它分配的可用子网不冲突与任何运行于主人;那么 - Docker会绑定
docker0
到eth0
在主机上运行;然后 - 泊坞结合它旋转高达
docker0
每一个新的容器,使得容器的eth0
接口连接到docker0
主机,而这又是连接到eth0
主机
这样的,当外在的东西上到主机尝试与容器进行通信时,它必须将消息发送到主机IP上的端口,然后该主机的IP会被转发到桥接器,然后桥接器会广播到主机上运行的所有容器,是吗?另外,这样,当一个容器需要与主机之外的某个东西进行通信时,它有自己的IP(从docker0
子网租用),所以远程调用者将看到该消息来自容器的IP。
所以,如果我上面说过的任何东西是不正确的,请首先澄清我!
假设我多多少少是正确的,我的主要问题是:
- 当远程服务“调用”到容器,所有容器获得广播相同的消息,这就造成大量的流量/噪声,但也可能是安全风险(只有容器1应该是某个消息的接收者,但其上运行的所有其他容器也会收到消息);和
- 当Docker在不同的主机上选择相同的子网时会发生什么?在这种情况下,居住在主机1上的容器1可能具有与居住在主机2上的容器2相同的IP地址。如果容器1需要“呼出”到某个外部/远程系统(不居住在主机上),那么怎么做远程系统区分容器1与容器2(两者都将显示相同的出口IP)?
查看veth(你的“绑定”的概念不太对)和NAT与IP表(伪装)的东西。 –
您可以为docker主机上的连接设置特定端口。你可以在这里找到很好的解释http://stackoverflow.com/questions/26539727/giving-a-docker-container-a-routable-ip-address – Victor
它不会造成很大的流量/噪音,它有一个NAT并确切知道数据包的位置。这是默认桥接网络上的安全风险。这就是Docker创建网络概念的原因。它允许您将流量隔离到应该通信的容器: https://docs.docker.com/engine/userguide/networking/dockernetworks/ 没有什么不好的事情发生,如果他们选择相同的子网,事实上他们做默认值:类似172.17.255.255。 2个主机有2个独立的NAT,因此每个主机负责正确的路由。在外部他们使用独特的HOST接口(eth0) –