将Docker容器连接到主机和内部网桥网络


14

我正在尝试将Docker容器作为私有(--internal)Docker网络和预定义host网络之间的路由器运行。这意味着容器需要具有两个网络接口:一个“外部”接口可以访问所有主机IP地址,而一个“内部”接口可以充当内部Docker网络中容器的网关。

然后,路由器容器本身将对来自/到容器的NAT网络流量进行NAT。

我还没有找到一种配置Docker来使用这两个接口运行容器的方法。我能得到的最接近的结果是bridge分配了两个接口,这并不是我所需要的。

尝试手动连接会导致错误:

# docker network connect host root_router_1
Error response from daemon: Container cannot be disconnected from host network or connected to host network

有人可以告诉我如何实现这一目标,最好是连Docker Compose都可以实现?


@PunMum不幸的是没有。我们最终将所有容器直接连接到主机网络,并在容器内配置IP。
Hexaholic '18 -4-9

Answers:


2

根据对github的问答

主机网络很特殊。您必须在服务上使用network_mode:host


network_mode如果您需要将某些东西连接到内部网络和主机网络,则无法使用。我们无法找到解决该问题的好方法,这似乎很疯狂。
jv-dev

2

Docker不允许将容器同时连接到主机网络和任何其他Docker桥接网络。我将尝试通过一个例子来说明原因:

  • 让我们考虑一个容器C1。假设C1将连接到主机网络(--net = host)和Docker桥网络Br1(--net = Br1)。
  • 第二个容器,比方说C2,连接到Br1。

通过上述设置,我猜想主机网络可以从C2看到,并且我想这就是Docker自动阻止我们无意中将主机网络暴露于非主机指定容器的原因。

话虽这么说,如果我们有一组容器,并且我们希望所有容器相互连接,并且只有一个容器可以访问主机网络,那么我的方法是:

  • [C2,...,CN]连接到用户定义的Docker桥Br1(--net = Br1)
  • C1已连接到主机网络(--net = host)
  • C1公开了一个端口,以便可以从其余容器访问

编辑:我们仍然必须以这样的方式调整iptables策略,以便可以从其余容器访问C1(请参阅https://docs.docker.com/network/iptables/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.