docker-engine 如何处理传出和传入的流量 from/to 多个容器?

How does docker-engine handle outgoing and incoming traffic from/to multiple containers?

我目前在反向代理后面有大约 5 个网络服务器 运行。我想使用外部 AD 通过 ldap 协议对我的用户进行身份验证。 docker-engine 能自己区分每个容器吗?

我目前的理解是,如果没有容器化的目录服务或没有为每个容器公开不同的端口,这是不可能的,但我有疑问。如果我从我的容器中 ping 一个外部服务器,我可以在同一个容器中毫无问题地得到回复。回复如何到达正确的容器?我无法理解它与任何其他协议有何不同,但同时需要反向代理来提供多个网络服务器的内容。如果有人能让我更清楚一点,我将不胜感激。

深入挖掘后,我找到了我要找的东西。

来自容器的任何流量都将由 docker 通过 iptables 使用 IP 伪装(类似于 NAT)在默认网络上自动路由。它的工作方式是来自容器的数据包将被剥离容器 IP 地址并替换为主机 IP 地址。原始 ip 地址将被记住,直到 tcp 会话结束。然后流量将到达目的地,任何回复都将发送回主机。回复数据包将被剥离主机 ip 并发送到适当的容器。这就是为什么您可以从容器中 ping 另一台服务器并在同一容器中得到回复。

但显然它不适用于网络服务器的传入流量,因为第一步是客户端开始与网络服务器的会话。这就是为什么需要反向代理的原因。

我可能遗漏了一些东西并且可能对其他一些东西有误,但这是一般的想法。

TLDR:传出流量(和任何回复)将由 docker 自动路由,您将必须使用反向代理将传入流量路由到多个容器。