![](/img/trans.png)
[英]`new HttpRequestMessage(…)` in docker application cannot access internet?
[英]Cannot access application from docker
我是 Docker 的新手,并试图将我的 python 应用程序放入一个图像中以与同事共享。 我可以构建它并且可以运行(下面是应用程序输出),但是我无法从浏览器访问它。
这是 Dockerfile:
FROM larsklitzke/mysql-python3.5:latest
RUN mkdir /home/app
COPY . /home/app
RUN pip install boto3
RUN pip install -U flask
RUN pip install requests
RUN pip install Cython
RUN pip install numpy
RUN pip install pandas
WORKDIR /home/app/src
CMD ["python", "/home/app/src/app_web.py"]
我使用以下命令构建了映像: docker build -t leonardo/python-app
。
然后我使用docker run -p 5000:5000 --name app leonardo/python-app
,它生成以下输出:
* Serving Flask app "app_web" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 200-336-459
当我尝试使用http://127.0.0.1:5000/
访问应用程序时没有任何反应。
当我运行docker network ls
,有 3 个网络。 其中之一显示了指向我的应用程序的容器节点,它是一个不同的 IP 地址 (172.17.0.2)。 但也不适用于此 IP。
我的设置有什么问题?
127.0.0.1 表示“本地机器”。
容器在它们自己的网络命名空间中运行。 所以每个容器(默认情况下)都有自己的 127.0.0.1,与主机 127.0.0.1 分开。
就像您在计算机 A 上侦听 127.0.0.1 并连接到计算机 B 上的 127.0.0.1 一样,它不会工作,与容器类似。
解决方案是侦听容器的外部 IP,这是当您使用-p 5000:5000
进行端口转发时 Docker 转发流量的地方。 在您的情况下,这是 172.17.0.2。 但是,外部 IP 可以在容器重新启动时更改,因此侦听外部 IP 的最简单方法是侦听0.0.0.0
,这意味着“侦听所有接口”。
您这样做的方法是使用 Flask 应用程序的run()
方法的参数: app.run(host='0.0.0.0')
。
更长的版本,带有方便的图表: https : //pythonspeed.com/articles/docker-connection-refused/
在您的 Python 应用程序中,您将绑定到127.0.0.1
处的 localhost 接口,该接口无法从容器外部访问。 将其更改为0.0.0.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.