在Docker上部署Python的Flask框架的教程
作者:goldensun 发布时间:2023-03-27 02:55:38
本文中,我将尝试展示用Docker开发python应用(主要是Web应用)的可行方法。虽然我本人专注于Python的Flask微框架,但本文目的是演示如何通过Docker更好地开发和共享应用程序,(由任何语言和框架开发的应用程序)。Docker通过封装依赖项,大大减少了开发环境和正式产品的差距。
大多数Python开发人员在开发中使用virtualenv。它提供了一种易用的机制让应用程序使用自己专用的依赖项,这些依赖项可能与在其它应用程序或操作系统存在冲突(尤其是不同的Pyhton版本,还有不同的库版本等等)。个人而言,我对virtualenv一直没有太大兴趣,原因如下:
我经常忘记启用它,或者在切换工程时忘记切换它,这会遇到含糊的出错信息,另人倍感困惑。
它无法提供“纯粹的”隔离,只能是Python级别的隔离(系统库和非python的依赖项仍然会出问题)。
我通常不想在正式产品中运行它,这就意味着在开发环境和正式产品的不一致。
它让人感觉有点“黑客”作法:它是依靠修改脚本和设置新路径实现的。
( 查看 pythonrants的这篇文章 了解更多为什么你可能不想用virtualenv )
那么,怎么做Docker才能变得更好呢?Docker本质上提供了非常轻量化的VMs(在说法上可以称为“容器”),我们可以使用其创建一个高标准隔离并能大大减少失配的开发和产品环境。(如果你不熟悉Docker,却还想学习更多,你可以查看我在爱丁堡技术座谈会上介绍Docker的谈话)。
当我们建立一个小型的可视化Web APP,我自己和Mark Coleman使用这种方法(文档在这)。这(里面)划出了一个基本镜像安装Python 2.7,还有一些Flask管理以及PostgreSQL的内容。我会依据这个镜像去开发一个hello world的Web应用。我假设你是在Linux上开发,并且你已经有git,还安装了Docker,MacOS的指令应该非常类似。通过克隆和建立基本镜像开始:
$ git clone https://github.com/mrmrcoleman/python_webapp
$ docker build -t python_webapp .
现在,我们需要为容器中添加一些代码并详细写明。我们打算新建一个仅仅指向Docker镜像的项目来完成这项工作,而不是直接修改之前的项目。
创建一个具有下列结构的新项目:
├── 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('/')
@app.route('/index')
def index():
return "Hello, World!"
为了使之运行在Docker容器内部,我们还需要做一些操作。在我们的实例Apache服务器中,example_app.wsgi文件包含了连接Python代码和web服务器的指令。该文件应当包含下列内容:
import site
site.addsitedir('/opt/example_app/')
from app import app as application
最终,我们需要一个Dockerfile来构建容器并运行容器。在我们的实例中,它看起来是这样的:
FROM python_webapp
MAINTAINER amouat
ADD example_app.wsgi /var/www/flaskapp/flaskapp.wsgi
CMD 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来添加代码,但那样的话当我们队代码进行改动时,每次都需要重新构建容器。
然而,这仍然不是很好 ;开发中我们真的希望使用很大程度上帮助我们调试的Python web服务器。该高兴的是我们不用对Dockerfile进行任何修改。在example_app文件从创建一个run.py文件开始,按照一下内容:
!flask/bin/python
from app import app
app.run(debug = True, host='0.0.0.0')
这将启动Python的带调试的web服务器并监听所有连接,我们也能从容器外访问。现在用下列命令重启容器:
$ docker run -p 5000:5000 -v $(pwd)/example_app:/opt/example_app/ -i -t example_app python /opt/example_app/run.py
你能看到网页又运行了。这次我们显式地提供运行的命令("python /opt/example_app/ryn.py"),它覆盖了Dockerfile中的CMD行的设置。现在如果编辑在主机上的源程序,就能马上看到网页上的改变。
让我们花点时间看看我们的收获:
一个运行在隔离容器中的web应用,容器完全封装了应用的Python依赖项和系统依赖项。
能够使用现有编辑器或IDE开发代码并直接查看变化,就像在本地编辑一样。
比以前更接近正式产品的运行环境。
没有使用virtualenv。
如果你想知道如何以这种方式建立程序发布的途径,可以看看Mark Coleman写的关于前面提到的可视化Web应用的文章。
不幸的是,这一切还不完美。还有下列几个问题:
你可能仍会遇到需要使用virtualenv或其等价解决方案的情况,例如库的操作系统版本与你的程序所需版本间的冲突。
我们还没完全解决数据托管的问题,仍需做某些测试。
我假设的“产品”是一个Docker容器,但实际情况常常并非如此而且Docker托管本身也刚刚起步。
尽管如此,我仍然认为这向软件开发的更好未来迈了一大步,大大减轻了部署软件和管理依赖项的痛苦。


