socket.Error:[ERRNO 99]无法分配请求的地址:烧瓶和Python



我在这里和这里有相同的问题

我正在尝试在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.***.**')

它工作正常。

因此,只有在码头机内运行时,问题才出现。那是因为我在一个带有内部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

让LAN上的其他计算机连接到您的服务,只需在app.run()功能中使用0.0.0.0地址,然后将所需端口从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

文档在这里。

Oserror [Errno 99]的答案 - Python也适用于这里。

如果它使用IP地址但不使用主机名。

/etc/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环境修复(容器和正常设置(。

最新更新