Limit the Ephemeral Port Range that ROS uses to make XMLRPC Socket Connection
I am working on a project that will require two Robot Operating System (ROS) nodes running in separate containers on separate hosts on separate LANs to communicate over a router. The issue I am having is that ROS uses XMLRPC to open up a dynamic ephemeral port on the host to establish a socket connection between publisher & subscriber nodes. The Docker container that each of the ROS nodes run in has a local port range in the proc/sys/net/ipv4/iplocalport_range from 32768-60999. I will need to bind the container port to the local host port in order for the two ROS nodes to communicate. Unfortunately, this will require that I bind 28231 ports at docker run command in order to ensure that ROS dynamically chooses an exposed and binded port to communicate over the network. I would like to limit the ephemeral port range that ROS uses to create XMLRPC connection between publisher & subscriber to allow for efficient use of ROS and docker, especially when quickly spinning up new containers for high availability. Below are what I have done thus far:
run docker swarm on each of the hosts to communicate over the docker overlay bridge in Dockerfile--EXPOSE 32768-33768 bind to host--docker run -it --rm -p 32768-33768:32768-33768
looking in the proc/sys/net/ipv4/iplocalport_range the ephemeral port range is read only from 32768-60999
I am running ubuntu 14.04 LTS, Docker v1.12, ROS Indigo Base
Any help in limiting the Ephemeral Port Range that ROS uses to make XMLRPC Socket Connection between publisher & subscriber?
Asked by lanaki on 2016-10-08 08:43:20 UTC
Answers
I haven't yet had the chance to do a lot with docker swarm and ROS since the Software Defined Network overhaul in docker/libkv a while ago, been a bit busy. But from what I remember is that you could attach two containers running from separate host (if the docker engines on those host are part of the same swarm) to a new SDNetwork you define. This is network attaching is done in the deployment example in the docs on the DockerHub ROS repo, but for only for one engine.
https://hub.docker.com/_/ros/
If you want to achieve the same effect but with containers running on separate engines, you need to express this to the docker swarm master that is launching the containers on the swarm cluster. https://docs.docker.com/swarm/networking/ https://docs.docker.com/engine/reference/commandline/network_connect/
There should be no need to muck about with manual port mapping.
Asked by ruffsl on 2016-10-15 00:27:47 UTC
Comments
Based on the docker swarm doc, for the containers communication in docker swarm, an overlay network should be built. However, I tried the docker swarm mode with an overlay network, but the ros containers in different machine cannot find each other. But the containers on th same machine are fine.
Asked by onlytailei on 2017-05-25 05:20:13 UTC
It there anything special to set except the overlay network? Cause I once deployed some other tasks in docker swarm with overlay network. The containers on separate engines can communicate with each other based on their node name. But why ros cannot?
Asked by onlytailei on 2017-05-25 05:22:22 UTC
Oh sorry, it's the problem of docker, I just make it work.
Asked by onlytailei on 2017-05-25 08:01:20 UTC
I'm experiencing the same issues. What did you do to resolve this?
Asked by travipross on 2020-10-14 11:18:05 UTC
Comments