与 Docker 容器之间的 mDNS

Naf*_*Kay 9 avahi docker mdns

我制作了一个 Docker 容器,它运行一个forked-daapd(通过 mDNS 发布的 DAAP 服务器,使用单个端口 3689 用于 HTTP 请求)并将端口正确公开给主机操作系统:

sudo docker run -it --rm -v /home/naftuli/Music:/srv/music -p 3689:3689 \
    daapd /sbin/my_init
Run Code Online (Sandbox Code Playgroud)

问题是这个服务永远不会正确发布到 mDNS,因为它的 IP 地址(一些内部 Docker IP 范围)实际上不起作用。我可以用 运行它--net=host,但这可能非常危险,因为我基本上是将我的网络适配器交给容器。

有没有办法让我发布此服务并按计划进行映射工作?

小智 4

docker化 mDNS 服务(例如Avahi等)的问题是服务应该知道其公共 IP 地址才能进行广告。据我所知,解决这个问题的唯一方法是将公共 IP 分配给容器(由于Docker 中缺乏对静态 IP 分配的支持,这有点棘手)。

本文描述了如何在Debian上完成此操作的技术:

  1. Docker 服务应该以DOCKER_OPTS="--bridge=br0 --ip-masq=false --iptables=false". 我假设br0桥已经配置好了。

  2. 容器应该以--cap-add=NET_ADMIN --net=bridge

  3. 内部容器pre-up ip addr flush dev eth0in/etc/network/interfaces可用于取消 Docker 分配的 IP 地址,如下例所示:


auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    pre-up ip addr flush dev eth0
    address 192.168.0.249
    netmask 255.255.255.0
    gateway 192.168.0.1
Run Code Online (Sandbox Code Playgroud)
  1. 容器的入口脚本应以/etc/init.d/networking start. 此外,入口脚本需要编辑或填充/etc/hosts文件,以便删除对 Docker 分配的 IP 的引用。