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

时间:2016-01-31 12:42:12

标签: docker development-environment docker-compose microservices

我们正在使用微服务方法来构建我们的产品。我们正在使用一些项目,每个项目都使用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,我们需要运行这两个项目并将它们链接在一起来测试我们的代码。现在我们要编写一个开发工具包项目,该项目可以运行这两个项目并在需要时链接它们。这样做的最佳方法是什么?

3 个答案:

答案 0 :(得分:7)

您可以使用docker-compose的{​​{3}}功能,通过组合多个文件中的服务来实现此目的。将项目放在一个定义明确的位置,并使用相对路径引用它们:

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

富/搬运工-compose.yml:

base:
    build: .

foo:
    extends:
        service: base
    links:
        - db

db:
    image: postgres:9

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

sudo docker-compose up -d foo
  

创建foo_foo_1

酒吧/搬运工-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

答案 1 :(得分:3)

对你的问题我不是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)构建中的每个容器都可以用单独控制。
$docker-compose stop/start/build/ ubuntu_1

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

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

如果以上都不正确,请提供构建示例。

答案 2 :(得分:1)

对于遇到同样问题的其他人来说,这是我们的方法:

现在我们的每个项目都有一个docker-compose,可以独立运行。我们还有另一个名为“开发套件”的项目。哪些克隆需要项目并将它们存储在目录中。我们可以使用类似命令运行我们的项目:

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,我们只需将projectA IP定义为" projectA"在projectB的设置中。