[英]Running Flask app in a Docker container
我已经构建了一个包含简单Flask测试应用程序的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 .
它已成功创建:
$ 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
我假设我可以通过将浏览器指向http://localhost:5000/
来测试应用程序,但是我得到了超时。 怎么可能出错?
从这里看,一切都很好看。 我们来做一些调试。
让我们从一个名称开始我们的容器开始: docker run -d -p 5000:5000 --name flask-app-test flask-app
您还可以避开-d
标志并将日志直接显示在屏幕上。
首先检查Flask应用程序是否真的在运行,或者它是否已经崩溃。 从一个简单的docker ps
(看看你是否注意到有什么奇怪的事情)然后是docker logs flask-app-test
(这些将是Flask app的日志,它崩溃了吗?有什么奇怪的吗?)
如果到这里一切都很好,那么就该进入容器了。 让我们尝试使用docker exec -ti flask-app-test bash
。 一旦你在,安装wget
通过apt-get install wget
,然后测试,如果Web服务器通过执行从内部工作wget http://localhost:5000
和cat
-ting的希望下载的文件( ls
其次是cat file.html
或者其他任何东西)。
[sudo] docker ps -qf "name=<containername>"
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container_id>
http://<the_resulting_ip>:5000/
我在我的系统上执行了以下步骤:
flask
的requirements.txt文件 它适用于我:
$ 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不是localhost,而是虚拟机的IP地址。
也许您的docker引擎没有在启动命令的同一操作系统上运行。 例如,如果您将docker与windows一起使用,则docker引擎(通常)在具有不同IP的虚拟机内运行,因此您需要编写http:// [IP虚拟机]:5000 /
在某些配置中,正确的URL是http://192.168.99.100:5000/ (因为默认情况下,在某些配置中,该虚拟机的IP地址为192.168.99.100)
在Dockerfile中缺少此部分
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.