I have network connected devices (IoT devices) responding to a UDP broadcast initiated by my containerised app. The app sends this to port 30303 of the container, but the actual port that this gets sent on the host network changes every time the app is started with docker-compose, so my app never recieves the response. See the annotated image below that depicts this behaviour.
How can I either:
Ensure that my UDP packets sent on the container port get sent on the same port on the host (in this instance, ensuring that the packets are sent on port 30303 of both the host and container); or
Ensure that my UDP packets are always sent from the same host port, so I know which host port to forward to my application container
The container is on a bridge network (it needs to communicate with 2 other containers in this setup) so I cannot resort to host mode networking. Achieving the UDP broadcast to occur on the host network without running the application in host networking mode was not straightforward to achieve with Docker’s native functionality, I used this script to allow the proper forwarding to occur.
I have bound the ports in the
docker-compose.yml file and exposed them in the build file.
I would prefer if I could achieve this with native Docker functionality (i.e. not resort to writing a host-level application that forwards the packets).
# This file is for x86-64 builds version: "3.8" services: api-server: image: myserver ports: - 5000:5000 - 30303:30303/udp expose: - "30303" networks: - my-network depends_on: - mongo - redis restart: always environment: - NODE_ENV=production build: context: . dockerfile: ./Dockerfile client: image: myclient ports: - 3000:80 restart: always environment: - NODE_ENV=production depends_on: - api-server build: context: ./client dockerfile: ./Dockerfile mongo: image: mongo:3.6.19-xenial ports: - 27017:27017 networks: - my-network volumes: - mongo-data:/data/db restart: always redis: image: redis:alpine ports: - 6379:6379 networks: - my-network restart: always networks: my-network: driver: bridge volumes: mongo-data: driver: local
FROM node:14 # Create app directory WORKDIR /usr/src/app COPY package*.json ./ RUN npm install # Bundle app source COPY . . RUN npm install -g typescript RUN npm run copy-public RUN tsc EXPOSE 5000 EXPOSE 30303 CMD [ "node", "./dist/server/src/index.js" ]