在Docker容器中运行Flask应用程序

我已经构build了一个包含一个简单的Flasktesting应用程序的Docker镜像:

from flask import Flask app = Flask(__name__) @app.route("/") def hello_world(): return "Hello World!" if __name__ == "__main__": app.run(debug=True,host='0.0.0.0') 

使用Dockerfile

 FROM ubuntu:latest RUN apt-get update -y RUN apt-get install -y python-pip python-dev build-essential COPY . /app WORKDIR /app RUN pip install -r /app/requirements.txt ENTRYPOINT ["python"] CMD ["app.py"] 

Docker镜像是使用docker build -t flask-app . 并已成功创build:

 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE flask-app latest fab0d79fd7ac 8 minutes ago 642.2 MB ubuntu latest 104bec311bcd 5 weeks ago 129 MB 

我已经运行它使用:

 $ docker run -d -p 5000:5000 flask-app e92b249dd02ca44489069b783fa9be713c7a14ea893061194e37c80f16d8c931 

我假设我可以testing应用程序通过指向浏览器http://localhost:5000/但我得到一个超时。 有什么可能出错?

一切从这里看起来都不错。 让我们做一些debugging。

让我们开始我们的容器的名字: docker run -d -p 5000:5000 --name flask-app-test flask-app

您也可以避免使用-d标志并将日志直接放到屏幕上。

首先检查Flask应用程序是否真的在运行,或者是否已经崩溃。 从一个简单的docker ps (看看你是否注意到有什么奇怪的东西),然后是docker logs flask-app-test (这些将是Flask应用程序的日志,崩溃了吗?有什么奇怪的吗?

如果在这里一切都很好,那么是时候进入容器了。 让我们尝试使用docker exec -ti flask-app-test bash 。 进入之后,通过apt-get install wget ,然后通过执行wget http://localhost:5000并通过search希望下载的文件( ls后跟cat file.htmltestingWeb服务器是否从内部工作,或者不pipe它叫什么)。

  1. 获取容器ID:

[sudo] docker ps -qf "name=<containername>"

  1. 获取该容器的ip:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container_id>

  1. 然后连接到http://<the_resulting_ip>:5000/

我在我的系统上执行了以下步骤:

  1. 复制你的烧瓶代码和你的Dockerfile
  2. 在第一行创build一个带有flask的requirements.txt文件
  3. build立图像并运行,就像你做的那样

这对我来说很好:

 $ curl localhost:5000 Hello World! 

docker进程没有问题,日志结帐罚款:

  $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0c0228a88719 flask-app "python app.py" 25 seconds ago Up 24 seconds 0.0.0.0:5000->5000/tcp frosty_borg $ docker logs 0c0228a88719 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger pin code: 216-035-222 172.17.0.1 - - [22/Jan/2017 12:56:37] "GET / HTTP/1.1" 200 - 

当你启动你的docker容器时,检查它是否是监听端口5000.例如,在我的系统上:

  $ netstat -atn | grep 5000 tcp6 0 0 ::1.5000 *.* LISTEN tcp4 0 0 *.5000 *.* LISTEN $ docker stop 0c0228a88719 0c0228a88719 $ netstat -atn | grep 5000 $ # stops listening 

重要的是,你如何运行dpcker,它是在Linux台式机上本地运行的? 还是在Mac / Windows主机上的Linux虚拟机中运行它(通过诸如docker机或其他方法的服务)? 如果是这样的话,问题可能是您应该访问的IP不是本地主机,而是虚拟机的IP地址。

也许你的docker引擎不是在启动你的命令的同一个操作系统上运行的。 例如,如果您使用docker与windows,docker引擎(通常)运行在具有不同IP的虚拟机中,所以您需要编写http:// [IP虚拟机]:5000 /

在某些configuration中,正确的URL是http://192.168.99.100:5000/ (因为默认情况下,在某些configuration中,该虚拟机的IP地址是192.168.99.100)

在Dockerfile中缺less这部分

 COPY ./requirements.txt /app/requirements.txt Add this line to your Dockerfile before 

app.py

 from flask import Flask app = Flask(__name__) @app.route("/") def hello_world(): return "Hello World!" if __name__ == "__main__": app.run(debug=True,host='0.0.0.0') 

requirements.txt

 Flask==0.10.1 #or it can be any version 

Dockerfile

 FROM ubuntu:16.04 MAINTANER Your Name "youremail@domain.tld" RUN apt-get update -y && \ apt-get install -y python-pip python-dev #your Dockerfile is missing this line COPY ./requirements.txt /app/requirements.txt WORKDIR /app RUN pip install -r requirements.txt COPY . /app ENTRYPOINT [ "python" ] CMD [ "app.py" ] 

docker命令来运行

 docker build -t flaskapp:latest . #flask runs in default port 5000 docker run -d -p 5000:5000 flaskapp