我正在尝试使用 Docker 设置智能家居 Raspberry Pi 来隔离系统的每个元素。但是,其中两个 Docker 使用 Avahi 在家庭网络中广播自己 - 一个包含 Homebridge,另一个包含 Shairport-Sync。
经过一番努力,我终于让 Avahi 在以下任一设备上工作:主机操作系统、Homebridge 容器或(实际上是异或)Shairport 容器。但是,当运行多个守护进程时,只有其中一个可以工作(第一个启动的守护进程)。其他的只会无休止地循环“主机名冲突,使用 HOSTNAME-n 重试”,n 接近无穷大。
有什么办法可以让它工作吗?
答案1
您的问题源于尝试从不同的网络接口两次宣传同一主机(同一 IP 地址)。
当第一个容器启动时,Avahi 通过 mDNS 公布您的存在(例如,“hostname.local.mDNS_IN A 192.168.0.10”和相关的 _service._x.hostname.local SRV 设置)。
当第二个容器启动时,新的 Avahi 会再次通过 mDNS 通告其存在。发生这种情况时,第一个 Avahi 会抱怨主机名/IP 地址已被租用。然后,第二个 Avahi 会尝试不同的主机名,以防主机名冲突。
但这不是主机名冲突,而是 IP 冲突。要实现这一点,您需要在每个服务上设置不同的 IP 接口。也就是说,在 eth0 的不同虚拟接口上为您的 raspberry 分配多个 IP,然后将每个虚拟接口绑定到不同的容器(并为每个 docker 服务使用不同的主机名)。
为了实现此功能,您需要在子网络上为 Raspberry Pi 提供多个可用的 IP。
如果您只想使用接口来广播服务(而不是浏览其他 mDNS 服务),您可以添加 iptables 规则,禁止您自己的接口之间的多播流量。