套接字。错误:[errno 99]无法分配请求的地址:flask和python

套接字。错误:[errno 99]无法分配请求的地址:flask和python,python,sockets,docker,flask,nat,Python,Sockets,Docker,Flask,Nat,我有和和一样的问题 我正在尝试在docker容器中运行flask应用程序。它在“0.0.0.0”中运行正常,但在我的ip地址中抛出错误 if __name__ == "__main__": app.run(host= '10.***.**') 我支持一个公司代理。当我用ipconfig检查我的ip地址时,它显示的ip地址是:10.*.*.*.*.,我正在使用docker toolbox,其中我的容器ip是172.17.0.2,VM ip地址是192.168.99.100 我有一

我有和和一样的问题

我正在尝试在docker容器中运行flask应用程序。它在“0.0.0.0”中运行正常,但在我的ip地址中抛出错误

if __name__ == "__main__":
        app.run(host= '10.***.**')
我支持一个公司代理。当我用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.***.**')
抛出错误:

套接字。错误:[errno 99]无法分配请求的地址

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

它工作得很好

因此,只有在docker内部运行时,问题才会出现。这是因为我在一个路由器后面,这个路由器使用内部ip地址运行NAT。我如何通过NAT找到这个内部ip地址?我已经使用端口5000为flask应用程序进行了端口转发

> 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

要让LAN上的其他计算机连接到您的服务,只需使用
app.run()
函数中的
0.0.0
地址,并将所需端口从docker容器公开到主机PC

要公开端口,您需要

1) 在Dockerfile中指定
EXPOSE
指令

2) 使用
-p:
参数运行容器

例如:

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 .
运行:

检查:

curl http://localhost
另外,在运行容器之前,请确保主机PC上的另一个应用程序未使用80端口。如果此端口已在使用中-请指定另一个端口,例如
8080

docker run -d -p 8080:80 image_name
然后检查:

curl http://localhost:8080
文档是。

的答案在这里也适用

如果它使用ip地址但不使用主机名工作

/etc/hosts
中删除双本地主机应该是解决方案。主机文件应该是这样的(将ip映射到主机名)


“Artsiom Praneuski”的回答只与Docker配置有关,Docker配置在Docker容器设置中都是相关的,但没有指向Python环境修复程序(容器和正常设置)。

看起来这样的操作与Docker容器网络驱动程序()不兼容。试着改变它。其次,为什么需要指定一些IP地址而不是0.0.0.0,这意味着“侦听所有接口”?因此,如果您需要在LAN上访问应用程序,可以使用0.0.0.0,并使用127.0.0.1仅从localhost访问您的服务。我希望其他计算机连接到此api。有没有办法用“0.0.0.0”或“127.0.0.1”这样做?是的,让局域网上的其他计算机连接到您的服务只需使用app.run()中的
0.0.0
地址函数并将所需端口从docker容器公开到主机PC。要公开端口,需要1)在Dockerfile中指定
expose
指令,2)使用
-p:
运行容器。在这里你可以找到一个简单的例子:让我知道我是否可以发布这个评论作为你问题的答案。我知道了。非常感谢。
curl http://localhost:8080
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