猜你喜欢
- 前言CentOS 6.8 安装 Python 2.7.13,因为软件版本上的需求所以考虑将 Python 升级至 2.7.13,加上生产环境
- 1.el-input无法输入的问题原因1、el-input组件没有绑定双向响应式数据(v-model)解决方案:在data中定义一个变量,然
- 效果图实现代码vue2 代码如下<!-- 横向柱状图测试结果 --><template> <div
- 这里的Counter是指collections中的Counter,通过Counter可以实现字典的创建以及字典key出现频次的统计。然而,使
- 要求:实现mysql中对同个字段进行多个匹配值的模糊查询先看数据表:目标是在user表中,匹配出姓氏在family_info表中的记录。方法
- MySQL是一个跨平台的开源关系型数据库管理系统,是我们常用的最经济实惠的数据库,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特
- 在用plt.imshow和cv2.imshow显示同一幅图时可能会出现颜色差别很大的现象。这是因为:opencv的接口使用BGR,而matp
- 前言一直想好好学习一下Python爬虫,之前断断续续的把Python基础学了一下,悲剧的是学的没有忘的快。只能再次拿出来滤了一遍,趁热打铁,
- 本文主要介绍vscode在工作中常用的快捷键及插件,目标在于提高工作效率本文的快捷键是基于mac的,windows下的快捷键放在括号里 Cm
- 由于本人经常装系统,每次装完系统之后都要重新安装一些软件,安装软件的时候又要上网查找安装的教程,比较麻烦,所以自己整理了MySQL5.7.2
- 经过测试发现mysql中用<>与!=都是可以的,但sqlserver中不识别!=,所以建议用<>selece * f
- 1.文档对象模型(DOM)DOM是HTML和XML文档的编程基础,它定义了处理执行文档的途径。编程者可以使用DOM增加文档、定位文档结构、填
- 需要注意的是:更改完源程序.c文件,需要对整个项目重新编译、make install,对已经生成的文件进行更新,类似于之前VS中在一个类中增
- Go语言中符号 “ ^ ” 不再用于次方,而是表示“按位异或的运算”具体的运算规则如下:按位异或 ^ : 两位一个为 0, 一个为 1 ,结
- python读取txt文件#方式一:file = r'D:\test.txt'with open(file, 'rb
- 名称:YUI Compressor最新版本:2.4.2用途:js/css压缩必备指数:使用难度:(YUI Compressor非常易用,只是
- 看到有人用的PJBlog使用的是自动填写验证码,这样其实也不使用验证码基本上没有什么区别,很容易被 * ,因此在参照许多修改的基础上,找到
- 1.新建项目新建一个项目,fileànewàproject如下图:选择Java&agra
- 本文实例为大家分享了Python实现打砖块游戏的具体代码,供大家参考,具体内容如下#导入模块import pygamefrom pygame
- SQL Server 2008的一些新特点及独到之处:设置和安装SQL Server 2008的设置和安装也有所改进。配置数据和引擎位已经分