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

dav*_*ode 6 python git docker

我今天开始学习Docker,并且我已经能够在几个小时后基于Python堆栈创建我的第一个自定义图像ubuntu:14.04,通过试验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/*
Run Code Online (Sandbox Code Playgroud)

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

我使用Flask(docker hub,git source)尝试了Docker构建的示例应用程序,但我对它有几个担忧...应用程序直接捆绑在Docker容器中,IMO不是一种可行的方法(至少在开发期间! ),因为每次我编辑应用程序代码时我都要重建整个容器(对吧?).

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

那么使用Docker进行 Web开发的正确方法是什么(或者......你是怎么做的)?(我在官方文档中没有找到任何关于这个主题的帮助,在线文章看起来太基础IMO ...我想听听实际上使用Docker为他们的应用程序的人的真实世界的例子!:P)

iho*_*kyi 3

关于你的问题,我将向你提出一些建议。

根据您的情况,您可以使用两种选择:

  1. 是的,您必须重建整个容器。更正确的是,您必须重建用于容器启动的映像。但是 Docker 允许您使用层(就像一对一放置的切片)增量重建映像。这允许您使用更少的磁盘空间,并且此操作将花费更少的时间(因为只有新的更改会添加到映像中)。

优点:您的图像将完全可交付 - 您可以准备它并在任何地方使用它 - 您需要的一切都捆绑在里面。

缺点:是的,您必须重建容器。在活跃的开发过程中,您可能不太舒服和灵活。

  1. 您可以从主机挂载共享目录。我可能建议您阅读本指南,但我还将简要描述它是如何工作的 - 您的本地目录(例如带有您的代码)将在您的容器内“可见”。应该使用该代码的应用程序将像使用“本地”代码一样使用它,因此您无需在每次代码更改后重建容器。

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

缺点:这不是一个可移植、可运输和通用的解决方案。如果您要在多个主机上使用该容器(例如,您有一个开发 -> 暂存 -> 生产环境的流程),您将无法在这些主机上简单地使用相同的捆绑容器 -您还必须在该节点上交付应在容器内部使用的代码。

总结一下上面描述的事情 - 如果您有无状态应用程序,您可以在经典(“捆绑”)情况下使用 Docker 容器 - 如果您要在其中实现任何静态更改 - 您必须重建源图像并重新启动容器。

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

Docker 不是灵丹妙药——它在很多情况下确实很有用,但在很多其他情况下,您可能会使用其他更方便的技术。

附言。我在之前的一个项目中使用了一个流程示例,其中我们必须构建一个复杂的基于 Web 的应用程序,其中包含负载均衡器、前端、后端和数据库应用程序。我们还没有使用 Docker 共享卷 - 您的开发人员已经编写了代码,将其提交到 Git 存储库,Jenkins 捕获了该提交并构建了一个新映像,该映像已提交到我们的自托管Docker 注册表。根据必须使用它们的环境(开发、阶段、产品),这些映像已被标记为不同的标签,并且它们已由配置管理系统部署在“他们的”环境中。

附言。对于整个流程,我可能还会建议您使用一些容器管理工具,例如Kubernetes,而不是纯粹使用 Docker。Kubernetes 将为您提供管理容器间网络、在多个环境和/或多个提供商部署容器、对基于容器的应用程序进行负载平衡等的可能性。