如何从 docker 容器中 'avahi-browse'?
How to 'avahi-browse' from a docker container?
我是 运行 基于 ubuntu:14.04 的容器,我需要能够在其中使用 avahi-browse
。然而:
(.env)root@8faa2c44e53e:/opt/cluster-manager# avahi-browse -a
Failed to create client object: Daemon not running
(.env)root@8faa2c44e53e:/opt/cluster-manager# service avahi-daemon status
Avahi mDNS/DNS-SD Daemon is running
我遇到的实际问题是 pybonjour
错误; pybonjour.BonjourError: (-65537, 'unknown')
但我读到这与 avahi-daemon 的问题有关。
所以;如何从容器连接到 avahi-daemon?
P.S。我必须在 avahi-daemon.conf 填充中关闭 dbus 才能启动它,否则 avahi-daemon 将无法启动,并出现如下 dbus 错误:
(.env)root@8faa2c44e53e:/opt/cluster-manager# avahi-daemon
Found user 'avahi' (UID 103) and group 'avahi' (GID 107).
Successfully dropped root privileges.
avahi-daemon 0.6.31 starting up.
dbus_bus_get_private(): Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory
WARNING: Failed to contact D-Bus daemon.
avahi-daemon 0.6.31 exiting.
Avahi 需要 D-BUS 才能与客户端通信。听起来你的 docker 容器没有启动系统 D-BUS。如果你这样做,那么 Avahi 应该可以工作。
Avahi 的大部分功能(包括 avahi-browse)都需要 D-BUS,因此禁用它并没有多大帮助。
据称容器内有一个 docker image 支持 avahi。诀窍似乎是将 /var/run/dbus 从主机挂载到容器中。
请注意,我无法在我的 16.04 上使用 运行 这张图片。主机.
我 运行 遇到了让 avahi 和 dbus 在 Ubuntu 14.04 上正确运行的相同问题(具体来说,我正在尝试使用 ROS TurtleBot)。我通过将 docker-systemd 中指令的修改版本合并到我的 Dockerfile 中解决了这个问题:
FROM ubuntu:14.04
RUN apt-get update &&\
apt-get install -y avahi-utils avahi-daemon libnss-mdns systemd
RUN cd /lib/systemd/system/sysinit.target.wants/;\
ls | grep -v systemd-tmpfiles-setup | xargs rm -f \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*; \
rm -f /lib/systemd/system/plymouth*; \
rm -f /lib/systemd/system/systemd-update-utmp*
RUN mkdir -p /var/run/dbus
ENV init /lib/systemd/systemd
修改 Dockerfile 以包含这些说明后,您应该使用以下命令创建容器:
docker run --rm --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro -it <DOCKER_IMAGE> /bin/bash
最后,一旦进入容器,在尝试使用 avahi-browse(直接或间接)之前必须执行以下命令:
$ dbus-service --system
$ /etc/init.d/avahi-daemon start
据我所知,您可以通过 Unix 套接字使用主机的 avahi-daemon 进行 mDNS 解析,/var/run/dbus 进行 avali-browse 工作。
例如:
docker run -v /var/run/dbus:/var/run/dbus -v /var/run/avahi-daemon/socket:/var/run/avahi-daemon/socket -ti debian:10-slim bash
在容器内测试:
apt-get update && apt-get install avahi-utils iputils-ping -y
ping whatever.local
avahi-browse -a
另一种解决方案是在主机上使用 mdns-repeater 将 mDNS 数据包转发到 Docker 网络
mdns-repeater eth1 docker0
我是 运行 基于 ubuntu:14.04 的容器,我需要能够在其中使用 avahi-browse
。然而:
(.env)root@8faa2c44e53e:/opt/cluster-manager# avahi-browse -a
Failed to create client object: Daemon not running
(.env)root@8faa2c44e53e:/opt/cluster-manager# service avahi-daemon status
Avahi mDNS/DNS-SD Daemon is running
我遇到的实际问题是 pybonjour
错误; pybonjour.BonjourError: (-65537, 'unknown')
但我读到这与 avahi-daemon 的问题有关。
所以;如何从容器连接到 avahi-daemon?
P.S。我必须在 avahi-daemon.conf 填充中关闭 dbus 才能启动它,否则 avahi-daemon 将无法启动,并出现如下 dbus 错误:
(.env)root@8faa2c44e53e:/opt/cluster-manager# avahi-daemon
Found user 'avahi' (UID 103) and group 'avahi' (GID 107).
Successfully dropped root privileges.
avahi-daemon 0.6.31 starting up.
dbus_bus_get_private(): Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory
WARNING: Failed to contact D-Bus daemon.
avahi-daemon 0.6.31 exiting.
Avahi 需要 D-BUS 才能与客户端通信。听起来你的 docker 容器没有启动系统 D-BUS。如果你这样做,那么 Avahi 应该可以工作。
Avahi 的大部分功能(包括 avahi-browse)都需要 D-BUS,因此禁用它并没有多大帮助。
据称容器内有一个 docker image 支持 avahi。诀窍似乎是将 /var/run/dbus 从主机挂载到容器中。
请注意,我无法在我的 16.04 上使用 运行 这张图片。主机.
我 运行 遇到了让 avahi 和 dbus 在 Ubuntu 14.04 上正确运行的相同问题(具体来说,我正在尝试使用 ROS TurtleBot)。我通过将 docker-systemd 中指令的修改版本合并到我的 Dockerfile 中解决了这个问题:
FROM ubuntu:14.04
RUN apt-get update &&\
apt-get install -y avahi-utils avahi-daemon libnss-mdns systemd
RUN cd /lib/systemd/system/sysinit.target.wants/;\
ls | grep -v systemd-tmpfiles-setup | xargs rm -f \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*; \
rm -f /lib/systemd/system/plymouth*; \
rm -f /lib/systemd/system/systemd-update-utmp*
RUN mkdir -p /var/run/dbus
ENV init /lib/systemd/systemd
修改 Dockerfile 以包含这些说明后,您应该使用以下命令创建容器:
docker run --rm --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro -it <DOCKER_IMAGE> /bin/bash
最后,一旦进入容器,在尝试使用 avahi-browse(直接或间接)之前必须执行以下命令:
$ dbus-service --system
$ /etc/init.d/avahi-daemon start
据我所知,您可以通过 Unix 套接字使用主机的 avahi-daemon 进行 mDNS 解析,/var/run/dbus 进行 avali-browse 工作。
例如:
docker run -v /var/run/dbus:/var/run/dbus -v /var/run/avahi-daemon/socket:/var/run/avahi-daemon/socket -ti debian:10-slim bash
在容器内测试:
apt-get update && apt-get install avahi-utils iputils-ping -y
ping whatever.local
avahi-browse -a
另一种解决方案是在主机上使用 mdns-repeater 将 mDNS 数据包转发到 Docker 网络
mdns-repeater eth1 docker0