【问题标题】:Run multiple docker compose运行多个 docker compose
【发布时间】:2017-05-13 19:35:05
【问题描述】:

我正在使用在 3 个不同的 docker 上运行的应用程序:

  • 第一个是可使用 REST API 调用的服务器 HTTP
  • 第二个是rabbitmq
  • 第三个是工人

整个应用程序以docker-compose up启动

真的很简单:)

我想让它可扩展并独立运行整个应用程序的多个实例(3 个 docker 映像),然后放置一个像 haproxy 这样的负载均衡器,它将重定向到其中一个应用程序。

我看到我可以使用docker-compose up --scale blablabla,但问题是我可以扩展容器,但我真的想保持不同的“应用程序”独立。

例如,如果我想要 3 个版本的应用程序,我将拥有 9 个 docker 图像等。

我看到我们可以使用--privilege 在 docker 内部运行 docker(允许我创建一个内部有 3 个 docker 的 docker),但我在 Stack Overflow 上读到它不是一个合适的解决方案。

你有解决办法吗?或者至少要阅读一些文件。

我听说 Kubernetes 可能是一个解决方案,但我不确定。我读(在堆栈上)

如果您需要紧密绑定多个容器,您可能需要查看在其“pod”内运行 docker 的 Kubernetes

【问题讨论】:

    标签: docker kubernetes docker-compose


    【解决方案1】:

    听起来您只希望 Compose 应用程序的 3 个不同环境或“堆栈”彼此独立运行。如果是这种情况,您可以使用--project-name-p 选项来处理此问题docker-compose。一个例子是这样的:

    • 启动应用程序版本 1:docker-compose -p appv1 up -d
    • 启动应用程序版本 2:docker-compose -p appv2 up -d
    • 启动应用程序版本 3:docker-compose -p appv3 up -d

    此时,您将运行 3 组不同的容器,它们可以相互独立地扩展。 Docker Compose 会将项目名称(通常从文件夹名称推断出来)添加到容器名称之前。您最终会得到容器名称,例如 appv1_worker_1appv2_worker_1appv3_worker1。如果您仅扩展 appv2 工作服务 (docker-compose -p appv2 scale worker=2),您将获得额外的 appv2_worker_2

    默认情况下,compose 总是创建一个容器可以在其中进行通信的默认网络。在这种情况下,您将拥有 3 个独立的网络(appv1_defaultappv2_defaultappv3_default)。

    如果您接下来想为每个项目名称运行不同的图像,您可以在docker-compose.yml 中使用环境变量插值。例如,您可以为服务指定image: ${MYIMAGE},然后执行以下操作:

    • MYIMAGE=myorg/myapp:v1 docker-compose -p appv1 up -d
    • MYIMAGE=myorg/myapp:v2 docker-compose -p appv2 up -d

    希望这对在 Docker Compose 中执行此操作有所帮助。

    【讨论】:

    • 非常感谢。你拯救了我的一天。只是最后一个问题。因为我将有 3 个不同的 http 处理程序。您是否知道我如何设置负载均衡器(如 haproxy 或其他东西)在 3 之间进行调度。
    • 这样的例子很多。一个是github.com/docker/dockercloud-haproxy。另一个使用 docker-gen 的是github.com/indiehosters/haproxy/blob/master/docker-compose.yml。基本上,您可以将 HAProxy 作为服务运行并将其链接到您的应用程序。正如每个项目都有自己的网络一样,每个项目也会有自己的 HAProxy。但是,如果您想在同一主机上运行多个并发布一个端口,您可能必须创建一个 ${PORT} 环境变量并为每个堆栈设置不同的端口(就像图像一样)。
    • 非常感谢。我想我会去环境变量。我找到了一个不错的教程。我会尝试。感谢您的宝贵时间
    • 是否有运行docker-compose run app <cmd>的等价物?
    • 我认为它与其他的没有什么不同。使用-p 设置特定项目,然后设置服务和命令:docker-compose -p appv2 run myservice echo "hello"
    【解决方案2】:

    如果您想从单个命令一次运行多个 docker-compose 文件,请使用此方法。 如果 compose 文件是 docker-compose1.yml 和 docker-compose2.yml,您可以使用 docker-compose1.yml 运行这两个 docker 文件,

    docker-compose -f docker-compose1.yml -f docker-compose2.yml up

    【讨论】:

    • 此方法与将服务复制并粘贴到同一个 docker-compose 文件中的方法相同。例如,如果您有两个名为 app 的服务,那么运行它的结果将是一个带有一个 app 容器的单个堆栈,该容器具有来自两个撰写文件的混合配置。
    • @RyanPatterson 这不是真的。就我而言,我有不同 docker-compose 版本的 docker-compose 文件,我可以使用 docker-compose -f file1 -f file2 ... 样式命令启动这些文件。如果您 copy and paste 将服务合并到 1 个 compose 文件中将不会简单地工作,因为 yml 语法存在差异。如果您尝试从 docker compose 2.x 切换到 3.x 中的某些内容,则需要付出很多努力
    【解决方案3】:

    您可以使用.env 文件。在那里你必须设置一个 COMPOSE_FILE 环境变量并将其设置为COMPOSE_FILE=a.yaml:b.yaml:c.yaml

    现在您可以使用docker-compose up 运行所有撰写文件

    projekt/
        .env
        a.yaml
        b.yaml
        c.yaml
    

    【讨论】:

      猜你喜欢
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 2019-11-15
      • 2016-05-08
      • 1970-01-01
      相关资源
      最近更新 更多