首页 > 解决方案 > Docker:从“桥接网络容器”到主机网络容器的通信

问题描述

我的目标

我有一个 Web 前端应用程序,它通过特定端口(REST API)与后端应用程序(我们称之为“My_App”)进行通信。My_App 需要发送多播帧以与外界进行通信。我需要把所有东西都放到 Docker 容器中。

我尝试过(但失败了)

首先,我尝试将 nginx 和应用程序放在单个容器中,并为整个容器使用主机网络。如下图所示:

在此处输入图像描述

这适用于我的开发 PC,但不适用于目标系统,因为某些防火墙规则阻止我从目标系统外部访问端口 8081 和 12345。如果我通过 ssh 登录到目标系统,我可以很好地访问这些端口。所以目标系统上的情况是这样的: 在此处输入图像描述

我想要达到的目标

所以现在我试图将应用程序和 nginx 拆分为单独的容器(主机系统上允许桥接网络的端口映射,我可以从外部访问映射的端口)。

我想要做的是将Container A使用桥接网络与另一个Container B使用主机网络连接,以便内部的应用程序(例如 Nginx 作为反向代理)Container A可以将请求发送到Container B特定端口。如下图所示:

具有桥接网络的容器 A 与具有主机网络的另一个容器通信

但现在我不知道如何实现这一点。我知道如果两个容器都使用桥接网络,通过使用 Dockers DNS 和每个容器的名称,我可以在容器之间进行通信。但是如果一个 Container 使用主机网络,绕过 Dockers DNS 怎么办呢?

这是我当前的 docker-compose 文件:

version: "2"
services:
  Container_B:
    image: my_app
    network_mode: host
  
  Container_A:
    image: nginx:alpine
    ports: 
      - 80:8081
      - 12342:12342  // apparently does not work because in use by Container_B
    depends_on:
      - "Container_B"

实际问题

是否可以从正在使用的 Bridge 网络中访问正在Container_B使用的主机网络中的端口?Container_A没有一些外部应用程序做路由?

标签: docker-compose

解决方案


如果您使用的是 Mac 或 Windows,则可以host.docker.internal使用network_mode: 'host'.
对于 linux,此功能尚不可用。它将在新版本的 docker 中可用。到那时,您可以使用 docker 映像dockerhost ( ) 并使用方法docker pull qoomon/docker-host以主机模式连接到容器。dockerhost:{port}

将此添加到您的 docker-compose.yml 文件中:

dockerhost:
      image: qoomon/docker-host
      cap_add:
        - NET_ADMIN
        - NET_RAW
      restart: on-failure
      networks:
        - back_end

Container_A 也应该与 dockerhost 在同一个网络中。在此之后,您可以使用where port 是主机中的容器正在侦听的位置,
将桥接网络中的容器连接到主机模式下的容器。dockerhost:{port}


推荐阅读