我有一个 docker 应用程序在网络上的服务器 (.80) 上运行,具有单独的硬件/服务器 (.50),它需要通过 UDP 将数据发送到。 controller
服务(在 .80 上运行)充当在 8000 上公开的 API,可通过打开 firewalld(在 .80 上)中的端口在网络上访问该 API。
firewall-cmd --permanent --add-port=8000/tcp
此外,controller
服务在发布到/卷曲时会在后台进行一些数据处理,然后在 239.0.0.5:7775 处公开的 UDP 套接字上将 UDP 数据包发送到 0.50。
在 docker 网桥网络/自定义网络 (.80) 中运行 controller
服务时,我可以根据需要访问控制器 API,但无法获取从 .80 发送/由接收的 UDP 数据包在 .50 上运行的 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
如果我在网络模式下运行我的服务=“主机”(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 发送出去,因为它继承了我缺少的主机中配置的一些网络配置/路由/分辨率。
我的系统工程/网络不是很好,所以我的具体问题是:
有没有办法在 docker 网桥网络上运行 controller
服务,但启用对网络上运行的其他硬件/服务器公开的 UDP 套接字的通信/访问?
或者,如果我在主机网络上运行 controller
以保持与我需要发送 UDP 数据包的其他硬件服务的通信,是否有更安全的方式来组合 redis,以便控制器可以连接,但是不是主机系统上的每个人都可以连接?
如果我错过了帮助诊断所需的网络部分,请告诉我,我会更新这篇文章!