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

Ser*_*rov 6 deployment docker devops

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

  1. 说,我用nginx创建一个Dockerfile,一些数据库和其他创建容器的东西并运行正常.

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

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

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

  • 我是否将它作为依赖项放在我在第一步中创建的Dockerfile中,并且每次从头开始重新创建容器?
  • 或者说,我曾经部署容器,但有内部Dockerfile程序,安装的命令或通过钩拉从回购的代码utils的?
  • 如果容器正在运行但我想改变一些设置,例如nginx会怎么样?我是否将这些更改添加到Dockerfile中并重新创建图像?

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

Eug*_*yer 2

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

部署到暂存/生产/预生产

A)

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

这肯定是最 docker 风格的方式,并且完全符合 docker 哲学。它具有高度便携性、可重复性,适用于从一个容器到“集群”数千个容器的任何容器。例如,当您需要更多容器时,例如由于流量/负载过大,这个概念不会突然水平扩展。

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

应选择此策略用于生产用途,这样部署就不会那么频繁。如果您关心容器重建期间(升级时)的停机时间,也有一些很好的概念可以解决这个问题。

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

b)

或者,我是否部署容器一次,但在 Dockerfile 中包含安装实用程序的程序,通过命令或通过钩子从存储库中提取代码?

对于非常频繁的部署来说,这是更常见的做法。您可以采用拉(您所说的)或推(docker cp / ssh scp)概念,而我猜后者在这种环境中是首选。

我们将其用于任何类型的暂存实例策略,这基本上应该反映当前的“代码库”及其状态。我们还将其用于冒烟测试和 CI,但具体取决于应用程序。如果应用程序实际上对其依赖项进行了很多更改,并且干净的构建需要重新构建这些依赖项以真正确保按预期测试内容,那么我们实际上会在 CI 期间重建映像。


配置管理

1.

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

我没有将其用作 c),因为这是配置管理,而不是应用程序部署,并且这个问题的答案可能非常复杂,具体取决于您的情况。一般来说,如果重新部署需要更改配置,这取决于您的配置管理,您可以选择b)还是必须选择a)。

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

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

发展

在开发中,您通常会重用用于生产的 docker-compose.yml 文件,但使用 docker-compose-dev.yml 重载它,例如挂载代码文件夹、设置 RAILS_ENV=development、重新配置/挂载一些其他配置,如 xdebug或者更详细的 nginx 登录,无论您需要什么。您还可以添加一些假 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(不过我有偏见)