当前位置: 首页 > SEO学院SEO知识

在Docker上部署Python的Flask框架教程

来源:未知 浏览量:154次

本文中我将尝试展示用Docker开发python应用(主要是Web应用)的可行方法。虽然我本人专注于Python的Flask微框架但本文目的是演示如何通过Docker更好地开发和共享应用程序保定网站优化但本文目的是演示如何通过Docker更好地开发和共享应用程序(由任何语言和框架开发的应用程序)。Docker通过封装依赖项大大减少了开发环境和正式产品的差距。

大多数Python开发人员在开发中使用virtualenv。它提供了一种易用的机制让应用程序使用自己专用的依赖项这些依赖项可能与在其它应用程序或操作系统存在冲突(尤其是不同的Pyhton版本还有不同的库版本等等)。个人而言我对virtualenv一直没有太大兴趣原因如下:

在Docker上部署Python的Flask框架的教程

那么怎么做Docker才能变得更好呢?Docker本质上提供了非常轻量化的VMs(在说法上可以称为“容器”)我们可以使用其创建一个高标准隔离并能大大减少失配的开发和产品环境。(如果你不熟悉Docker却还想学习更多你可以查看我在爱丁堡技术座谈会上介绍Docker的谈话)。

当我们建立一个小型的可视化Web APP我自己和Mark Coleman使用这种方法(文档在这)。这(里面)划出了一个基本镜像安装Python 2.7还有一些Flask管理以及PostgreSQL的内容。我会依据这个镜像去开发一个hello world的Web应用。我假设你是在Linux上开发并且你已经有git还安装了DockerMacOS的指令应该非常类似。通过克隆和建立基本镜像开始:

在Docker上部署Python的Flask框架的教程

创建一个具有下列结构的新项目:

代码如下:
├── Dockerfile
├── example_app
│ ├── app
│ │ ├── __init__.py
│ │ └── views.py
│ └── __init__.py
├── example_app.wsgi

或者克隆该地址的示例项目: https://github.com/amouat/example_app.git

在example_app/app/_init_.py中写入:

from flask import Flask app = Flask(__name__)from app import views

使另一个_init_.py为空。在views.py中写入:

from app import app @app.route('http://www.qhdseo.net/')@app.route('/index')def index(): return "Hello, World!"

以上就是我们的一个hello world应用的最小flask版本。我在 这个教程中也使用过类似的代码所以如果你刚刚接触Flask或者Python你可以根据上述提到的教程使用Docker而不是virtualenv继续学习。

为了使之运行在Docker容器内部我们还需要做一些操作。在我们的实例Apache服务器中example_app.wsgi文件包含了连接Python代码和web服务器的指令。该文件应当包含下列内容:

import sitesite.addsitedir('/opt/example_app/')from app import app as application

最终我们需要一个Dockerfile来构建容器并运行容器。在我们的实例中它看起来是这样的:

FROM python_webapp MAINTAINER amouat ADD example_app.wsgi /var/www/flaskapp/flaskapp.wsgiCMD service apache2 start tail -F /var/log/apache2/error.log

ADD那行为启动WSGI注入了一些代码。CMD那行在启动容器启动apache web服务器时获取任何可能的错误信息并将其发送至stdout。

如果你下列操作:

$ docker build -t example_app .$ docker run -p 5000:5000 -v $(pwd)/example_app:/opt/example_app/ -i -t example_app

你应当会得到这样的回馈:通过浏览器打开地址localhost:5000你会看到你的网站正在运行。如果你实在VM或者vagrant中运行记得打开5000端口。

现在我们运行了web服务器已经非常接近我们在产品中使用的东西了(我有意的使用Apache来做这点而不是Python默认的web服务器)。我们通过从主机向容器映射的方式向容器中注入代码;也可以在Dockerfile命令行中是用ADD来添加代码但那样的话当我们队代码进行改动时每次都需要重新构建容器。

!flask/bin/pythonfrom app import appapp.run(debug = True, host='0.0.0.0')

展开全部内容