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

我不确定我完全理解Docker在开发和部署过程中的angular色。

  1. 说,我用nginx,一些数据库和其他东西创build一个Dockerfile,创build一个容器,运行良好。

  2. 我把它放在云中的某个地方,执行它来安装和configuration所有的依赖关系和环境设置。

  3. 接下来,我有一个Web应用程序的存储库,我想要在前两个步骤中创build和部署的容器中运行。 我经常工作,推动变革。

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

  • 我是否将它作为第一步中创build的Dockerfile中的依赖关系,并且每次都重新创build容器?
  • 或者,我是否部署容器一次,但有程序内部的Dockerfile安装使用命令或通过钩子从回购代码的代码?
  • 如果一个容器正在运行,但是我想改变一些nginx的设置呢? 我是否将这些更改添加到Dockerfile中并重新创build映像?

一般来说,Docker在日常应用程序开发过程中扮演的angular色是什么? 如果基础设施运行正常,只有代码正在改变,是否经常使用?

我认为没有单一的“只用这个”答案 – 正如你已经概述的,有不同的可行的概念可用。

部署到舞台/制作/前期制作

一个)

我是否将它作为第一步中创build的Dockerfile中的依赖关系,并且每次都重新创build容器?

这是肯定的最docker的方式,并完全符合他的docker哲学。 它具有高度的便携性,可复制性和适应性,从一个容器到数千个“群”。 例如,当你需要更多的容器时,这个概念没有突然的水平伸缩问题,可以说由于交通/负载很重。

它也符合这样的想法:只有configuration/数据应该在docker容器中是dynamic的,而不是代码/二进制文件/工件

这个战略应该select生产使用,所以当不是频繁的部署发生。 如果你关心容器重build(升级)期间的停机时间,也有很好的概念来处理这个问题。

我们用它来生产和预生产。

b)

或者,我是否部署容器一次,但有程序内部的Dockerfile安装使用命令或通过钩子从回购代码的代码?

对于非常频繁的部署,这是一种更常见的做法。 你可以去拉(你说的)或推(docker cp / ssh scp)的概念,而我认为后者在这种环境中是首选。

我们使用这种策略来进行任何实例升级策略,这基本上应该反映当前的“代码库”及其状态。 我们也将此用于烟雾testing和CI,但取决于应用。 如果应用程序实际上改变了它的依赖关系,并且一个干净的构build需要重build,那么我们实际上会在CI期间重build图像。


configurationpipe理

1。

如果一个容器正在运行,但是我想改变一些nginx的设置呢? 我是否将这些更改添加到Dockerfile中并重新创build映像?

我不使用这个作为c),因为这是configurationpipe理,而不是应用程序部署,对此的答案可以是非常复杂的,这取决于你的情况。 一般来说,如果重新部署需要configuration更改,则取决于您的configurationpipe理,如果可以与b)一起去,或者一直需要去a)。

例如,如果您使用https://github.com/markround/tiller作为后端,则可以将configuration更改推送到consul,使用分蘖重新生成configuration,而使用consul watch -prefix /configuration tiller作为监视任务对这些价值变化做出反应。 这使您可以去b)和修复configuration

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

发展

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

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

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

根据configurationpipe理function的强大程度,您也可以在开发过程中进行预安装。

我们实际上使用脚手架,我们使用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 (尽pipe我有偏见)