docker-compose - Docker:从“桥接网络容器”到主机网络容器的通信
问题描述
我的目标
我有一个 Web 前端应用程序,它通过特定端口(REST API)与后端应用程序(我们称之为“My_App”)进行通信。My_App 需要发送多播帧以与外界进行通信。我需要把所有东西都放到 Docker 容器中。
我尝试过(但失败了)
首先,我尝试将 nginx 和应用程序放在单个容器中,并为整个容器使用主机网络。如下图所示:
这适用于我的开发 PC,但不适用于目标系统,因为某些防火墙规则阻止我从目标系统外部访问端口 8081 和 12345。如果我通过 ssh 登录到目标系统,我可以很好地访问这些端口。所以目标系统上的情况是这样的:
我想要达到的目标
所以现在我试图将应用程序和 nginx 拆分为单独的容器(主机系统上允许桥接网络的端口映射,我可以从外部访问映射的端口)。
我想要做的是将Container A
使用桥接网络与另一个Container B
使用主机网络连接,以便内部的应用程序(例如 Nginx 作为反向代理)Container A
可以将请求发送到Container B
特定端口。如下图所示:
但现在我不知道如何实现这一点。我知道如果两个容器都使用桥接网络,通过使用 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
没有一些外部应用程序做路由?
解决方案
如果您使用的是 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}
推荐阅读
- javascript - iframe chrome:未捕获的 DOMException:无法从“Window”读取“localStorage”属性:拒绝访问此文档
- python - 多处理或线程或异步
- sql - Docker - initdb .sql 未在 postgresql 组合容器中运行
- javascript - 在非 Vue Web 应用程序中嵌入 Vue 应用程序(或 Vue Web 组件)
- python - 重命名 QTreeView 项目的正确方法?
- ios - UICollectionView 项目间距不是恒定的
- c# - 数组中的最小数字,C#
- excel - 按唯一标识符发送电子邮件,按 ID 分组 #
- r - 有没有办法在 R 中使用 ggplot2 进行高级自动化绘图?
- python - 如何在python中创建一个以参数为条件的嵌套列表