如何并行运行网络项目的分支?

tha*_*smo 0 branch virtual-machine vhosts docker

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

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

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

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

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

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

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

非常感谢您的回答。

Man*_*utz 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 作为代理的替代方法。

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

  • 我可能会将主机目录“挂载”到容器中,以便在容器重建期间保留您的 mysql 数据库文件夹(请参阅绑定挂载:http://docs.docker.io/en/latest/commandline/command/run/) (2认同)