UDP 流应用程序没有从 docker 容器中输出到网络上的外部 UDP 套接字(在不同的服务器上运行,但在网络上)

时间:2021-05-17 17:31:04

标签: docker-compose udp docker-networking firewalld

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

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

0 个答案:

没有答案