在Docker上运行UPNP出现问题



我试图在我的docker容器上运行UPnP服务,使用Cling UPnP库(http://4thline.org/projects/cling/)。有一个简单的程序可以创建一个设备(在软件中)来承载一些服务。这是用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)**

对于任何发现这个并需要答案的人。

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

您可以将容器作为"主机"运行。为了使其非隔离,只需将--network host添加到容器创建命令

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

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

我使用docker-compose进行了测试。yml看起来有点不同:

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 "*/10t*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安装)来打开端口。

希望这能帮助到一些人。

编辑:这是update_upnp脚本可能看起来像:

#!/bin/bash
port=$1
protocol=$2
echo "Updating UPnP entry with port [$port] and protocol [$protocol]"
gateway=$(ip route | head -1 | awk '{print $3}')
echo "Detected gateway is [$gateway]"
# port - e.g. 80
# protocol - TCP or UDP
upnpc -e 'your-app-name' -r $port $protocol
echo "Done updating UPnP entry with port [$port] and protocol [$protocol]"

相关内容

  • 没有找到相关文章

最新更新