使用Docker进行Web开发的正确工作stream程

我今天开始学习Docker ,我已经能够在几个小时后基于ubuntu:14.04创build我的第一个自定义图像,通过试验Dockerfile构build和修改现有的图像并使用commit保存命令。

我的Dockerfile是以下内容:

 FROM ubuntu:14.04 MAINTAINER Davide Zanotti <***@gmail.com> ENV DEBIAN_FRONTEND noninteractive RUN apt-get update && apt-get install -y \ software-properties-common \ build-essential \ automake \ checkinstall \ git \ && add-apt-repository -y ppa:fkrull/deadsnakes && apt-get update && apt-get install -y python3.5 \ && cd /usr/bin && ln -s python3.5 python \ && apt-get clean && rm -rf /var/lib/apt/lists/* 

到目前为止这么好,但现在我想知道哪个应该是使用Docker进行Web开发的正确工作stream程!

我尝试了由Docker使用Flask ( docker hub , git source )构build的示例应用程序,但是我对此有几点担心…应用程序直接捆绑在Docker容器中,而IMO不是一种可行的方法(至less在开发期间! ),因为每次我编辑应用程序代码,我不得不重build整个容器(右?)。

我想实现的是一个基本的容器,具有特定的Python安装和我的应用程序需要的所有第三方库(如数据库驱动程序等),并在此容器中有我的应用程序dynamic注入(理想情况下通过git一次部署,但也许以另一种方式进行本地开发以加快速度)。

那么,使用Docker进行 Web开发的正确方法是什么(或者…你如何)? (在官方文档中我没有发现任何关于这个主题的有用信息,而且在线文章看起来太基本了……我想知道实际使用Docker的人的实际例子:P)

我会build议你几个关于你的问题。

在你的情况下,你可以使用两个选项:

  1. 是的,你将不得不重build整个容器。 为了更加正确,你将不得不重build一个用于容器启动的图像。 但是Docker允许你使用图层递增地重build一个图像,就像一个一个的切片一样。 这允许您使用较less的磁盘空间量,并且此操作将花费更less的时间(因为只有新的更改被添加到图像中)。

优点:你的形象将是完全可交付的 – 你可以准备它,并在任何地方使用 – 你需要的一切都捆绑在里面。

缺点:是的,你将不得不重build容器。 在一个积极的开发过程中,对你来说可能不那么舒适和灵活。

  1. 您可以从主机安装共享目录。 我可能会build议您阅读本指南 ,但我也会简要介绍它是如何工作的 – 您的本地目录(例如您的代码)将在您的容器内“可见”。 应该使用该代码的应用程序将像使用“本地”代码一样工作,所以在每次更改代码后都不必重新编译容器。

优点:是的,它加速了您的开发过程 – 您可以立即在容器中testing您的代码。

缺点:这不是一个便携式,可交付和通用的解决scheme。 如果你打算在多个主机上使用这个容器(例如,你有一个stream – 开发 – >分段 – >生产环境),你将不可能简单地在这些主机上使用相同的捆绑容器 – 您还将必须在该节点上传递代码,这些代码应该在容器内部使用。

总结一下,如上所述 – 如果你有无状态的应用程序 – 如果你要在其中实现任何静态变化,你可以在经典(“捆绑”)的情况下使用Docker容器 – 你必须重build源图像并重新启动容器。

如果你想运行一些有状态的应用程序,或者你想使用Docker容器来存储一些数据(不要忘记,你不能在容器中存储任何数据 – 它可能随时被杀死并重新启动,状态将恢复到原始图像状态!),您可以在Docker中使用共享卷,否则在这种情况下您必须拒绝Docker的使用。

Docker并不是一个银弹 – 它在很多情况下非常有用,但是还有很多其他的情况,你可以使用其他更方便的技术。

PS。 一个stream程示例,我已经在我之前的一个项目中使用过,我们必须使用负载平衡器,前端,后端和数据库应用程序构build一个复杂的基于Web的应用程序。 我们还没有使用Docker共享卷 – 您的开发人员已经编写代码,将其提交给Git仓库,Jenkins抓住了这个提交并构build了一个新的镜像,这个镜像已经被提交给我们自托pipe的Docker Registry 。 这些图像被标记了不同的标签,取决于环境,它们必须被使用(dev,stage,prod),并且它们已经被configurationpipe理系统部署在“他们的”环境中。

PSS。 对于整个stream程,我可能还build议您使用一些容器pipe理工具,如Kubernetes ,而不是纯粹的Docker使用。 Kubernetes将为您提供pipe理您的集装箱间networking,在多个环境和/或与多个供应商部署容器,负载均衡基于容器的应用程序等的可能性。

为了使用Docker构buildPython Flask应用程序,您可能需要检查这一点,我制作了一个公开的(和开源的)Docker镜像,可以使用它来构build一个Python Flask Web应用程序。

在Docker镜像的主页面的末尾,我还写了一些用于开发的漂亮技巧,例如可以实时debugging和重新加载,无需重新构build完整的Docker镜像,就像在本地工作一样。

它有用于运行应用程序的uWSGI,Nginx为HTTP和Supervisord提供服务来控制它们,因此您不必学习如何安装和configuration所有这些来构build您的Python Flask Web应用程序。

看起来像Nginx的uWSGI是部署Python Web应用程序的更强大(并且性能卓越)的方式之一。 这里是基准: http : //nichol.as/benchmark-of-python-web-servers 。

甚至有一些模板项目可以用来引导你自己。 此外,您不必克隆整个项目或其他东西,您可以将其用作基本映像。

Docker Hub: https : //hub.docker.com/r/tiangolo/uwsgi-nginx-flask/

GitHub: https : //github.com/tiangolo/uwsgi-nginx-flask-docker