繁体   English   中英

无法从 docker 访问应用程序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM