【问题标题】:Multi-Platform Docker Internal Network Connect From Host来自主机的多平台 Docker 内部网络连接
【发布时间】:2020-12-06 06:26:34
【问题描述】:

我有一个独特的 Docker 问题。我正在开发一个需要连接到多个 Docker 容器的应用程序。要点是,此应用程序将使用 Docker SDK 启动容器并根据需要连接到它们。

但是,由于应用程序的性质,我们应该假设这些容器中的每一个都受到损害且不安全。因此,我需要将它们与主机网络分开(这样它们就无法访问我的设备和 WAN)。我仍然有需要从我的应用程序连接到它们的限制。

macOS networking stack doesn't support connecting to a docker network 是一个众所周知的问题。通常,我会通过暴露我需要的端口来解决这个问题。但是,这在我的应用程序中是不可能的,因为我在 Docker 中使用内部网络。

我想完成类似以下的事情。想象一下 Container 2 和 Container 3 在它们自己的私有内部网络上。主机(不是容器)控制着 Docker SDK,可以查询它们的内部 IP。因此,它可以轻松地连接到这些机器,而无需将该网络暴露给主机的网络。幸运的是,这种设置适用于 Linux。不过,我想提出一个适用于 macOS 的跨平台解决方案。

【问题讨论】:

  • Docker Desktop for Mac 秘密运行 Linux VM;您可以在自己的虚拟机中运行整个应用程序堆栈 (a) 以更直接地控制网络,以及 (b) 进一步将容器与外部环境隔离。
  • 这是个好主意,我也想过,但我希望有更好的解决方案。 Host -> VM -> Docker 听起来像是一个非常缓慢的解决方案,但如果我错了,请纠正我。这是我正在考虑的事情:我可以将控制 SDK 的应用程序容器化,为其提供两个网络,主机和内部网络,并为 Docker 提供套接字,以便它可以启动其他容器。当然,如果容器被攻击,那就是坏消息了,攻击者可以使用 SDK 来启动容器,但这与被攻击的 docker 主机有什么区别呢?
  • 我认为,如果您的个人机器(您使用的终端)不是 linux,那么任何 docker 容器都会以“主机 -> 虚拟机 -> Docker”的形式运行。我不知道如何访问虚拟机..
  • 在深入研究之前,您是否尝试过使用--internal 选项创建网络?很确定这将阻止允许通过主机的“真实”接口进行连接的主机 NAT 规则stackoverflow.com/a/42336592/1987437
  • 是的,这是我用来隔离容器的。但现在,我需要一种从我的 macOS 机器上连接到它的方法。

标签: docker networking


【解决方案1】:

我也遇到过类似的情况。我最终做的是:

  • 该应用管理动态容器到端口的映射(只是一个哈希表)。
  • 当我的应用(在主机上)想要启动一个容器时,它会在预定义的范围(例如 28000-29000)中找到一个未使用的端口。
  • 一旦有了端口,它就会将容器的端口映射到预定范围内的某个端口(例如-p 28003:80)。
  • 当我的应用需要引用容器时,它使用localhost:<port>(例如localhost:28001)。

事实证明,代码并不多,但如果你走这条路,请确保封装引用容器的方式(即不要硬编码主机名和端口,使用生成字符串)。

话虽如此,您确实应该使用 VM 部署选项进行一些测试,然后再将其排除为太慢。

【讨论】:

  • 这不符合网络与主机隔离的约束
  • 您能否编辑您的原始问题以澄清? IIUC 它们不能完全隔离,因为您需要主机访问来宾。不是这样吗?或者这个答案是否为客人介绍了一种与您在问题中提到的 LInux 设置中不存在的主机交谈的方式?
  • 我最初的问题是:“但是,由于应用程序的性质,我们应该假设这些容器中的每一个都受到威胁且不安全。因此,我需要将它们与主机网络分开(所以他们无法访问我的设备和广域网)。”我主要关心的是这些设备访问 WAN,我不太关心访问主机,因为 SSH 将是唯一开放的端口,并且将启用公钥/私钥身份验证。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多