使用Docker

时间:2016-01-01 14:39:29

标签: python git docker

我今天开始学习 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 hubgit source)尝试了 Docker 构建的示例应用程序,但我对它有几个担忧。 。应用程序直接捆绑在 Docker 容器中,IMO不是一种可行的方法(至少在开发期间!),因为每次编辑应用程序代码时我都需要重建整个容器(对吗? )。

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

那么使用 Docker 进行网络开发的正确方法是什么?或者......你怎么做? (我在官方文档中找不到有关此主题的任何内容,而且在线文章看起来太基础了IMO ...我想听听来自实际使用的人的真实世界示例他们的应用程序 Docker !:P)

2 个答案:

答案 0 :(得分:2)

我会就你的问题向你提出一些建议。

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

  1. 是的,你必须重建整个容器。更正确的是,您必须重建一个用于容器启动的图像。但Docker允许您使用图层逐步重建图像,这些图层就像一对一的切片一样。这允许您使用较少的磁盘空间,此操作将花费更少的时间(因为只有新的更改添加到图像中)。
  2. 优点:您的图片将完全可以发货 - 您可以随时准备并使用它 - 您需要的所有内容都捆绑在里面。

    缺点:是的,您必须重建容器。在积极的开发过程中,对您来说可能不那么舒适和灵活。

    1. 您可以从主机安装共享目录。我可能会建议您阅读此guide,但我也会简要介绍一下它是如何工作的 - 您的本地目录(例如您的代码)将在您的容器内“可见”。应该使用该代码的应用程序将像使用“本地”代码一样使用它,因此您无需在每次代码更改后重建容器。
    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/

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