0

我想在单独的虚拟主机/域上运行/托管项目 Git 存储库的特定分支,以进行测试/预览。我正在考虑一个过程,该过程将在 Git 推送之后将分支部署到“预览”或“测试”服务器,以便在浏览器中进行手动测试。

例如,最好将一个名为“feature/my-new-feature”的分支部署到特定的服务器,并通过“my-new feature.project.com”之类的 URL 访问项目。

我面临的问题(理论上,首先)主要是关于数据库连接/配置、端口等方面的挑战。例如,如果在单个服务器上的不同子域上运行多个分支,它们将需要共享一个 MySQL安装 - 但实际上每个分支都需要它自己的、单独的 MySQL 实例,因为所有分支的数据库配置都不会改变,这意味着它们连接到同一主机并使用相同的数据库名称、用户等。

一种方法可能是为它自己的子域上的每个分支运行一个虚拟机,将端口直接映射到虚拟机(至少我认为这是可能的),但对于许多具有许多分支的项目来说,这意味着我需要很多硬件处理这件事的权力。(而且可能还有很多钱。)

然后我听说了 docker 和/或 Linux 容器,并认为也许这可以解决,但我不完全确定它是如何以及是否有效。

我想知道在没有干扰服务和相关冲突问题的情况下并行运行多个版本的项目的既定方法是什么。

是否可以使用 docker 进行这样的设置,或者这是我前进的完全错误的方向?

非常感谢您的回答。

4

1 回答 1

5

你的问题范围相当大。

关于 linux 容器和 docker 是否可用于您的想法:是的,当然。容器轻量级且部署成本低(比 VM 便宜得多),并且使用容器进行持续部署/并行测试确实效果很好。

现在,这是 docker 的工作原理:您创建一个 dockerfile 来描述您的应用程序容器内需要哪些服务(mysql、php 等),您需要在容器操作系统上进行哪些特定的调整/设置,以及将应用程序代码放在哪里。然后您从该 dockerfile 创建一个“图像”,最后从该图像启动一个新容器,该容器将完全独立,为您的应用程序执行提供一个“洁净室”上下文。

容器有一个特定的 ip,并将公开您在其上选择的服务。然后这些服务将被 NAT 到主机上(您甚至可以在启动时选择哪个端口)。然后使用 nginx 对这些容器进行反向代理非常简单,以便从各种域名/url 为这些容器提供服务。

您可以在此处了解 dockerfile(以及一般的 docker):http: //docs.docker.io/en/latest/

如果我确实要以这种方式测试分支,我会:

  • 编写一个 Dockerfile 描述我的应用程序堆栈,并将其推送到我项目的每个分支
  • 使用 CI 工具(jenkins、strider 等)并将其挂接到 github 上,以便在每次推送提交时构建一个新镜像(docker build -rm -t me/myproject:branchname),然后停止之前运行的容器对于该分支,并从新构建的映像启动一个新容器(假设构建成功)
  • 将我的主机 nginx 设置为反向代理,映射,http://example/branchhttp://localhost:NATTED_PORT/

请注意,尽管我没有第一手经验,但 Hipache ( https://github.com/dotcloud/hipache ) 可能是摆弄 nginx 作为代理的替代方法。

这是对所涉及步骤的粗略描述,您可能需要学习一些东西,但我希望这应该让您走上正轨。

于 2013-10-05T12:24:31.877 回答