在 Docker 容器中发现 Apple TV:mDNS、多播与 Avahi
在 Docker 容器中发现 Apple TV:mDNS、多播与 Avahi Disclaimer: 本文由 GPT 协助完成,人类内容高于 80%。 在智能家居中,Home Assistant (HA) 可以自动发现 Apple TV(ATV)设备。但是,当 Home Assistant 运行在 Docker 容器中,且使用 bridge 网络模式 时,发现 Apple TV 往往遇到一些奇怪的问题: HA 无法发现 ATV 容器中 atvremote scan 看不到 ATV,宿主机可以 容器中和宿主机中 avahi-browse 都能看到 ATV 本文将以解决 ATV 发现为引子,介绍 mDNS、UDP 多播、Avahi 并提供解决方案。 初步探索和假设 HA 的推荐配置会将 Avahi socket 挂载到容器内: volumes: - /var/run/avahi-daemon:/var/run/avahi-daemon - /run/dbus:/run/dbus 进行配置后,在容器内 avahi-browse -a 可以看到 ATV 设备,但是 HA 依然无法发现。 经过查阅资料,得知 avahi 是一个 zeroconf 实现,用于给其他进程提供 zeroconf 发布和发现的服务。而 zeroconf 是一些 mdns、多播…… 总之是一些不太懂有点绕的话。 此时初步怀疑 HA 可能不通过 avahi socket 查询宿主机 上的 avahi 服务,而是尝试自己直接在网络上。这些流量可能无法通过 Docker network bridge 。而宿主机上的 avahi 服务在容器外,可以直接访问本地网络,因此有正确的服务发现信息。avahi-browse虽然在容器内运行,但通过socket连接到宿主机的avahi服务,因此也有正确的信息。 验证 通过 GPT 得知发现服务应该跑在 UDP 5353 上,目标 IP 为形如 224.0.0.251 的多播 IP。通过多台网络中的非容器设备运行 wireshark 和 tcpdump 验证了这一事实,并观察到了 ATV 的广播流量。 tcpdump -i any udp port 5353 同时,在容器中 容器中 tcpdump 没有观察到任何 m...