如何在 development/deployment 工作流程中使用 Docker?

How to use Docker in the development/deployment workflow?

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

  1. 说,我用 nginx 创建了一个 Docker 文件,一些数据库和其他创建容器的东西 运行 没问题。

  2. 我把它放在云端的某个地方并执行它来安装和配置所有依赖项和环境设置。

  3. 接下来,我有一个包含 Web 应用程序的存储库,我想将其 运行 放入我在前两步中创建和部署的容器中。我会定期处理它并推动更改。

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

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

我认为没有单一的 "use only this" 答案 - 正如您已经概述的那样,有不同的可行概念可用。

部署到 staging/production/pre-production

一)

Do I put it as a dependency inside the Dockerfile I create in the 1st step and recreate the container each time from scratch?

这无疑是最 docker 的方式,完全符合他的 docker 哲学。它具有高度便携性、可重现性,适用于任何容器,从一个容器到 "swarm" 数千个。例如。当您需要更多容器时,这个概念没有问题突然水平扩展,可以说是由于交通繁忙/负载。

它也符合只有 configuration/data 在 docker 容器中应该是动态的想法,而不是代码/二进制文件/工件

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

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

b)

Or, do I deploy the container once but have procedures inside Dockerfile that install utils that pull the code from repo by command or via hooks?

对于非常频繁的部署,这是一种更常见的做法。你可以使用拉(你说的)或推(docker cp / ssh scp)概念,而我想后者在这种环境中更受欢迎。

我们将此用于暂存实例的任何类型策略,它基本上应该反映当前 "codebase" 及其状态。我们也将其用于冒烟测试和 CI,但取决于应用程序。如果应用程序实际上改变了它的依赖项并且一个干净的构建需要重建这些以真正确保东西按预期进行测试,我们实际上在 CI.

期间重建图像

配置管理

1.

What if a container is running but I want to change some settings of, say, nginx? Do I add these changes into Dockerfile and recreate the image?

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

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

您还可以在部署时使用 https://github.com/markround/tiller,例如更改 ENV 变量或某种 yml 文件(tiller 支持不同的后端),并在部署期间自行调用 tiller。这很可能需要您拥有 ssh 或者您在主机上使用 ssh 并使用 docker cpdocker 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只会重载一些值,不会重新定义或复制它。

根据你的配置管理有多强大,你也可以在开发stack up时做一个预安装。

我们实际上为此使用脚手架,我们使用 https://github.com/xeger/docker-compose and after running it, we use docker exec and docker cp to preinstall a instance or stage something. Some examples are here https://github.com/EugenMayer/docker-sync/wiki/7.-Scripting-with-docker-sync

如果您在 OSX 下开发,并且由于 OSXFS / 代码共享而面临性能问题,您可能想看看 http://docker-sync.io(虽然我有偏见)