【问题标题】:Docker Networking码头工人网络
【发布时间】:2015-09-30 09:08:00
【问题描述】:

我试图了解以下之间的关系:

  • eth0 在主机上;和
  • docker0桥;和
  • eth0 每个容器上的接口

我的理解是 Docker:

  1. 创建一个docker0 网桥,然后为其分配一个与主机上运行的任何东西都不冲突的可用子网;那么
  2. Docker将docker0绑定到主机上运行的eth0;那么
  3. 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


【解决方案1】:

我不会说你对 Docker 中的网络概念很清楚。 让我先澄清这部分:

事情是这样的:

  1. Docker 使用 Linux 内核中称为命名空间的特性来分类/划分资源。
  2. 当容器启动时,Docker 会为该容器创建一组命名空间。
  3. 这提供了一层隔离。
  4. 其中之一是“网络命名空间”:用于管理网络接口。

现在谈谈网络命名空间:

网络命名空间,

  • 让每个容器都有自己的网络资源,自己的网络堆栈。
    • 它有自己的网络接口。
    • 它有自己的路由表。
    • 它有自己的 iptables 规则。
    • 它自己的套接字(ss、netstat)
  • 我们可以跨网络命名空间移动网络接口。
  • 所以我们可以在某处创建一个 netns 并在其他容器中使用它。
  • 通常:使用两个虚拟接口,充当交叉电缆。
  • Eth0@container netNS,与host中的虚拟接口vethXXX配对 网络 ns。 ➔ 所有虚拟接口 vethXXX 都桥接在一起。 (使用桥接器 docker0)

现在,除了命名空间之外,Linux 内核中还有第二个特性可以让创建容器成为可能:c-groups(或 control-groups)。

  • 控制组让我们可以实现计量和限制:
    • 内存
    • CPU
    • 块 I/O
    • 网络

TL/DL

简而言之: 容器之所以成为可能是因为内核的两个主要特性: 命名空间和 C 组。

Cgroups ---> 限制您可以使用的数量。

命名空间 ---> 限制您可以看到的内容。

而且你不能影响你看不到的东西。


回到你的问题,当主机接收到用于容器的数据包时,它被封装在层中,这样每一层都可以帮助网络控制器,它一层一层地剥离数据包以将其发送到它的目的地。 (同样在传出时,数据包被一层一层封装)

所以,我认为这也回答了你的两个问题。

  1. 这不完全是广播。其他容器看不到与它们无关的数据包(命名空间)。
  2. 由于在数据包进入外部网络时添加了层,因此外部层(不同主机的不同)将帮助数据包唯一地识别它的接收者。

附注:

如果有人发现某些信息有误,请在 cmets 中告诉我。我写的很匆忙,很快就会用更好的审查文本更新它。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 2017-10-15
    • 2017-02-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多