如何在开发/部署工作流程中使用Docker?

时间:2016-08-19 04:27:15

标签: deployment docker devops

我不确定我是否完全理解Docker在开发和部署过程中的作用。

  1. 说,我创建了一个带有nginx的Dockerfile,一些数据库以及其他可以创建容器并运行正常的东西。

  2. 我将它放在云中的某个位置并执行它以安装和配置所有依赖项和环境设置。

  3. 接下来,我有一个带有Web应用程序的存储库,我想在我创建的容器中运行并在前两个步骤中部署。我经常处理它并推动变化。

  4. 现在,如何将Web应用程序集成到容器中?

    • 我是否将它作为依赖项放在我在第一步创建的Dockerfile中,并且每次都从头开始重新创建容器?
    • 或者,我是否部署了一次容器,但是在Dockerfile中有安装utils的过程,这些过程通过命令或钩子从repo中提取代码?
    • 如果容器正在运行但我想更改nginx的某些设置怎么办?我是否将这些更改添加到Dockerfile中并重新创建图像?

    一般来说,Docker在日常应用程序开发例程中的作用是什么?如果基础设施运行良好且只有代码正在改变,它是否经常使用?

1 个答案:

答案 0 :(得分:1)

我认为没有单打"只使用这个"答案 - 正如您已经概述的那样,有不同的可行概念。

部署到分段/生产/预生产

A)

  

我是否将它作为依赖项放在我在第一步创建的Dockerfile中,并且每次都从头开始重新创建容器?

这肯定是最具有码头作用的方式,并且完全符合他的码头哲学。它具有高度的便携性,可重复性,适用于任何容器,从一个容器到#34; swarm"上千的。例如。当你需要更多的容器时,这个概念没有突然水平缩放的问题,可以说是由于交通拥堵/负载过重。

它也符合以下想法:只有配置/数据在docker容器中应该是动态的,而不是代码/二进制文件/工件

应该选择此策略用于生产,因此不会频繁部署。如果您在容器重建期间(升级时)关心停机时间,那么也有很好的概念可以处理。

我们将其用于生产和预生产。

b)中

  

或者,我是否部署了一次容器,但内部有程序   Dockerfile,用于安装通过命令从repo中提取代码的utils   或通过钩子?

这是非常频繁部署的更常见做法。你可以去拉(你说的话)或推(docker cp / ssh scp)概念,而我猜这种情况在这种环境中是首选。

我们将此用于临时实例的任何类型策略,这基本上应该反映当前的"代码库"及其地位。我们也将它用于烟雾测试和CI,但取决于应用程序。如果应用程序实际上更改了它的依赖关系,并且干净的构建需要使用那些来重建,以确保按照预期测试内容,我们实际上在CI期间重建图像。

配置管理

1

  

如果容器正在运行但我想更改某些设置,该怎么办?   说,nginx?我是否将这些更改添加到Dockerfile并重新创建   图像?

我没有使用它作为c),因为这是配置管理,而不是应用程序部署,根据您的情况,答案可能非常复杂。一般来说,如果重新部署需要配置更改,那么它取决于您的配置管理,如果您可以使用b)或总是必须去a)。

E.g。如果您使用带有consul的https://github.com/markround/tiller作为后端,则可以将配置更改推送到consul,使用tiller重新生成配置,同时使用consul watch -prefix /configuration tiller作为监视任务来对这些值更改做出反应。 这使您可以转到b)并修复配置

您还可以使用https://github.com/markround/tiller和部署,例如更改ENV变量或某种yml文件(分蘖支持不同的后端),并在部署期间自行调用分蘖。这很可能需要您ssh或者您在主机上使用docker cpdocker exec

开发

在开发过程中,您通常会重复使用用于生产的docker-compose.yml文件,但是使用docker-compose-dev.yml将其重载为例如安装你的代码文件夹,设置RAILS_ENV =开发,重新设置/安装一些其他配置,如xdebug或更详细的nginx loggin,无论你需要什么。您还可以添加一些假的MTA服务,如fermata等等

docker-compose -f docker-compose.yml -f docker-compose-dev.yml up

docker-compose-dev.yml只重载某些值,它不重新定义或复制它。

根据配置管理的强大功能,您还可以在开发堆栈期间进行预安装。

我们实际上使用了脚手架,我们使用https://github.com/xeger/docker-compose,在运行它之后,我们使用docker execdocker cp来预安装实例或阶段。这里有一些例子https://github.com/EugenMayer/docker-sync/wiki/7.-Scripting-with-docker-sync

如果您是在OSX下开发并且由于OSXFS /代码共享而遇到性能问题,您可能希望查看http://docker-sync.io(我有偏见)