Docker化Python的Django Web应用程序

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

了解如何使用Gunicorn web服务器docker化Django应用程序,使该应用能够并行处理数千个请求。

介绍

本文将涉及用Django建立一个简单‘Hello World’风格的web应用程序,并且运行在Docker中。Docker是热门讨论话题,它具有传统虚拟机所有好的方面,如,从开发机中分离出一个自足的系统,并且消除了很多缺点,如系统资源的流失,安装时间,和维护。

当构建web应用程序时,你可能到了这样一个阶段,此时你想以更接近生产环境的方式运行应用程序。Docker允许设置应用程序的运行时间以与生产时完全相同的方式运行,在相同的操作系统,相同的环境变量,和需要的任何其它的配置和设置。

到文章的结尾,你将能够:

  • 了解Docker是什么及如何使用

  • 构建一个简单的Python Django应用程序,并创建一个简单的Dockerfile来建立一个运行Django web应用服务器的容器。

究竟Docker是什么?

Docker的首页是这样描述它的:

“Docker是一个开放平台,用于建立、运输和运行分布式应用程序。它给程序员,开发团队,和操作工程师常用的工具箱,他们需要利用现代应用程序的分布式和网络化的性质。”

简而言之,Docker让你有能力运行应用程序在受控环境中,这被称为容器,它根据定义的指令构建。一个容器充分利用你的机器资源很像一个传统的虚拟机(WM)。然而,容器与传统虚拟机在系统资源方面有很大的不同。传统虚拟机操作使用进程管理程序,它管理底层硬件到VM的虚拟化。这意味着它们在系统要求方面很大。

容器操作一个共享的Linux操作系统类型并在上面添加简单的指令来执行和运行应用程序或过程。区别在于Docker不需要安装整个操作系统到一个虚拟机如VirtualBox或VMWare的耗时过程。Docker安装后,用一些命令创建一个容器,然后通过Dockerfile在容器里执行应用程序。Docker管理大部分的操作系统虚拟化,因此可以编写应用程序并按照要求在构建的容器中运输它们。

此外,Dockerfiles可以分享给他人来建立容器和通过基于现有的容器镜像扩展里面的指令。容器也有很高的可移植性,并将以同样的方式运行,无论执行它们的主机是什么操作系统。可移植性是Docker的一个巨大优势。

必备条件

在开始本教程之前,请确保你的系统中安装如下内容:

建立一个Django Web应用程序

开始一个Django应用程序是很容易的,由于Django依赖项提供一个命令行工具来开发一个项目并生成一些文件和目录结构。开始,创建一个新文件夹,它将容纳Django应用程序并进入该目录。

0.png

一旦在这个文件夹,需要添加标准的Python项目依赖项文件,它们通常被命名为requirements.txt,并添加Django和Gunicorn依赖项。Gunicorn是一个生产标准的web服务器,本文稍后将使用它。一旦创建并添加了依赖项,文件应该看起来像这样:

1.png

添加Django依赖项后,可以使用下面的命令安装Django:

2.png

安装完成后,你会发现可以访问django-admin命令行工具,可以使用它生成简单“Hello,World!”应用程序所需要的项目文件和目录结构。

3.png

让我们看看这个工具刚创建的项目结构:

00.png

官方网站上,你可以阅读更多关于Django结构。django-admin工具创建了一个骨架应用程序。使用manage.py文件,控制应用程序的开发目的,它允许启动开发测试web服务器,例如:

4.png

另一个关键文件是urls.py,它指定了URL路径对应的视图。此时,你将仅有默认   的管理URL,我们将不会在本教程中使用它。添加一个URL,它将路由到一个视图返回经典的句子“Hello,World!”。

首先,在urls.py的相同目录下,创建一个新文件,命名为views.py,包含以下内容:

5.png

现在,添加以下网址url(r'', 'helloworld.views.index')到urls.py,它将路由基地址/到新视图。现在urls.py文件的内容应该看起来如下:

