我有一个 docker 应用程序在网络上的服务器(.80)上运行,具有单独的硬件/服务器(.50),它需要通过 UDP 发送数据。该controller
服务(在 .80 上运行)充当在 8000 上公开的 API,可通过打开 firewalld(在 .80 上)中的端口在网络上访问。
firewall-cmd --permanent --add-port=8000/tcp
此外,该controller
服务在发布/卷曲时会在后台进行一些数据处理,然后再将 UDP 数据包发送到 239.0.0.5:7775 上暴露的 UDP 套接字上的 0.50。
在 docker bridge 网络/自定义网络 (.80) 中运行controller
服务时,我可以根据需要访问控制器 API,但无法获取从 .80 发送的 UDP 数据包/由在 .50 上运行的 UDP 应用程序接收的 UDP 数据包
version: '3.5'
networks:
m-serve: {}
volumes:
redis-dev_database: {}
services:
redis:
image: localhost:5000/redis:latest
hostname: redis
networks:
- m-serve
ports:
- 6379
volumes:
- type: volume
source: redis-dev_database
target: /etc/redis/database
volume:
nocopy: true
controller:
image: localhost:5000/controller:latest
networks:
- m-serve
ports:
- 8000:8000
environment:
- REDIS_HOST=redis
如果我在网络模式 = "host" 下运行我的服务(6379 和 8000 作为docker 镜像构建,从而使它们可以在主机上访问,尽管没有在 compose 中定义):
version: '3.5'
volumes:
redis-dev_database: {}
services:
redis:
image: localhost:5000/redis:latest
network_mode: host
volumes:
- type: volume
source: redis-dev_database
target: /etc/redis/database
volume:
nocopy: true
controller:
image: localhost:5000/controller:latest
network_mode: host
environment:
- REDIS_HOST=localhost
但是,这可能不太安全且不可取,因为 redis 服务不再隔离在桥接网络中,并且主机上的任何人都可以使用 (.80)。我的预感是它适用于发送 UDP,因为它继承了我缺少的主机中配置的一些网络配置/路由/分辨率。
我的系统工程/网络不是很好,所以我的具体问题是:有没有办法controller
在 docker bridge 网络上运行服务,但启用对网络上运行的其他硬件/服务器公开的 UDP 套接字的通信/访问?
或者,如果我被困controller
在主机网络上以保持与我需要发送 UDP 数据包的其他硬件服务的通信,是否有更安全的方式来编写 redis 以便控制器可以连接,但不是主机系统上的每个人都可以连接?
如果我错过了帮助诊断所需的网络部分,请告诉我,我会更新这篇文章!