我今天开始学习 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开发的正确工作流程。
我使用 Flask (docker hub,git source)尝试了 Docker 构建的示例应用程序,但我对它有几个担忧。 。应用程序直接捆绑在 Docker 容器中,IMO不是一种可行的方法(至少在开发期间!),因为每次编辑应用程序代码时我都需要重建整个容器(对吗? )。
我想要实现的是一个基本容器,具有特定的python安装和我的应用程序所需的所有第三方库(如数据库驱动程序等),并且在此容器中动态注入我的应用程序(理想情况下)部署后通过 git ,但在本地开发时可能采用其他方式以加快速度。)
那么使用 Docker 进行网络开发的正确方法是什么?或者......你怎么做? (我在官方文档中找不到有关此主题的任何内容,而且在线文章看起来太基础了IMO ...我想听听来自实际使用的人的真实世界示例他们的应用程序 Docker !:P)
答案 0 :(得分:2)
我会就你的问题向你提出一些建议。
在您的情况下,您可以使用两个选项:
优点:您的图片将完全可以发货 - 您可以随时准备并使用它 - 您需要的所有内容都捆绑在里面。
缺点:是的,您必须重建容器。在积极的开发过程中,对您来说可能不那么舒适和灵活。
优点:是的,它可以加快您的开发过程 - 您可以立即在容器中测试代码。
缺点:这不是一个便携,可交付和通用的解决方案。如果您要在多个主机上使用该容器(例如,您有一个带Dev的流程 - >分段 - &gt;生产环境),您将无法在这些主机上使用相同的捆绑容器hosts - 您还必须在该节点上提供代码,这些代码应该在容器内部使用。
总结上面描述的内容 - 如果您有无状态应用程序,您可以在经典(“捆绑”)情况下使用Docker容器 - 如果您要在其中实现任何静态更改 - 您将拥有重建源图像并重新启动容器。
如果您想运行一些有状态的应用程序,或者您想使用Docker容器存储一些数据(不要忘记,您不能将任何数据存储在容器中 - 它可能会随时被杀死并重新启动,它的状态将恢复到原始图像状态!),您可以使用Docker中的共享卷,或者在这种情况下您将不得不拒绝使用Docker。
Docker不是一个银弹 - 它在很多情况下非常有用,但是还有很多其他情况,你可以使用其他更方便的技术。
PS。一个流程示例,我在之前的一个项目中使用过,我们必须使用负载均衡器,前端,后端和数据库应用程序构建一个复杂的基于Web的应用程序。 我们没有使用Docker共享卷 - 您的开发人员编写了代码,将其提交给Git repo,Jenkins捕获了该提交并构建了一个新图像,该图像已经提交给我们自己托管的Docker Registry。这些图像由不同的标签标记,具体取决于环境,必须使用它们(dev,stage,prod),并且它们已由配置管理系统部署在“他们的”环境中。
PSS。对于整个流程,我可能还建议您使用一些容器管理工具,如Kubernetes,而不是纯粹的Docker用法。 Kubernetes将为您提供管理容器间网络,在多个环境中部署容器和/或使用多个providers,对基于容器的应用程序进行负载平衡等的可能性。
答案 1 :(得分:0)
为了使用Docker构建Python Flask应用程序,您可能需要检查这一点,我制作了一个公共(和开源)Docker镜像,其中包含可用于构建Python Flask Web应用程序的所有花哨功能。
在Docker镜像的主页末尾,我还编写了一些用于开发的漂亮技巧,可以实现实时调试和重新加载,而无需重新构建完整的Docker镜像,就好像你在工作一样本地。
它有uWSGI用于运行应用程序,Nginx用于提供HTTP和Supervisord来控制它们,因此您不必学习如何安装和配置所有这些来构建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/