使用 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-compose
的extends
功能组合来自多个文件的服务来做到这一点。将您的项目放在某个明确定义的位置,并使用相对路径引用它们:
../
├── 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 == foo
和PROJECT_B == bar
?
请注意,docker-compose v3 不再支持关键字 extends以上是关于使用 docker 运行多个项目,每个项目都使用 docker-compose 运行的主要内容,如果未能解决你的问题,请参考以下文章