How to ship ZeroDDS to a fleet.
# Linux (after `apt install zerodds-tools`):
systemctl --user start your-zerodds-app.servicesystemd unit (user or system):
[Unit]
Description=My ZeroDDS application
After=network.target
[Service]
ExecStart=/usr/local/bin/your-app
Environment=RUST_LOG=info
Environment=ZERODDS_DOMAIN=0
Restart=on-failure
RestartSec=5
# For RT:
AmbientCapabilities=CAP_SYS_NICE
LimitRTPRIO=99
LimitMEMLOCK=infinity
[Install]
WantedBy=multi-user.targetFROM debian:bookworm-slim AS runtime
RUN apt-get update && apt-get install -y --no-install-recommends \
libssl3 ca-certificates && rm -rf /var/lib/apt/lists/*
# Bring the .deb you built earlier:
COPY zerodds-tools_*.deb /tmp/
RUN dpkg -i /tmp/zerodds-tools_*.deb && rm /tmp/zerodds-tools_*.deb
COPY ./your-app /usr/local/bin/your-app
EXPOSE 7400-7900/udp # SPDP + ephemeral RTPS
ENTRYPOINT ["/usr/local/bin/your-app"]Networking modes:
--network host— easiest, multicast just works.--network bridge— needs explicit port mapping for ephemeral ports + multicast configuration. SPDP on Docker bridges is flaky; consider unicast static peer-list (planned config).--network macvlan— assigns the container a MAC on the host L2; multicast works as if bare-metal.
DDS in K8s is non-trivial — multicast is filtered out of pod networks by default. Recommended approach:
- Deploy the DDS-bridge sidecar in
hostNetwork: truemode (it sees the L2 multicast). - Pod talks to the bridge via UDS / SHM.
A reference Helm chart lives at
pkg/k8s/zerodds-bridge/Chart.yaml (planned).
+---------+ multicast +---------+
| Host A | 239.255.0.1:7400 | Host B |
| (peer) | +================>| (peer) |
+---------+ +---------+
| |
| unicast user-data port 7401-7900|
+=================================+
Required:
- IGMP-snooping switch (or static multicast forwarding).
- Same domain ID on both peers.
- No NAT between peers (or fall back to TCP transport via
transport-tcpand a unicast static peer-list).
When multicast is disabled (typical AWS / GCP / Azure VPCs):
- Configure unicast static peer-list (planned
RuntimeConfigfield; today via custom SPDP injection). - Use TCP transport instead of UDP.
- Run the discovery server pattern (one peer with a known address that all others phone home to).
| Aspect | Recommendation |
|---|---|
| CPU | x86_64 with AES-NI + PCLMULQDQ, or ARMv8 with FEAT_AES + FEAT_PMULL. Verify with zerodds-perf hw-info |
| RAM | 256 MiB minimum — ZeroDDS itself is ~10 MiB, the rest is your application + history caches |
| Network | 1 GbE for general use, 10 GbE for high-throughput data + isolated NIC for RT deployments |
| Disk | None required — ZeroDDS is RAM-only by default unless you enable Persistent durability or recording |
- Native package installed;
zerodds-admin --versionruns. -
zerodds-perf hw-infoshows expected backend (aes-ni+pclmulqdqorarmv8-aes+pmull). - systemd unit + capabilities configured.
-
RuntimeConfig.observabilitywired to your log shipper. - Domain ID + multicast group documented in your runbook.
- Security: governance + permissions XML deployed; CA chain in place; certs renewed within 90 days.
- For RT: kernel cmdline (isolcpus + nohz_full + rcu_nocbs) verified; cyclictest baseline captured.
- Monitoring — what to watch in production.
- Troubleshooting — symptoms and fixes.