我试图在container.It内运行一个烧瓶应用程序,它与'0.0.0.0‘很好地工作,但是它会抛出我的ip地址错误。
我是公司代理人的幕后黑手。当我使用ipconfig检查我的ip地址时,它显示IP地址为:10.***.**.**,我使用的是docker工具箱,其中容器ip为172.17.0.2,VM IP地址为192.168.99.100。
我有一个烧瓶应用程序运行在这个与主机对接。
if __name__ == "__main__":
app.run(host= '0.0.0.0')效果很好。但是当我把它改为ip地址时
if __name__ == "__main__":
app.run(host= '10.***.**')抛出错误:
socket.error:errno 99无法分配请求的地址
我使用一个简单的烧瓶应用程序再次检查了ip地址,该应用程序运行在本地(即没有停靠)。
if __name__ == "__main__":
app.run(host= '10.***.**')效果很好。
所以问题只有在码头内运行时才会出现。这是因为我在运行NAT的路由器后面有内部ip地址。如何找到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发布于 2018-04-04 11:51:03
要让局域网上的其他计算机连接到您的服务,只需在0.0.0.0函数中使用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请确保在运行容器之前,主机PC上的另一个应用程序不会使用80端口。如果该端口已经在使用--指定另一个端口,例如8080
docker run -d -p 8080:80 image_name然后检查:
curl http://localhost:8080医生是这里。
发布于 2019-01-16 19:29:21
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环境修复(容器和普通安装)。
https://stackoverflow.com/questions/49643331
复制相似问题