我正在尝试在docker容器内运行一个flask应用程序。当使用'0.0.0.0'时可以正常工作,但使用我的ip地址时会出现错误。
我在公司代理后面。当我使用ipconfig检查我的ip地址时,它显示为:10.***.**.**
,而我使用的是docker工具箱,我的容器ip为172.17.0.2,VM IP地址为192.168.99.100。
我有一个flask应用程序在此docker中运行,主机为
if __name__ == "__main__":
app.run(host= '0.0.0.0')
工作正常。但当我将其更改为我的IP地址时
if __name__ == "__main__":
app.run(host= '10.***.**')
出现错误:
socket.error:[errno 99] 无法分配请求的地址
我使用一个简单的 Flask 应用程序再次检查了 IP 地址,该应用程序在本地运行(即不使用 Docker)。
if __name__ == "__main__":
app.run(host= '10.***.**')
它正常工作。
所以问题只出现在 Docker 中运行时。这是因为我在路由器后面运行 NAT,使用内部 IP 地址。如何使用 NAT 找到此内部 IP 地址?我已经为 Flask 应用程序进行了端口转发,端口为 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
0.0.0.0
地址,并将所需端口从docker容器暴露到宿主PC。要暴露端口,您需要1)在Dockerfile中指定EXPOSE
指令,并且2)以-p <port_on_host>:<port_in_container>
运行容器。在这里,您可以找到简单的示例:https://docs.docker.com/engine/reference/builder/#expose 请告诉我是否可以将此评论作为您问题的答案发布。 - Artsiom Praneuski