6.png

现在,执行python manage.py runserver命令,并在浏览器访问http://localhost:8000,你应该看到新添加的“Hello,World!”视图。

项目设置的最后一部分是利用Gunicorn web服务器。此web服务器是健壮的并建立来处理生产级流量,鉴于Django包括开发服务器只在本地机器上更多用于测试目的。一旦docker化应用程序,将想要使用Gunicorn启动服务器。这是非常简单的,如果编写一个小的启动脚本让Docker执行。考虑到这一点,在项目的根目录中,添加一个start.sh bash脚本,它将使用Gunicorn启动应用程序。

7.png

脚本的第一部分写到“Starting Gunicorn”命令行来告诉我们它开始执行。脚本的下一部分实际上是启动Gunicorn。此处使用exec,这样执行命令接管外壳脚本,这意味着当Gunicorn过程结束,脚本也会结束,这正是我们想要的。

然后传递gunicorn命令第一个参数elloworld.wsgi:application。这是对Django生成的wsgi文件的引用,它是一个Web服务网关接口文件,是web应用程序和服务器的Python标准。 没有太多深入WSGI,该文件只定义了application变量,而且Gunicorn知道如何与对象进行交互以启动web服务器。

然后传递两个标志给命令,bind绑定正在运行的服务器到8000端口,将使用它与正在运行的web服务器通过HTTP通信。最后,指定workers,它是线程的数量,将处理到应用程序的请求。Gunicorn推荐这个值被设置为(2 x $num_cores) + 1。在这些文档,可以阅读更多关于Gunicorn配置。

最后,使该脚本可执行,然后通过改变目录到项目文件夹 helloworld并执行脚本如下所示,测试它是否工作。如果一切运行正常,应该看到输出类似下面中的一个,可以在浏览器访问http://localhost:8000,并得到“Hello,World!”响应。

8.png

Docker化应用程序

现在你有一个准备部署的简单的web应用程序。目前,已经使用内置开发web服务器,Django提供web框架。是时候设置项目,在Docker中使用一个更健壮的建立来处理生产级流量的web服务器来运行应用程序。

安装Docker

Docker的关键目标之一是可移植性,因此,可以安装在各种各样的操作系统。

本教程中,将安装Docker Machine在MacOS。实现这的最简单的方法是通过Homebrew包管理器。安装Homebrew并运行以下命令:

9.png

Docker Machine安装后,可以用它来创建一些虚拟机并运行Docker客户端。可以从命令行运行docker-machine来看你有什么选项。你会注意到docker-machine的总体构想是提供工具来创建并管理Docker客户端  这意味着可以很容易地建立一个虚拟机,并使用它来运行Docker容器中你想要或需要的一切。

现在,将创建一个基于VirtualBox的虚拟机,它将被用来执行Dockerfile, 该文件稍后要创建。在这里创建的机器应该尝试模仿你打算在生产中运行应用程序的机器。这样,运行应用程序在本地或部署环境中,不应该看到任何差异或异常现象。

创建你的Docker Machine,使用下面的命令:

10.png

这将创建机器而且完成后输出有用信息。这台机器被创建有5GB硬盘,2个CPU和4GB的RAM。

要完成安装,需要在终端会话中添加一些环境变量来允许Docker命令连接刚刚创建的机器。docker-machine提供一个简单的方式来生成环境变量并添加它们到会话中:

11.png

通过在输出端执行命令完成设置:

12.png

执行下面的命令,以确保一切如预期的那样。

13.png

现在可以docker化Python应用程序并使用docker-machine运行它。

编写Dockerfile

下一步是添加Dockerfile到项目。这将允许Docker建立镜像,它将在刚刚创建的Docker Machine上执行。编写一个Dockerfile是非常简单的,并且有很多元素可以在网络上重用and/or发现的元素。Docker提供很多功能,而这些在建立镜像时将需要。如果需要做些什么来让项目有更多的自定义,Dockerfiles有足够的灵活性,让你这样做。

