如何从 docker 容器中宣传和浏览 mDNS?
Posted
技术标签:
【中文标题】如何从 docker 容器中宣传和浏览 mDNS?【英文标题】:How do I advertise AND browse mDNS from within docker container? 【发布时间】:2017-10-20 01:25:03 【问题描述】:我正在尝试创建一个基于 ubuntu 17.04 的 docker 容器,该容器可以浏览我的网络(docker 网络之外)上的 mDNS,并在 mDNS 上向我的网络(docker 网络之外)做广告。
我希望能够在 macOS 主机(在我的开发过程中)和 Linux (Debian) 主机上运行此 docker 容器以进行生产。
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 吗?
在我的 mac 上的 17.04 virtualbox 映像中运行相同的命令(除了我保留 enable-dbus=yes
)一切正常。
更新:看来您可以not do bridged networking on a macOS 主持。那么我想做的事情是不可能的吗?
【问题讨论】:
--net=host
选项还不够吗?这样容器就可以访问主机接口了。
不。 Linux(我在容器中运行的操作系统)需要 avahi-daemon,AFAIK 需要 dbus。 github.com/ianblenke/docker-avahi 是一个 docker 镜像,如果你的主机是 linux 就可以工作。如果您的主机是 macOS(因为它不使用 dbus),则不会。或者这是一个不正确的断言?
仅供参考,我无法让 ianblenke 映像在 linux 中工作,而且似乎其他几个人也尝试过但失败了。
【参考方案1】:
我目前正在尝试让 avahi 在 docker 容器中工作,并且在我的研究中遇到了这个问题:
您可以在 Avahi 设置配置中禁用 dbus,这样它就不会 用它。然后,当您在 Docker 中运行 Avahi 时,您必须将其传递给 --no-rlimits 标志,它可以在不影响容器安全性的情况下工作。
https://www.reddit.com/r/docker/comments/54ufz2/is_there_any_way_to_run_avahi_in_docker_without/
希望这对您的情况有所帮助。
【讨论】:
是的,我试过了,选项是enable-dbus=no
。还是不行。我在 macOS 主机上。我不明白他为什么说你必须使用--no-rlimits
。你知道吗?似乎这会导致问题。【参考方案2】:
对于 mdns 广告/收听,我们运行 dnssd 在码头集装箱内。
但是!为了在本地网络上被发现 docker 容器应该有一个来自网络的 IP 地址,应该配置从网络到 docker 容器的正确路由。
如果您无法控制网络的默认路由器, 您可以尝试使用 macvlan/ipvlan 网络驱动程序。 它将允许您在同一网络接口上分配多个 mac/IP 地址。
在我们的例子中,网络是 wifi,所以我们必须使用 ipvlan,因为 macvlan 不适用于 wifi。在有线情况下,您应该更喜欢 macvlan。
【讨论】:
您能否为 docker-compose 文件添加一个示例网络配置作为起点?以上是关于如何从 docker 容器中宣传和浏览 mDNS?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 docker 容器中获取 docker 主机的 IP 地址