使用Docker部署Flask项目 | Theo''s blog

Theodore Si      14 July 2019

新建一个Flask项目

目录结构

$ tree ..├── gunicorn.conf.py├── my_flask_demo│   └── __init__.py└── setup.py

__init__.py就是我们的app了,其内容如下:

from flask import Flaskapp = Flask(__name__)@app.route('/')def hello():    return 'I am running in docker!'if __name__ == '__main__':    app.run(debug=True)

也许你好奇为什么我们把程序放在了__init__.py里,这是因为对于一个大型项目,官方建议将其变为一个package,详细内容可以看这里。好吧,我承认我们的项目怎么说也不算大型…Anyway…

setup.py是用来协助Distutils对程序打包的。有了它,我们就可以通过pip来安装我们的app了。其实这里setup.py也不是必须的啦,因为我们会把项目整个COPY过去。

from distutils.core import setupsetup(name='my_flask_demo',      version='1.0',      description='This is a demo to show how to run a flask app in docker',      author='Theo Si',      author_email='theosi@outlook.com',      url='https://www.theodoresi.top',      packages=['my_flask_demo']      )

gunicorn.conf.pygunicorn的配置文件,它描述了我们的程序应该被怎样运行。

$ cat gunicorn.conf.py workers = 10worker_class = "gevent"bind = "0.0.0.0:8888"

显然,我们的程序可以被任意网络访问,并且运行在8888端口上。

在本地部署运行

创建一个新的venv并且安装依赖包:最好加入-i参数指定Base URL of Python Package Index,不然速度可能让你怀疑人生。

# 我已经在home目录中建立了venv,如果你没有,可以使用 $python3 -m venv ~/venv创建$ . ~/venv/bin/activate $ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gevent gunicorn flask wheel

尝试运行一下:

$ export FLASK_APP=my_flask_demo$ flask run

如果一切正常,你应该看到你的app已经在5000端口运行了。

然后我们用pip将我们的app安装到刚刚创建的venv中:

$ pip install .

使用gunicorn运行:

gunicorn my_flask_demo:app -c ./gunicorn.conf.py

现在我们就可以通过http://127.0.0.1:8888成功访问了!

使用docker部署运行

生成Dockerfile

首先,我们来生成requirements.txt,它描述了我们的python程序需要哪些依赖包。有了它,我们就可以无差异地克隆我们的运行环境。

$ pip freeze > requirements.txt# 只要有这三行就够了$ cat requirements.txtFlask==1.1.1gevent==1.4.0gunicorn==19.9.0

接着我们创建一个Dockerfile,文件的内容很简单,歌词大意就是以python:3这个镜像为基础,设置好working directory,但后把requirements.txt复制过去,用pip重建我们的依赖环境,然后复制我们下源代码,最后启动程序。

$ cat Dockerfile FROM python:3WORKDIR /usr/src/appCOPY . .RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir -r requirements.txtRUN pip install .CMD ["gunicorn", "my_flask_demo:app", "-c", "./gunicorn.conf.py"]

我们这里为了简单,就不再搭配Nginx什么的了。

build & run

我们最终的目录结构如下:

$ tree ..├── Dockerfile├── gunicorn.conf.py├── my_flask_demo│   └── __init__.py├── requirements.txt└── setup.py

现在我们就可以开始创建我们的image了

$ sudo docker build -t "my_flask_demo" .$ sudo docker image ls

我们应该可以看到新的image已经生成好了。那就让我们来运行一下吧!

# interactively$ sudo docker run -it --rm -p 8888:8888 my_flask_demo# 或者run in background$ sudo docker run -d -p 8888:8888 --name my_flask_demo my_flask_demo

这个时候你就可以通过http://localhost:8888访问你的app了。当你想关闭应用的时候,如果是通过-it运行的,只要Ctrl-C即可,如果是通过-d,只要运行以下命令就可以了。

$ sudo docker stop my_flask_demo
(0)

相关推荐

  • 震撼!用Python开发网站如此简单

    Flask是一个基于Python语言的微型Web框架.之所以被称为微型,是因为其核心非常小,但是该Web框架简约而不简单,具有很强的扩展能力.本文介绍如何编写和运行第一个Flask Web应用程序. ...

  • flask项目部署nginx后静态文件不显示的解决办法

    Win10下,进入nginx.conf,在监听的server下加入 location /static { alias C:\Users\ganyuning\Desktop\flask-test\sta ...

  • .NET之Docker部署详细流程

    dotNET跨平台 今天 以下文章来源于鹏祥 ,作者AZRNG 开篇语 自己从头开始走一遍docker部署.net的流程,作为一种学习总结,以及后续会写一些在该基础之上的文章. 本次示例环境:vs20 ...

  • 基于阿里云服务器Linux系统部署JavaWeb项目

    前段时间刚完成一个服务器评测JavaWeb项目,想着怎么部署到服务器评测上,边学边做,花了点时间终于成功部署了,这里总结记录一下过程中所遇到的问题及解决方法.之所以选择阿里云,考虑到它是使用用户最多也 ...

  • 使用 docker 部署 mdnice

    dotNET跨平台 昨天 以下文章来源于amazingarch ,作者WeihanLi amazingarch 了不起的架构,迷人的架构知识,架构点滴 使用 docker 部署 mdnice Intr ...

  • 系统开发中安全控制要求落地(下):上线部署、项目结项

    系统开发安全控制要求落地围绕着项目周期进行,包括项目准备.项目启动.系统设计.系统实现.上线部署.项目结项六个阶段.本篇内容包含上线部署.项目结项两个阶段的落地工作. 上线部署 1.开发遗留配置.数据 ...

  • python测试开发django-83.Dockerfile部署django项目

    前言 现在流行用 docker 部署环境,python 开发的 django 项目也可以写个 Dockefile 文件,方便docker部署. django 是依赖于python环境的,所有镜像制作是 ...

  • 超大规模计算部署:项目实施与未来发展

    作为超大规模云服务提供商,您可能正在考虑如何选择在全球市场上提供超大规模数据中心服务的合作伙伴.首先您需要在特定区域寻找超大规模计算伙伴,然后进入高度复杂的项目实施阶段.本指南将介绍这一流程的重要环节 ...

  • 怎么自己Tomcat上部署的项目让局域网中的其他人访问到?

    学习javaWeb已经一个星期了,已经可以制作一些简单的网站,这时候突然想着让自己在Tomcat上部署项目让宿舍同在一个局域网中的小伙伴访问以下,让他们看看我的学习成果.刚开始搞了半天,他们就是没有办 ...

  • 第125天:Flask 项目结构

    前面我们了解了 Flask 框架的特性和一些用法,比如创建一个简单应用.做些页面,以及增加鉴权模块等,如果要将 Flask 用于实际项目开发,还需要了解一下 Flask 项目结构. Flask 是一个 ...