首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >码头联网

码头联网
EN

Stack Overflow用户
提问于 2015-09-30 09:08:00
回答 1查看 481关注 0票数 2

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

  • 主机上的eth0;以及
  • docker0桥;及
  • 每个容器上的eth0接口

据我所知,码头工人:

  1. 创建一个docker0桥,然后为它分配一个与主机上运行的任何内容没有冲突的可用子网;然后
  2. Docker将docker0绑定到在主机上运行的eth0,然后
  3. Docker将其附带的每个新容器绑定到docker0,这样容器的eth0接口就连接到主机上的docker0,而docker0又连接到主机上的eth0

这样,当主机外部的东西试图与容器通信时,它必须将消息发送到主机IP上的一个端口,然后转发到docker0桥,然后广播到主机上运行的所有容器,对吗?

而且,这样,当容器需要与主机之外的东西通信时,它有自己的IP (从docker0子网租用),因此远程调用方会将消息视为来自容器的IP。

因此,如果我上面说的是不正确的,请首先为我澄清!

假设我或多或少是正确的,我主要关心的是:

  • 当远程服务“调用”到容器时,所有容器都会被广播相同的消息,这会造成大量的通信/噪音,但也会带来安全风险(其中只有容器1应该是某些消息的接收方,但在该消息上运行的所有其他容器也会收到消息);以及
  • 当Docker在不同的主机上选择相同的子网时会发生什么?在这种情况下,生活在主机1上的容器1可能具有与驻留在主机2上的容器2相同的IP地址。如果容器1需要“呼叫”某个外部/远程系统(而不是在主机上),那么远程系统如何区分容器1与容器2(两者都会显示相同的出口IP)?
EN

回答 1

Stack Overflow用户

发布于 2017-03-03 11:52:49

我不会说你很清楚在码头建立关系网的概念。让我首先澄清这一部分:

事情是这样的:

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

现在讨论一下网络名称空间:

Net命名空间,

  • 让每个容器都有自己的网络资源,自己的网络堆栈。
    • 这是自己的网络接口。
    • 是自己的路由表。
    • 这是自己的规定。
    • 它是自己的插座(ss,netstat)

  • 我们可以跨网络名称空间移动网络接口。
  • 所以我们可以在某个地方创建一个netns,并在其他容器中使用它。
  • 通常:使用两个虚拟接口,它们充当交叉电缆.
  • Eth0 @容器netNS,它与主机网络ns中的虚拟接口vethXXX配对。所有虚拟接口vethXXX都是桥接在一起的。(使用桥docker0)

现在,除了名称空间之外,Linux内核中还有第二个特性,使创建容器成为可能:C组(或控件组)。

  • 控制小组让我们实施计量和限制:
    • 内存
    • CPU
    • I/O区块
    • 网络

TL/DL

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

群体 名称空间

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

回到您的问题,当主机接收到用于容器的数据包时,将其封装在层中,以便每个层帮助网络控制器,网络控制器逐层剥离数据包,将其发送到其目的地。(同样地,在输出时,数据包被逐层封装)

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

  1. 这不是个广播。其他容器看不到与它们无关的数据包(名称空间)。
  2. 由于层是在数据包进入外部网络时添加的,外部层(针对不同的主机不同)将帮助数据包唯一地识别其收件人。

P.S.:

如果有人发现一些错误的信息,请在评论中告诉我。我已经写了这个匆忙,将更新它与更好的评论文本很快。

谢谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32862146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档