Как мне рекламировать и просматривать mDNS из контейнера докеров?

Я пытаюсь создать контейнер докеров на основе ubuntu 17.04, который может просматривать mDNS в моей сети (за пределами сети докеров) И размещать рекламу на mDNS в моей сети (за пределами сети докеров).

Я хочу иметь возможность запускать этот контейнер докеров на хосте macOS (во время моей разработки) И хосте Linux (Debian) для производства.

https://github.com/ianblenke/docker-avahi, похоже, решил эту проблему для хостов Linux. (с использованием демона avahi и сопоставления тома / var / run / dbus с хостом). Когда я разрабатываю на своем MacBook, я хотел бы использовать mDNSResponder.

Как мне создать контейнер, который может рекламировать и просматривать в моей локальной сети, который также будет работать на моем ноутбуке с macOS и на сервере Linux?

Вот что у меня есть на данный момент.

Dockerfile

FROM ubuntu:17.04    
WORKDIR /app

RUN apt-get update && apt-get install -yq avahi-daemon avahi-utils libnss-mdns \
  && apt-get -qq -y autoclean \
  && apt-get -qq -y autoremove \
  && apt-get -qq -y clean

RUN update-rc.d avahi-daemon enable

COPY docker/etc/nsswitch.conf /etc/nsswitch.conf
COPY docker/etc/avahi-daemon.conf /etc/avahi/avahi-daemon.conf

COPY docker/start.sh /app    

CMD ["/bin/bash","start.sh"]

start.sh

#!/bin/bash

service avahi-daemon restart
service avahi-daemon status
avahi-browse -a

nsswitch.conf

hosts: files mdns_minimal [NOTFOUND=return] dns

avahi-daemon.conf

...
enable-dbus=no
...

Бег

docker run --net=host -it mdns1
 * Restarting Avahi mDNS/DNS-SD Daemon avahi-daemon                      [ OK ]
Avahi mDNS/DNS-SD Daemon is running
Failed to create client object: Daemon not running

Как видите, avahi-daemon запущен, но avahi-browse не думает, что это так. Это потому, что я отключил dbus?

Выполнение тех же команд (за исключением того, что я сохраняю enable-dbus=yes) внутри образа виртуального бокса 17.04 на моем Mac, все работает нормально.

Обновление: похоже, вы можете не использовать мостовую сеть на хосте macOS. Итак, то, что я пытаюсь сделать, невозможно?


person rynop    schedule 19.05.2017    source источник
comment
Разве варианта --net=host недостаточно? При этом контейнер имеет доступ к интерфейсу хоста.   -  person Robert    schedule 20.05.2017
comment
Неа. Linux (ОС, которую я использую в контейнере) требует avahi-daemon, а AFAIK требует dbus. github.com/ianblenke/docker-avahi - это образ докера, который работает, если ваш хост - Linux. . Нет, если ваш хост - macOS (поскольку он не использует dbus). Или это неверное утверждение?   -  person rynop    schedule 24.05.2017
comment
К вашему сведению, мне не удалось заставить образ ianblenke работать в Linux, и, похоже, несколько других людей тоже пытались и потерпели неудачу.   -  person John Wiseman    schedule 04.04.2019


Ответы (2)


В настоящее время я пытаюсь заставить avahi работать внутри контейнера докеров, и в своих исследованиях наткнулся на это:

вы можете в конфигурации настроек Avahi отключить dbus, чтобы он не использовал его. Затем, когда вы запускаете Avahi в Docker, вы должны передать ему флаг --no-rlimits, и он будет работать без ущерба для безопасности ваших контейнеров.

https://www.reddit.com/r/docker/comments/54ufz2/is_there_any_way_to_run_avahi_in_docker_without/

Надеюсь, это поможет в вашей ситуации.

person Michal    schedule 25.05.2017
comment
Ага, пробовал, вариант enable-dbus=no. Все равно не работает. Я использую хост MacOS. Я не понимаю, почему он говорит, что вы ДОЛЖНЫ использовать --no-rlimits. Вы знаете? Похоже, это вызовет проблемы. - person rynop; 25.05.2017

Для рекламы / прослушивания mdns мы запускаем dnssd внутри контейнеров докеров.

Но! Чтобы его можно было обнаружить в локальной сети, контейнер докеров должен иметь IP-адрес из сети, должны быть настроены правильные маршруты из сети в контейнер докеров.

Если у вас нет контроля над маршрутизатором сети по умолчанию, вы можете попробовать использовать сетевой драйвер macvlan / ipvlan. Это позволит вам назначить несколько Mac / IP-адресов на одном и том же сетевом интерфейсе.

В нашем случае сеть - это Wi-Fi, поэтому нам пришлось использовать ipvlan, потому что macvlan не работает с Wi-Fi. В проводном случае вам следует предпочесть macvlan.

person kerzol    schedule 16.01.2019