[英]socket.error:[errno 99] cannot assign requested address : flask and python
我正在嘗試在docker容器中運行flask應用程序,可以在'0.0.0.0'下正常運行,但是我的IP地址會拋出錯誤
我在公司代理后面。 當我使用ipconfig檢查我的IP地址時,它顯示的IP地址為: 10.***.**.**
並且我正在使用docker toolbox,其中我的容器ip為172.17.0.2,VM IP地址為192.168.99.100。
我有一個帶有主機的docker內部運行的flask應用
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內部運行時才出現。 那是因為我在使用內部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.0
地址, app.run()
所需的端口從app.run()
容器公開到主機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
PS在運行容器之前,請確保主機PC上的另一個應用程序未使用80端口。 如果此端口已在使用中,請指定另一個端口,例如8080
:
docker run -d -p 8080:80 image_name
然后檢查:
curl http://localhost:8080
文件在這里 。
OSError [Errno 99]的答案-python在這里也適用。
如果使用IP地址但不使用主機名可以工作。
解決方案應在/etc/hosts
刪除雙本地/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環境修復(容器和常規設置)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.