我今天开始学习Docker并且我已经能够在几个小时之后使用基于ubuntu:14.04的Python堆栈创建我的第一个自定义映像,通过试验Dockerfile构建和修改现有映像并使用提交保存它命令.
我的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开发的正确工作流程!
我使用Flask(docker hub,git source)尝试了Docker构建的示例应用程序,但我有几个问题…应用程序直接捆绑在Docker容器中,IMO不是一种可行的方法(至少在开发过程中!),因为每次我编辑应用程序代码时我都需要重建整个容器(对吧?).
我想要实现的是一个基本容器,具有特定的python安装和我的应用程序所需的所有第三方库(如数据库驱动程序等),并在此容器中动态注入我的应用程序(理想情况下通过git一次部署,但可能以其他方式在本地开发以加快速度).
那么使用Docker进行Web开发的正确方法是什么(或者……你是怎么做的)? (我在官方文档中没有找到任何关于这个主题的帮助,在线文章看起来太基础IMO …我想听听实际上使用Docker为他们的应用程序的人的真实世界的例子!:P)
在您的情况下,您可以使用两个选项:
>是的,你必须重建整个容器.更正确的是,您必须重建一个用于容器启动的图像.但Docker允许您使用图层逐步重建图像,这些图层就像一对一的切片一样.这允许您使用较少的磁盘空间,此操作将花费更少的时间(因为只有新的更改添加到图像).
优点:您的图像将完全可以发货 – 您可以准备它并在任何地方使用它 – 您需要的一切都捆绑在里面.
缺点:是的,您必须重建容器.在积极的开发过程中,您可能不那么舒适和灵活.
>您可以从主机安装共享目录.我可能会建议你阅读这个guide,但我也会简要介绍一下它是如何工作的 – 你的本地目录(例如你的代码)将在你的容器内“可见”.应该使用该代码的应用程序将像使用“本地”代码一样使用它,因此您不必在每次代码更改后重建容器.
优点:是的,它可以加快您的开发过程 – 您可以立即在容器中测试您的代码.
缺点:这不是一个便携,可交付和通用的解决方案.如果您要在多个主机上使用该容器(例如,您有一个带Dev的流程 – >分段 – >生产环境),您将无法在这些主机上使用相同的捆绑容器hosts – 您还必须在该节点上提供代码,这些代码应该在容器内部使用.
总结一下上面描述的内容 – 如果你有无状态应用程序,你可以在经典(“捆绑”)情况下使用Docker容器 – 如果你要在其中实现任何静态更改 – 你将不得不重建源图像并重新启动容器.
如果您想运行一些有状态的应用程序,或者您想使用Docker容器存储一些数据(不要忘记,您不能将任何数据存储在容器本身中 – 它可能随时被杀死并重新启动,并且状态将恢复到原始映像状态!),您可以使用Docker中的共享卷,或者在这种情况下您将不得不拒绝使用Docker.
Docker不是一个银弹 – 它在很多情况下非常有用,但是还有很多其他情况,你可以使用其他更方便的技术.
PS.一个流程示例,我在之前的一个项目中使用过,我们必须使用负载平衡器,前端,后端和数据库应用程序构建一个复杂的基于Web的应用程序.
我们还没有使用Docker共享卷 – 您的开发人员编写了代码,将其提交给Git repo,Jenkins捕获了该提交并构建了一个新的映像,该映像已经提交给我们自己托管的Docker Registry.这些映像已经标记为不同的标签,取决于环境,必须使用它们(开发,阶段,产品),并且它们已经由配置管理系统部署在“他们的”环境中.
PSS.对于整个流程,我可能还建议您使用一些容器管理工具,如Kubernetes,而不是纯粹的Docker用法. Kubernetes将为您提供管理容器间网络,在多个环境中部署容器和/或使用多个providers,对基于容器的应用程序进行负载平衡等的可能性.