我的目标
我有一个web前端应用程序,它通过一个特定的端口(REST API)与一个后端应用程序(让我们称之为"My_App")进行通信。My_App需要发送多播帧才能与外部世界通信。我需要把所有东西都放到Docker容器中。
我尝试过(但失败了)
首先,我尝试将nginx和应用程序放在一个容器中,使用主机网络连接整个容器。如下图所示:

这在我的开发PC上有效,但在目标系统上无效,因为一些防火墙规则阻止我从目标系统外部访问Port8081和12345。如果我登录到目标系统,例如通过ssh,我可以很好地访问这些端口。所以目标系统上的情况是这样的:

我想要实现的目标
因此,现在我尝试将应用程序和nginx拆分到单独的容器中(主机系统允许桥接网络的端口映射,我可以从外部访问映射的端口)。
我想做的是将一个使用网桥网络的Container A与另一个使用主机网络的Container B连接起来,这样Container A中的一个应用程序(例如,作为反向代理的Nginx )就可以在特定的端口上向Container B发送请求。如下图所示:

但现在我不知道如何实现这一点。我知道,如果两个容器都使用桥接网络,我可以通过使用Dockers DNS和每个容器的名称在容器之间进行通信。但是,如果一个容器使用主机网络,绕过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"实际的问题
是否可以使用主机网络从使用网桥网络的Container_B中访问Container_A中的端口?而不需要一些外部应用程序进行路由?
发布于 2020-09-08 14:32:42
如果你使用的是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_endContainer_A也应该与dockerhost在同一网络中。
在此之后,您可以使用dockerhost:{port}从桥接网络内连接到主机模式下的容器,其中port是主机中的容器正在侦听的地方。
https://stackoverflow.com/questions/63452752
复制相似问题