可以认为Dockerfile的结构是一些列指令,它们关于如何建立容器/镜像。如,大多数Dockerfiles通过引用Docker提供的一个基础镜像开始。通常,这将是最新的Ubuntu release版本或者其它Linux系统的一个普通的vanilla镜像。在那儿,可以设置目录结构,环境变量,下载依赖项,和最后执行过程之前的很多其它标准系统任务,这将运行Web应用程序。

通过在项目根目录创建一个名叫的Dockerfile的空文件开始Dockerfile。然后,添加第一行到Dockerfile指示建立在哪一个基础镜像之上。可以创建你自己的基础镜像并使用它生成容器,在一个部门有很多团队希望以同样的方式部署他们的应用程序时这可能是有益的。

14.png

值得注意的是,我们使用一个创建来专门处理Python 2.X应用程序的基础镜像,并且在余下的Dockerfile之前一组指令将自动运行。这个基础镜像将复制项目到/usr/src/app,复制requirements.txt并紧接着执行pip install。Dockerfile然后才准备好实际运行应用程序。

接着,可以复制之前编写的脚本start.sh到稍后在Dockerfile中启动服务器要执行容器的可用路径。

15.png

服务器将在8000端口上运行。因此,容器必须设置允许访问此端口,以便可以通过HTTP与正在运行的服务器通信。要做到这一点,使用EXPOSE命令使该端口可用。

16.png

Dockerfile的最后一部分是执行之前添加的开始脚本,它将让web服务器运行在8000端口等待接受HTTP请求。可以使用CMD命令执行该脚本。

17.png

一切就绪,Dockerfile最终应该看起来像这样:

18.png

现在你准备好建立容器镜像,然后运行它看到一切工作正常。

建立和运行容器

一旦系统中有Docker或Docker Machine,建立容器是非常简单的。下面的命令将寻找Dockerfile并下载使容器镜像运行所有必须的层。之后,它将运行Dockerfile中的指令并交给你一个准备启动的容器。

为了建立容器,会使用docker build命令给容器提供一个标签或名字,这样以后当你想运行它时可以引用它。该命令的最后一部分告诉Docker从哪一个目录建立。

19.png

在上面的输出中,可以看到Docker在输出之前建立容器完成处理每个命令,它将给容器一个唯一的ID,它也可以在命令里和标签一起使用。

最后一步是使用Docker运行刚建立的容器:

20.png

该命令告诉Docker运行该容器并公开8000端口到你本地机器的8000端口。运行此命令后,应该可以在览网访问http://localhost:8000,看到“Hello,World!”的响应。如果在Linux机器上运行,情况确实如此。然而,如果运行在MacOS上,需要从VirtualBox转发端口,本教程中使用的是Linux机器,因此它们在主机就可以访问。

21.png

此命令修改之前使用docker-machine创建的虚拟机的配置,转发8000端口到主机。可以多次运行此命令,可以更改需要的任何其它端口的值。

做到这步后,在浏览器访问http://localhost:8000。应该可以访问docker化的Python Django应用程序运行在一个Gunicorn web服务器上,准备好每秒数千的请求,准备好使用Docker部署在地球上的几乎任何操作系统上。  

接下来的步骤

手动验证该应用程序在Docker中如预期后,下一步是部署。可以使用Semaphore的Docker平台来自动化该过程。

结论

在本教程中,学到了如何建立一个简单的Python的Django web应用,将它在一个生产级的Web服务器上打包,并创建一个Docker容器来执行web服务器进程。

如果你喜欢这篇文章的工作,请随意分享它并且如果有任何问题或意见留下评论。我们将尽最大的努力来回答它们,或为你指出正确的方向。

英文原文:https://semaphoreci.com/community/tutorials/dockerizing-a-python-django-web-application?utm_source=mybridge&utm_medium=email&utm_campaign=read_more
译者:wangyc
 

2月15日11:00到13:00网站停机维护,13:00前恢复