0

我有一个 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 以便控制器可以连接,但不是主机系统上的每个人都可以连接?

如果我错过了帮助诊断所需的网络部分,请告诉我,我会更新这篇文章!

4

0 回答 0