无法在Docker上运行UPNP

时间:2015-06-06 00:31:53

标签: java docker containers upnp android-cling

我尝试使用Cling UPNP库(http://4thline.org/projects/cling/)在我的docker容器上运行UPnP服务。有一个简单的程序可以创建一个托管某些服务的设备(在软件中)。这是用Java编写的,当我尝试运行程序时,我得到以下异常(注意:这在我的Ubuntu机器上运行完全正常)

Jun 5, 2015 1:47:24 AM org.teleal.cling.UpnpServiceImpl <init>
INFO: >>> Starting UPnP service...
Jun 5, 2015 1:47:24 AM org.teleal.cling.UpnpServiceImpl <init>
INFO: Using configuration: org.teleal.cling.DefaultUpnpServiceConfiguration
Jun 5, 2015 1:47:24 AM org.teleal.cling.transport.RouterImpl <init>
INFO: Creating Router: org.teleal.cling.transport.RouterImpl
Exception occured: org.teleal.cling.transport.spi.InitializationException: Could not discover any bindable network interfaces and/or addresses
org.teleal.cling.transport.spi.InitializationException: **Could not discover any bindable network interfaces and/or addresses
    at org.teleal.cling.transport.impl.NetworkAddressFactoryImpl.<init>(NetworkAddressFactoryImpl.java:99)**

1 个答案:

答案 0 :(得分:0)

对于发现此问题并需要答案的任何人。

您的容器遮盖了您的外部网络。 换句话说,默认情况下,容器是隔离的,无法看到外部网络,这当然是打开IGD中端口所必需的。

您可以将容器作为“主机”运行,以使其不孤立,只需在容器创建命令中添加--network host

示例(摘自https://docs.docker.com/network/network-tutorial-host/#procedure):

docker run --rm -d --network host --name my_nginx nginx

我已经使用 docker-compose (它看起来有点不同)进行了测试:

version: "3.4"
services:
  upnp:
  container_name: upnp
  restart: on-failure:10
  network_mode: host  # works while the container runs
  build:
    context: .
    network: host  # works during the build if needed

版本3.4非常重要,否则network: host将无法正常工作!

我的upnp容器Dockerfile如下所示:

FROM alpine:latest

RUN apk update
RUN apk add bash
RUN apk add miniupnpc

RUN mkdir /scripts
WORKDIR /scripts
COPY update_upnp .
RUN chmod a+x ./update_upnp

# cron to update each UPnP entries every 10 minutes
RUN echo -e "*/10\t*\t*\t*\t*\tbash /scripts/update_upnp 8080 TCP" >> /etc/crontabs/root

CMD ["crond", "-f"]

# on start, open needed ports
ENTRYPOINT bash update_upnp 80 TCP && bash update_upnp 8080 TCP

update_upnp脚本只是使用upnpc(在上面的Dockerfile中作为miniupnpc安装)打开端口。

希望这会对某人有所帮助。