如何使用Docker Compose对一组相互依赖的容器进行扩容?
解决方案
不需要放弃Docker Compose,以下几个方案可以满足你的需求:
方案1:用项目名称隔离多套独立系统
Docker Compose的-p(或--project-name)参数可以给每套系统分配独立的项目名称,这样同一套docker-compose.yml就能启动多套完全隔离的系统(包括专属网络、容器命名空间),完美适配你的场景:
- 保持你现有的
docker-compose.yml不变(B、C的命令里硬编码A没问题,同一项目内服务名就是A) - 启动第一套系统:
docker-compose -p system1 up -d - 启动第二套系统:
docker-compose -p system2 up -d - 要进入某套系统的交互式终端,比如system1的B_client:
如果需要实时绑定终端交互(比如启动时就要操作),可以直接前台启动指定服务:docker exec -it system1_B_client_1 bash
这种方式会把B_client的终端输出直接挂到当前控制台,需要单独开终端处理每个服务的交互需求。docker-compose -p system1 up B_client
这个方案的优势是零配置修改、系统完全隔离,操作成本最低。
方案2:用环境变量动态配置服务名称
如果需要在同一项目下区分多套系统(不推荐,不如项目隔离清晰),可以通过环境变量动态替换服务名和B、C的命令参数:
修改你的docker-compose.yml:
version: '3.8' services: ${SERVICE_A_NAME:-A}: tty: true stdin_open: true B_client_${INSTANCE:-1}: working_dir: /emulator command: bash -c "./build/app ${SERVICE_A_NAME:-A} 1000" tty: true stdin_open: true depends_on: - ${SERVICE_A_NAME:-A} C_client_${INSTANCE:-1}: command: bash -c "./build/app ${SERVICE_A_NAME:-A} 1000" tty: true stdin_open: true depends_on: - ${SERVICE_A_NAME:-A}
启动第一套系统:
export SERVICE_A_NAME=A1 INSTANCE=1 docker-compose up -d
启动第二套系统:
export SERVICE_A_NAME=A2 INSTANCE=2 docker-compose up -d
这样每套系统的服务名会分别是A1/B_client_1/C_client_1和A2/B_client_2/C_client_2,注意如果有端口映射需要避免冲突。
方案3:复制服务定义到同一配置文件
如果偏好把所有系统配置放在一个文件里,可以直接复制多份服务定义,用不同名称区分:
version: '3.8' services: # 第一套系统 A1: tty: true stdin_open: true B_client_1: working_dir: /emulator command: bash -c "./build/app A1 1000" tty: true stdin_open: true depends_on: - A1 C_client_1: command: bash -c "./build/app A1 1000" tty: true stdin_open: true depends_on: - A1 # 第二套系统 A2: tty: true stdin_open: true B_client_2: working_dir: /emulator command: bash -c "./build/app A2 1000" tty: true stdin_open: true depends_on: - A2 C_client_2: command: bash -c "./build/app A2 1000" tty: true stdin_open: true depends_on: - A2
启动所有服务:
docker-compose up -d
进入指定服务的终端:
docker exec -it B_client_1 bash
这个方案直观但维护麻烦,新增系统需要手动复制配置。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

