使用 docker 运行多个项目,每个项目都使用 docker-compose 运行

Posted

技术标签:

【中文标题】使用 docker 运行多个项目,每个项目都使用 docker-compose 运行【英文标题】:Running multiple projects using docker which each runs with docker-compose 【发布时间】:2016-05-08 22:13:09 【问题描述】:

我们正在使用微服务方法来构建我们的产品。我们正在使用一些项目,每个项目都使用 docker-compose 来运行。问题是在开发环境中,如果我们要在多个项目中更改代码并测试开发的代码,我们必须单独运行项目并手动将它们链接在一起。

现在我们要创建一个开发工具包,它可以克隆项目并将它们一起运行并处理链接。 docker-compose 可以处理多个 docker-compose 文件吗?如果没有,是否有足够的工具为我们做到这一点?或者有什么推荐的方法可以实现我们的目标?

编辑:例如,我们有两个项目:PROJECT_A 和 PROJECT_B。每个都有自己的 docker-compose.yml 并且每个都需要 postgresql 才能运行。我们在 PROJECT_A 中有 docker-compose.yml,如下所示:

db:
    image: postgres:9.4
    ports:
      - "5432"

project_a:
    build: .
    command: python2.7 main.py
    links:
        - db

我们在 PROJECT_B 中有 docker-compose.yml,如下所示:

db:
    image: postgres:9.4
    ports:
      - "5432"

project_b:
    build: .
    command: python2.7 main.py
    links:
        - db

每个项目都可以单独运行并且运行良好。但是,如果我们想更改 PROJECT_A 和 PROJECT_B 之间的 api,我们需要运行这两个项目并将它们链接在一起以测试我们的代码。现在我们想编写一个开发工具包项目,它可以运行这两个项目并在需要时链接它们。最好的方法是什么?

【问题讨论】:

【参考方案1】:

我不是 100% 确定您的问题,所以这将是一个广泛的答案。

1) 如果在同一台机器或服务器集群上运行,所有内容都可以在同一个撰写文件中

#proxy
haproxy:
  image: haproxy:latest
  ports:
    - 80:80


#setup 1
ubuntu_1:
  image: ubuntu
  links:
    - db_1:mysql
  ports:
    - 80

db1:
  image: ubuntu
  environment:
    MYSQL_ROOT_PASSWORD: 123


#setup 2
ubuntu_2:
   image: ubuntu
   links:
     - db_2:mysql
   ports:
    - 80

db2:
  image: ubuntu
  environment:
    MYSQL_ROOT_PASSWORD: 123

还可以合并多个 yml 文件,例如$docker-compose -f [File A].yml -f [File B].yml up -d

2) 构建中的每个容器都可以使用 compose 单独控制。$docker-compose stop/start/build/ ubuntu_1

3) 使用 $docker-compose build只会在已完成更改的地方重建。

这里有更多可能有用的信息 https://docs.docker.com/compose/extends/#extending-services

如果以上都不正确,请举例说明。

【讨论】:

我编辑了我的问题并添加了一个示例。为了使用您的解决方案,我们可以编写一个 makefile 来解析每个 docker-compose.yml 并将它们完全组合在一个文件中。但是这种方法需要解析文件并处理许多错误情况(例如示例中的相同数据库名称),这有点脏。如果我们使用 -f 选项来运行不同的 yml 文件,我们不能将它们内部的服务链接在一起。在这种情况下,我没有明白扩展如何帮助我。从文档中的示例来看,重用来自同一服务的配置似乎很有帮助。 你不能只使用 db_a: / db_b: 并且你会有单独的容器。【参考方案2】:

这是我们为遇到同样问题的其他人提供的方法:

现在我们的每个项目都有一个可以独立运行的 docker-compose。我们有另一个名为“development-kit”的项目,它克隆所需的项目并将它们存储在一个目录中。我们可以使用类似的命令来运行我们的项目:

python controller.py --run projectA projectB

它使用 docker-compose up 命令运行每个项目。然后,当所有项目都启动并运行时,它开始将所有其他项目主 docker 的 IP 添加到其他项目,方法是使用以下命令将它们添加到 /etc/hosts ips:

# getting contaier id of projectA and projectB
CIDA = commands.getoutput("docker-compose ps -q %s" % projectA)
CIDB = commands.getoutput("docker-compose ps -q %s" % projectB)
# getting ip of container projectA
IPA = commands.getoutput("docker inspect --format ' .NetworkSettings.IPAddress ' %s" % CIDA)

现在,为了从 projectB 向 projectA 发送请求,我们只需在 projectB 的设置中将 projectA IP 定义为“projectA”。

【讨论】:

【参考方案3】:

您可以通过使用docker-composeextends 功能组合来自多个文件的服务来做到这一点。将您的项目放在某个明确定义的位置,并使用相对路径引用它们:

../
├── foo/
│   └── docker-compose.yml
└── bar/
    └── docker-compose.yml

foo/docker-compose.yml:

base:
    build: .

foo:
    extends:
        service: base
    links:
        - db

db:
    image: postgres:9

如果你想自己测试这个项目,你可以这样做:

sudo docker-compose up -d foo

创建 foo_foo_1

bar/docker-compose.yml:

foo:
    extends:
        file: ../foo/docker-compose.yml
        service: base
    links:
        - db

bar:
    build: .
    extends:
        service: base
    links:
        - db
        - foo

db:
    image: postgres:9

现在您可以同时测试这两种服务:

sudo docker-compose up -d bar

创建 bar_foo_1 创建 bar_bar_1

【讨论】:

PROJECT_A == fooPROJECT_B == bar? 请注意,docker-compose v3 不再支持关键字 extends

以上是关于使用 docker 运行多个项目,每个项目都使用 docker-compose 运行的主要内容,如果未能解决你的问题,请参考以下文章

暴露多个本地运行的 docker 容器

使用 Docker Compose 的微服务:同一个容器,多个项目

将 Docker 用于多个 php 应用程序

Docker使用教程笔记

Docker使用教程笔记

Docker使用教程笔记