socket.error:[errno 99]无法分配请求的地址:flask和python

时间:2018-04-04 05:20:17

标签: python sockets docker flask nat

我遇到了同样的问题,例如herehere

我正在尝试在docker容器中运行一个烧瓶应用程序。它可以正常运行' 0.0.0.0'但它使用我的IP地址抛出错误

我支持公司代理。当我用ipconfig检查我的IP地址时,它显示IP地址为:10.***.**.**我正在使用docker toolbox,其中我的容器ip是172.17.0.2,VM IP地址是192.168.99.100。

我在这个带有主机

的docker中运行了一个烧瓶应用程序
if __name__ == "__main__":
    app.run(host= '0.0.0.0')

工作正常。但是当我把它改成我的IP地址时

if __name__ == "__main__":
        app.run(host= '10.***.**')

抛出错误:

  

socket.error:[errno 99]无法分配请求的地址

我用一个简单的烧瓶应用程序再次检查了ip地址,该应用程序在本地运行(即没有docker)

 if __name__ == "__main__":
            app.run(host= '10.***.**')

工作得很好。

所以只有在docker里面运行时才会出现问题。这是因为我在运行带有内部IP地址的NAT的路由器后面。我如何通过NAT找到这个内部IP地址?我已经使用端口5000为烧瓶应用程序完成了端口转发。

> iptables -t nat -A DOCKER -p tcp --dport 5000 -j DNAT --to-destination 172.17.0.2:5000
> iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --source 172.17.0.2 --destination 172.17.0.2 --dport https
> iptables -A DOCKER -j ACCEPT -p tcp --destination 172.17.0.2 --dport https

2 个答案:

答案 0 :(得分:2)

要让LAN上的其他计算机连接到您的服务,只需使用0.0.0.0功能中的app.run()地址,并将所需的端口从Docker容器中暴露给您的主机PC。

要公开您需要的端口

1)在Dockerfile中指定EXPOSE指令

2)使用-p <port_on_host>:<port_in_container>参数运行容器。

例如:

Dockerfile:

FROM ubuntu:17.10

RUN apt-get update && apt-get install -y apache2

EXPOSE 80

ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]

构建

docker build -t image_name .

执行命令

docker run -d -p 80:80 image_name

检查:

curl http://localhost

P.S。在运行容器之前,请确保主机PC上的其他应用程序未使用80端口。如果此端口已在使用中 - 请指定另一个端口,例如8080

docker run -d -p 8080:80 image_name

然后检查:

curl http://localhost:8080

文档为here

答案 1 :(得分:0)

OSError [Errno 99] - python的答案也适用于此。

如果使用IP地址但不使用主机名可以工作。

/etc/hosts中删除双重本地主机应该是解决方案。 hosts文件应如下所示(将ip映射到主机名)

127.0.0.1   localhost
127.0.1.1   your_hostname_here

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

@'Artsiom Praneuski'的答案仅与Docker配置有关,这与Docker容器设置中的所有内容有关,但未指向Python环境修复(容器和常规设置)。