繁体   English   中英

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

[英]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:5000cat -ting的希望下载的文件( ls其次是cat file.html或者其他任何东西)。

  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. 在第一行创建了带有flask的requirements.txt文件
  3. 正如您所做的那样构建图像并运行它

它适用于我:

$ 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.

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