在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.html
testingWeb服务器是否从内部工作,或者不pipe它叫什么)。
- 获取容器ID:
[sudo] docker ps -qf "name=<containername>"
- 获取该容器的ip:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container_id>
- 然后连接到
http://<the_resulting_ip>:5000/
我在我的系统上执行了以下步骤:
- 复制你的烧瓶代码和你的Dockerfile
- 在第一行创build一个带有
flask
的requirements.txt文件 - 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