Docker / Kubernetes / Cloud
The pain
Containerized and cloud ROS 2 multiplies the discovery problem (19 reports): container network namespaces, overlay networks, and Kubernetes CNIs do not pass UDP multicast by default, so DDS discovery silently fails across pods/containers.
- Nodes in different containers cannot discover each other without
hostnetworking or a hand-built Discovery Server. - A simulator/container can ignore the DDS config it was given and remain unreachable.
- When a host has both WiFi and Ethernet, a containerized node fails to register because the wrong interface is announced.
- Getting multicast through Kubernetes (Cilium and friends) is its own project.
Most recent example
IsaacSim#407 — “Isaac Sim in Docker unreachable and ignores CycloneDDS config” (2026-01-09). A containerized Isaac Sim instance is unreachable over ROS 2 and does not honour the Cyclone DDS configuration it was handed — discovery-in-containers failing in exactly the way the cluster predicts.
Reference list (most recent)
| Date | Source | Problem |
|---|---|---|
| 2026-01-09 | IsaacSim#407 | Container unreachable, ignores DDS config |
| 2024-10-23 | rmw_fastrtps#786 | Docker host-net node fails to register with WiFi+Ethernet |
| 2024-03-27 | ROS Discourse | Making DDS multicast work under Cilium/Kubernetes |
| 2024-02-17 | create3 discussion #549 | Discovery Server config needed for ROS 2 in Docker |
| 2024-02-14 | ROS Discourse | Discovery Server gymnastics for Kubernetes |
How ZeroDDS solves it
Unicast discovery + interface pinning is exactly the model containers and clouds want.
- No multicast required, anywhere.
ZERODDS_NO_MULTICAST=1+ZERODDS_PEERSis unicast end-to-end, which is precisely what overlay networks and Kubernetes CNIs do pass. You address pods/containers by IP/service — no multicast for the CNI to drop, no Discovery Server pod to operate. - Interface pinning fixes the multi-interface registration failure.
ZERODDS_INTERFACE=<ip>binds and announces one interface across all transports, so the “WiFi+Ethernet host in Docker fails to register” (rmw_fastrtps#786) failure is a one-variable fix. - Config is honoured, not ambient. Discovery configuration is explicit environment variables read at startup — there is no separate XML the runtime can silently ignore.
- TCP where overlays prefer it. A first-class TCP transport is available for networks that only forward TCP cleanly.
Why it no longer has to be a pain
Container/cloud pain is multicast through networks that don’t forward multicast. ZeroDDS’s default-capable unicast discovery plus interface pinning maps directly onto how container and cloud networking actually routes traffic — the deployment becomes “list the peer IPs”, not “operate a Discovery Server and fight the CNI.”
Reproduce it yourself
# Unicast, multicast-free discovery (the container/cloud model), cross-vendor:
crates/ros2-rmw/interop/run_multicast_free_xvendor.sh
→ Back to overview · Next: Security
Docker / Kubernetes / Cloud
Der Schmerz
Containerisiertes und Cloud-ROS-2 vervielfacht das Discovery-Problem (19 Reports): Container-Network-Namespaces, Overlay-Netze und Kubernetes-CNIs lassen UDP-Multicast per Default nicht durch, sodass DDS-Discovery still über Pods/Container hinweg scheitert.
- Nodes in verschiedenen Containern können sich ohne
host-Networking oder einen hand-gebauten Discovery-Server nicht entdecken. - Ein Simulator/Container kann die ihm gegebene DDS-Config ignorieren und unerreichbar bleiben.
- Wenn ein Host sowohl WiFi als auch Ethernet hat, scheitert ein containerisierter Node bei der Registrierung, weil das falsche Interface announct wird.
- Multicast durch Kubernetes (Cilium und Freunde) zu bekommen ist ein eigenes Projekt.
Jüngstes Beispiel
IsaacSim#407 — „Isaac Sim in Docker unreachable and ignores CycloneDDS config” (2026-01-09). Eine containerisierte Isaac-Sim-Instanz ist über ROS 2 unerreichbar und befolgt die ihr gegebene Cyclone-DDS-Konfiguration nicht — Discovery-in-Containern, das genau so scheitert, wie der Cluster vorhersagt.
Referenzliste (jüngste zuerst)
| Datum | Quelle | Problem |
|---|---|---|
| 2026-01-09 | IsaacSim#407 | Container unerreichbar, ignoriert DDS-Config |
| 2024-10-23 | rmw_fastrtps#786 | Docker-Host-Net-Node scheitert bei Registrierung mit WiFi+Ethernet |
| 2024-03-27 | ROS Discourse | DDS-Multicast unter Cilium/Kubernetes zum Laufen bringen |
| 2024-02-17 | create3 discussion #549 | Discovery-Server-Config nötig für ROS 2 in Docker |
| 2024-02-14 | ROS Discourse | Discovery-Server-Turnübungen für Kubernetes |
Wie ZeroDDS es löst
Unicast-Discovery + Interface-Pinning ist genau das Modell, das Container und Clouds wollen.
- Kein Multicast nötig, nirgends.
ZERODDS_NO_MULTICAST=1+ZERODDS_PEERSist Unicast end-to-end, was genau das ist, was Overlay-Netze und Kubernetes-CNIs durchlassen. Du adressierst Pods/Container per IP/Service — kein Multicast, das das CNI droppen könnte, kein Discovery-Server-Pod zu betreiben. - Interface-Pinning fixt den Multi-Interface-Registrierungs-Fehler.
ZERODDS_INTERFACE=<ip>bindet und announct ein Interface über alle Transporte, sodass der „WiFi+Ethernet-Host in Docker scheitert bei Registrierung”-Fehler (rmw_fastrtps#786) ein Ein-Variablen-Fix ist. - Config wird befolgt, nicht ambient. Discovery-Konfiguration ist explizite Umgebungsvariablen, beim Start gelesen — es gibt kein separates XML, das die Runtime still ignorieren kann.
- TCP, wo Overlays es bevorzugen. Ein First-Class-TCP-Transport ist für Netze verfügbar, die nur TCP sauber forwarden.
Warum es kein Schmerz mehr sein muss
Container-/Cloud-Schmerz ist Multicast durch Netze, die Multicast nicht forwarden. Die default-fähige Unicast-Discovery von ZeroDDS plus Interface-Pinning bildet direkt darauf ab, wie Container- und Cloud-Networking Traffic tatsächlich routet — das Deployment wird „liste die Peer-IPs”, nicht „betreibe einen Discovery-Server und kämpfe mit dem CNI”.
Selbst reproduzieren
# Unicast, multicast-freie Discovery (das Container-/Cloud-Modell), cross-vendor:
crates/ros2-rmw/interop/run_multicast_free_xvendor.sh
→ Zurück zur Übersicht · Weiter: Security