从主机连接多平台Docker内部网络

从主机连接多平台Docker内部网络,docker,networking,Docker,Networking,我有一个独特的Docker问题。我正在开发一个需要连接到多个Docker容器的应用程序。要点是,此应用程序将使用Docker SDK启动容器并根据需要连接到它们 但是,由于应用程序的性质,我们应该假设这些容器中的每一个都受到了危害,并且不安全。因此,我需要将它们与主机网络分离(这样它们就无法访问我的设备和WAN)。我仍然有需要从应用程序连接到它们的限制 这是一个众所周知的问题。通常,我会通过暴露一个我需要的端口来解决这个问题。但是,这在我的应用程序中是不可能的,因为我正在使用Docker的内部网

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

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

这是一个众所周知的问题。通常,我会通过暴露一个我需要的端口来解决这个问题。但是,这在我的应用程序中是不可能的,因为我正在使用Docker的内部网络

我想完成如下的事情。假设容器2和容器3位于各自的专用内部网络上。主机(不是容器)控制Docker SDK,可以查询其内部IP。因此,它可以轻松地连接到这些机器,而无需将此网络暴露于主机的网络。幸运的是,这种设置可以在Linux上运行。然而,我想提出一个在macOS上工作的跨平台解决方案


我也有类似的情况。我最后做的是:

  • 该应用程序管理一个动态容器到端口的映射(只是一个哈希表)
  • 当我的应用程序(在主机上)想要启动容器时,它会在预定义的范围内(例如28000-29000)找到一个未使用的端口
  • 一旦有了一个端口,它就会将容器的端口映射到预定范围内的某个端口(例如,
    -p 28003:80
  • 当我的应用程序需要引用容器时,它使用
    localhost:
    (例如
    localhost:28001
事实证明,代码并不多,但如果您这样做,请确保按照引用容器的方式进行封装(即,不要硬编码主机名和端口,使用生成字符串的类)


尽管如此,在排除VM部署太慢之前,您确实应该使用VM部署选项进行一些测试。

Docker Desktop for Mac秘密运行Linux VM;您可以在自己的虚拟机中运行整个应用程序堆栈(a)对网络进行更直接的控制,以及(b)进一步将容器与外部环境隔离。这是一个好主意,也是我考虑过的,但我希望有更好的解决方案。主机->虚拟机->码头工人听起来是一个非常缓慢的解决方案,但请纠正我,如果我错了。下面是我正在考虑的事情:我可以将控制SDK的应用程序容器化,给它两个网络,主机和内部网络,并给它Docker的套接字,以便它可以启动其他容器。当然,如果容器受到攻击,这将是一个坏消息,攻击者可以使用SDK启动容器,但这与被攻击的docker主机有什么区别?我认为如果您的个人计算机(您使用的终端)是非linux的,那么任何docker容器都会作为“主机->虚拟机->docker”运行。但是我不知道如何访问虚拟机。在深入研究之前,您是否尝试过使用
--internal
选项创建网络?非常确定这将阻止主机NAT规则,该规则允许连接到主机的“真实”接口是的,这是我用来隔离容器的。但是现在,我需要一种方法从我的macOS机器连接到它。这不符合网络与主机隔离的限制。你可以编辑你的原始问题来澄清吗?IIUC它们不能完全隔离,因为您需要主机访问来宾。不是这样吗?或者,这个回答是否为来宾提供了一种与您在问题中提到的LInux安装程序上不存在的主机对话的方式?我最初的问题是:“但是,由于应用程序的性质,我们应该假设这些容器中的每一个都受到危害且不安全。因此,我需要将它们与主机网络分开(因此他们无法访问我的设备和WAN)。“我主要关心的是这些设备访问WAN,我不太关心访问主机,因为SSH将是唯一打开的端口,并且将启用公钥/私钥身份验证。