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

时间:2017-01-19 21:53:29

标签: python docker flask

我已经构建了一个包含简单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/来测试应用程序但是我会超时。可能出现什么问题?

5 个答案:

答案 0 :(得分:4)

从这里看,一切都很好看。我们来做一些调试。

让我们从一个名字开始我们的容器开始: 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。进入后,按wget安装apt-get install wget,然后通过执行wget http://localhost:5000cat测试网络服务器是否在内部运行 - 希望下载的文件({{ 1}}后跟ls,或其他任何内容。

答案 1 :(得分:3)

  1. 获取容器ID:
  2. [sudo] docker ps -qf "name=<containername>"

    1. 获取容器ip:
    2. docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container_id>

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

答案 2 :(得分:1)

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

  1. 复制烧瓶代码和Dockerfile
  2. 在第一行创建了一个flask的requirements.txt文件
  3. 构建图像并运行它,就像你已经完成的那样
  4. 它对我很好:

    $ 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地址。

答案 3 :(得分:1)

也许您的docker引擎没有在启动命令的同一操作系统上运行。例如。如果您将docker与windows一起使用,则docker引擎(通常)在具有不同IP的虚拟机内运行,因此您需要编写http://[IP虚拟机]:5000 /

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

答案 4 :(得分:0)

在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 build -t flaskapp:latest .
#flask runs in default port 5000
docker run -d -p 5000:5000 flaskapp