使用Docker进行Web开发的适当工作流程

7
我今天开始学习Docker,经过几个小时的实验,我已经能够基于ubuntu:14.04创建一个Python堆栈的自定义镜像,同时尝试了使用Dockerfile构建和修改现有镜像并使用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开发的适当工作流程是什么!
我尝试了使用Flaskdocker hubgit source)构建的Docker示例应用程序,但我对此有几个顾虑...该应用程序直接捆绑在Docker容器中,我认为这不是可行的方法(至少在开发期间不是!),因为每次编辑应用程序代码时都必须重建整个容器(对吗?)。
相反,我想要实现的是一个基础容器,具有特定的Python安装和所有第三方库,例如数据库驱动程序等,我的应用程序需要在该容器中动态注入我的应用程序(理想情况下通过git一旦部署,但也可以通过替代方式在本地开发以加快速度)。

那么使用Docker进行Web开发的正确方式是什么?(我在官方文档中没有找到任何有用的关于这个话题的内容,而在线文章看起来过于基础...我想听听那些实际上正在使用Docker开发应用程序的人的真实世界例子!:P)


因为我是个白痴,我不小心颠倒了配置文件中的用户名/密码,所以我将其删除了……我的设置本来是正确的,现在它正常工作了……只是个愚蠢的疏忽而已 :D - daveoncode
2个回答

3
我将为您提供关于您问题的几个建议。
在您的情况下,您可以使用两个选项:
1.是的,您必须重建整个容器。更准确地说,您需要重建一个用于容器启动的镜像。但是,Docker允许您增量地重建镜像,使用层,这些层就像一个接一个地放置的切片。这使您可以使用更少的磁盘空间,并且此操作将花费更少的时间(因为只添加了新更改到镜像中)。
优点:您的镜像将完全可运输 - 您可以准备它并在任何地方使用它 - 您需要的一切都打包在其中。
缺点:是的,您必须重建容器。在活跃的开发过程中,这可能对您来说不太舒适和灵活。
  1. 您可以挂载来自主机的共享目录。我建议您阅读这个指南,但我也会简要介绍它的工作原理——您本地的目录(例如您的代码)将在容器内“可见”。应用程序应该使用该代码,就像使用“本地”代码一样,所以您不必在每次更改代码后重新构建容器。

优点:是的,它加快了您的开发过程——您可以立即在容器中测试您的代码。

缺点:这不是一个便携式、可运输和通用的解决方案。如果您打算在多台主机上使用该容器(例如,您有一个 Dev-> Staging-> Production 环境的流程),您将无法简单地在这些主机上使用相同的捆绑容器——您还必须将代码交付给应该在容器内使用的节点。

总结以上内容 - 如果你有无状态应用程序,可以在经典("捆绑")情况下使用Docker容器。如果你要对其进行任何静态更改,则必须重新构建源映像并重新启动容器。

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

Docker不是万能药 - 它确实在许多情况下非常有用,但在许多其他情况下,你可以使用其他更方便的技术。

PS. 我之前参与的一个项目需要构建一个复杂的基于Web的应用程序,其中包括负载均衡器、前端、后端和数据库应用程序。我们没有使用Docker共享卷-你们的开发人员编写了代码,提交到Git repo,Jenkins捕获该提交并构建了一个新的映像,该映像已提交到我们自己托管的Docker Registry。这些映像已根据它们需要使用的环境(dev、stage、prod)标记不同的标签,并通过配置管理系统在“它们”的环境上部署。

PSS. 对于整个流程,我还建议您使用一些容器管理工具,如Kubernetes,而不是纯粹使用Docker。 Kubernetes将为您提供管理容器间网络、在多个环境和/或多个providers上部署容器、负载均衡基于容器的应用程序等功能。


0

如果您想使用Docker构建Python Flask应用程序,可以查看这个公开的(并且开源的)Docker镜像,其中包含了所有必要的组件,可以用来构建Python Flask Web应用程序。

在该Docker镜像的主页末尾,我还写了一些我用于开发的小技巧,例如启用实时调试和重新加载,而无需重新构建完整的Docker镜像,就像您在本地工作一样。

它具有uWSGI运行应用程序,Nginx提供HTTP服务以及Supervisord控制它们的功能,因此您不必学习如何安装和配置所有这些内容来构建Python Flask Web应用程序。

似乎uWSGI与Nginx是部署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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接