使用Docker开发python Web 应用_docker

本文中,我将尝试展示用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!”

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

为了使之运行在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托管本身也刚刚起步。

尽管如此,我仍然认为这向软件开发的更好未来迈了一大步,大大减轻了部署软件和管理依赖项的痛苦。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索python
, web
, docker
, python开发web应用
部署web应用
python开发web应用、docker python web、docker部署web应用、docker web应用、docker发布web应用,以便于您获取更多的相关知识。

时间: 2024-11-03 20:58:18

使用Docker开发python Web 应用_docker的相关文章

前台开发-python web开发前台导航

问题描述 python web开发前台导航 最近在用python开发公司内部的一个平台,上面是导航,下面是点击导航后显示的内容,我想问的是,怎么实现点击导航,下面显示不同的内容???就是点击导航加载不同的html,本人以前java开发,前台略薄弱,求大神点拨,或者求个样例. 解决方案 可参考这个:https://github.com/dylanninin/blog 哈哈,这里还支持Markdown~~ 解决方案二: 用jquery库 解决方案三: http://www.ibm.com/devel

使用 Docker 作为 Python 开发环境 【已翻译100%】

(或者让我们绕过virtualenv) 本文中,我将尝试展示用Docker开发python应用(主要是Web应用)的可行方法.虽然我本人专注于Python的Flask微框架,但本文目的是演示如何通过Docker更好地开发和共享应用程序,(由任何语言和框架开发的应用程序).Docker通过封装依赖项,大大减少了开发环境和正式产品的差距. 大多数Python开发人员在开发中使用virtualenv.它提供了一种易用的机制让应用程序使用自己专用的依赖项,这些依赖项可能与在其它应用程序或操作系统存在冲突

讲解使用Docker搭建Java Web运行环境_docker

Docker 是一种"轻量级"容器技术,它几乎动摇了传统虚拟化技术的地位,现在国内外已经有越来越多的公司开始逐步使用 Docker 来替换现有的虚拟化平台了.作为一名 Java 程序员,我们是时候一起把 Docker 学起来了! 本文会对虚拟化技术与 Docker 容器技术做一个对比,然后引出一些 Docker 的名词术语,比如:容器.镜像等,随后将使用 Docker 搭建一个 Java Web 运行环境,最后将对本文做一个总结. 我们先来回顾一下传统虚拟化技术的体系架构: 可见,我们

详解使用Docker搭建Java Web运行环境_docker

这周末体验了一下挺火的Docker技术,记录学习笔记. >Docker是干什么的 Docker 是一个基于Linux容器(LXC-linux container)的高级容器引擎,基于go语言开发, 源代码托管在 Github 上, 遵从Apache2.0协议开源.Docker的目标是实现轻量级的操作系统虚拟化解决方案. 学习Docker首先要了解几个概念: 镜像-Docker的镜像和常见的系统ISO镜像类似,包含了应用程序的信息: 容器-容器相当于一个可以运行起来的虚拟机,应用程序运行在容器中,

有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取

本文讲的是有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取,[编者的话]Prerender 服务能够为网络爬虫提供预先渲染的动态页面内容,解决了用 JavaScript 框架构建的 Web 站点不支持爬虫抓取的问题.本文详细描述了一种解决方案,尤其是提供了集成 Prerender 服务的 Docker 容器镜像. 如果你正在使用 AngularJS 构建一个面向大众消费者的应用,你肯定希望用户能把它分享到社交媒体上.对于特定的应用而言,丰富的

python web开发-python使用flask和sqlalchmey

问题描述 python使用flask和sqlalchmey 我用flask框架和sqlachemy操作sqlite3数据库,我在服务端开了个线程专门查询硬件端口的数据,然后存入数据库,请问这样怎么共享我一开始存储用户信息的数据db,没有c币了开发-python使用flask和sqlalchmey-alchmey">,请用过的各位给个提示 解决方案 参考文章 参考文章地址 项目结构myapi/init.py app.py # this file contains your app and r

Docker 打包python的命令详解_docker

最近用Python写了一段爬虫程序,为了隔离其运行环境,易于分发,把项目打包成Docker镜像 Dockerfile FROM python:2.7.12-alpine ADD ./src /job CMD ["python", "/job/main.py"] 构建命令 $ docker build -t job . 运行 $ docker run -d --name job job 比较简单 以上所述是小编给大家介绍的Docker 打包python的命令详解,希望

使用Docker部署Python应用的一些最佳实践

问题描述 本篇文章源自作者团队在长期开发过程中总结的宝贵经验,其中Supervisor.Gunicorn以及Nginx更是在使用Python开发Web应用时最常用的软件,因此对于打算使用Docker部署Python应用的读者而言,这些最佳实践是很有参考价值.同时希望各位在日常实践过程中,也能将各自踩到过的"坑"以及宝贵的经验分享出来,大家共同进步!我们可以使用Docker简单而高效的部署Python应用,同时,也有一些最佳实践来帮助我们愉快的完成部署.当然,也不是说这些最佳实践就是完成

基于Docker开发的PaaS平台 DINP

基于Docker开发的PaaS平台 DINP DINP是又一个基于Docker开发的PaaS平台. DINP 包含如下组件: dinp-server master组件,控制集群中所有计算节点 dinp-agent Agent,部署在所有计算节点,收集各个节点运行状态和container列表 dinp-builder 编配平台,负责把用户代码打包为Docker image dinp-dash Dashboard,用户操作的入口 dinp-router 负责请求的路由等功能 dinp-hm Heal