You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Docker Compose停止企业级服务而非基础服务?

解决Docker Compose停企业服务不影响共享基础服务的方案

当然可以解决!针对你遇到的这个「停企业服务时要么误停共享基础服务,要么单独停企业yml报错」的问题,Docker Compose有几种实用的方案,我给你详细拆解:

方案1:用Profiles分组服务(最推荐)

Profiles是Docker Compose专门用来分组服务的特性,完美适配你的场景——让基础服务默认一直运行,每个企业的服务归到专属的profile里,启动/停止时只针对对应profile操作就行。

步骤1:修改企业服务的Compose文件

打开docker-compose-company-1.yml,给所有企业相关的服务加上profiles: ["company-1"]字段,比如:

services:
  web-service-company:
    profiles: ["company-1"]
    # 你原来的镜像、端口、挂载等配置都保留
  crons-company-services:
    profiles: ["company-1"]
    # 原配置不变
  # 剩下的企业服务都照这个格式加profiles字段

同理,给docker-compose-company-2.yml的所有服务加上profiles: ["company-2"]。基础服务的docker-compose.base.yml不用改,默认会一直运行。

步骤2:启动服务

  • 先启动基础服务(可选,启动企业服务时如果基础服务没跑,会自动启动):
docker-compose -f docker-compose.base.yml up -d
  • 启动企业1的服务:
docker-compose -f docker-compose.base.yml -f docker-compose-company-1.yml --profile company-1 up -d

步骤3:停止企业1服务(不碰基础服务)

直接指定profile停止,只会干掉该profile下的所有企业服务,基础服务继续跑:

docker-compose -f docker-compose.base.yml -f docker-compose-company-1.yml --profile company-1 down

方案2:把基础服务做成独立Compose项目

把基础服务和企业服务分成完全独立的Compose项目,各自生命周期互不干扰,企业服务通过网络连接访问基础服务。

步骤1:单独启动基础服务

找个单独的目录(比如base-services)放docker-compose.base.yml,然后启动它作为独立项目:

cd base-services
docker-compose -f docker-compose.base.yml -p base-services up -d

这里-p base-services是给基础服务项目起个名字,避免和企业项目混在一起。

步骤2:修改企业服务的Compose文件

让企业服务加入基础服务的网络,这样就能直接用服务名访问基础服务了。在docker-compose-company-1.yml末尾加这段:

networks:
  default:
    external:
      name: base-services_default

这样企业服务就和基础服务在同一个网络里,原来的depends_onlinks配置都不用改,直接就能访问mongodb-serviceredis-service这些基础服务。

步骤3:启动&停止企业服务

启动企业1服务时指定项目名:

docker-compose -f docker-compose-company-1.yml -p company-1 up -d

停止的时候直接down这个企业项目就行,完全不会影响基础服务:

docker-compose -p company-1 down

方案3:直接指定要停止的服务名(临时救急)

如果不想改Compose文件,也可以直接在down命令里列出所有企业服务的名字,只停这些服务:
先确认企业1的服务名:

docker-compose -f docker-compose.base.yml -f docker-compose-company-1.yml ps

然后执行down命令,把所有企业服务列进去:

docker-compose -f docker-compose.base.yml -f docker-compose-company-1.yml down web-service-company crons-company-services mongodb-company communicate-with-master company-server-server

这个方法的缺点是每次都要手动列服务名,不如前两个方案方便,但应急用没问题。


内容的提问来源于stack exchange,提问作者Ankur Loriya

火山引擎 最新活动