services: ### Husarnet VPN Container for remote access husarnet: image: husarnet/husarnet restart: unless-stopped volumes: - /var/lib/husarnet # This will persist your Husarnet Client keys, thus IP of the container will be stable/the same between (re)boots sysctls: - net.ipv6.conf.all.disable_ipv6=0 # Husarnet is using IPv6 for the internal connections cap_add: - NET_ADMIN devices: - /dev/net/tun env_file: - ./husarnet/.env # create .env file in the same folder as Dockerfile and specify HOSTNAME and JOINCODE there color_controller: build: dockerfile: husarnet/Dockerfile volumes: - ./husarnet/cyclonedds.xml:/cyclonedds.xml command: - bash - -c - | export CYCLONEDDS_URI=file:///cyclonedds.xml ros2 run my_demo_pkg color_controller network_mode: service:husarnet move_controller: build: dockerfile: husarnet/Dockerfile volumes: - ./husarnet/cyclonedds.xml:/cyclonedds.xml command: - bash - -c - | export CYCLONEDDS_URI=file:///cyclonedds.xml ros2 run my_demo_pkg move_controller network_mode: service:husarnet turtle_sim: image: osrf/ros:galactic-desktop privileged: true environment: # Allows graphical programs in the container. - DISPLAY=${DISPLAY} - QT_X11_NO_MITSHM=1 - NVIDIA_DRIVER_CAPABILITIES=all volumes: # Allows graphical programs in the container. - /tmp/.X11-unix:/tmp/.X11-unix:rw - ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority - ./husarnet/cyclonedds.xml:/cyclonedds.xml command: - bash - -c - | export CYCLONEDDS_URI=file:///cyclonedds.xml ros2 run turtlesim turtlesim_node network_mode: service:husarnet # This is the most important line in this setup. This will put the Husarnet Client in the same network namespace as your app (in this example: turtle_sim)