mDNS в / из контейнера Docker

9

Я создал контейнер Docker, который запускает forked-daapd(сервер DAAP, публикующий по mDNS с одним портом 3689 для HTTP-запросов) и правильно отображает порт для операционной системы хоста:

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

Проблема в том, что эта служба никогда не публикуется должным образом в mDNS, потому что ее IP-адрес (некоторый внутренний диапазон IP-адресов Docker) на самом деле не работает. Я мог бы запустить его --net=host, но это потенциально довольно опасно, поскольку я в основном передаю свой сетевой адаптер контейнеру.

Есть ли способ для меня, чтобы опубликовать этот сервис и сделать картографическую работу, как запланировано?

Нафтули Кей
источник

Ответы:

3

Проблема докеризации сервисов mDNS (например, Avahi и т. Д.) Заключается в том, что сервис должен знать свой публичный IP-адрес, чтобы рекламировать его. Насколько мне известно, единственный способ решить эту проблему - назначить общедоступный IP-адрес для контейнера (что немного сложнее из-за отсутствия поддержки статического назначения IP-адресов в Docker).

В этой статье описывается техника, как это можно сделать в 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 eth0в /etc/network/interfacesможет быть использован , чтобы закрыть 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
  1. Скрипт входа в контейнер должен начинаться с /etc/init.d/networking start. Также сценарий ввода должен отредактировать или заполнить /etc/hostsфайл, чтобы удалить ссылки на назначенный Docker IP.
Onlyjob
источник