mDNS para / de um contêiner do Docker

9

Eu criei um contêiner Docker que executa um forked-daapd(um servidor DAAP publicando sobre mDNS com uma única porta 3689 para solicitações HTTP) e expõe a porta corretamente ao sistema operacional host:

sudo docker run -it --rm -v /home/naftuli/Music:/srv/music -p 3689:3689 \
    daapd /sbin/my_init

O problema é que esse serviço nunca é publicado corretamente no mDNS porque seu endereço IP (algum intervalo de IP interno do Docker) realmente não funciona. Eu poderia executá-lo --net=host, mas isso é potencialmente muito perigoso, pois estou basicamente entregando meu adaptador de rede ao contêiner.

Existe uma maneira de publicar este serviço e ter o trabalho de mapeamento conforme planejado?

Naftuli Kay
fonte

Respostas:

3

O problema de ancoragem de serviços mDNS (por exemplo, Avahi etc.) é que o serviço deve estar ciente de seu endereço IP público para publicá-lo. Tanto quanto sei, a única maneira de resolver esse problema é atribuir IP público ao contêiner (o que é um pouco complicado devido à falta de suporte à atribuição de IP estático no Docker).

Este artigo descreve a técnica de como isso pode ser feito no Debian :

  1. O serviço Docker deve ser iniciado com DOCKER_OPTS="--bridge=br0 --ip-masq=false --iptables=false". Presumo que a br0ponte já esteja configurada.

  2. O contêiner deve ser iniciado com --cap-add=NET_ADMIN --net=bridge

  3. O container interno pre-up ip addr flush dev eth0in /etc/network/interfacespode ser usado para descartar o endereço IP atribuído pelo Docker, como no exemplo a seguir:


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
  1. O script de entrada do contêiner deve começar com /etc/init.d/networking start. O script de entrada também precisa editar ou preencher o /etc/hostsarquivo para remover referências ao IP atribuído ao Docker.
Onlyjob
fonte