如何用Docker Compose在同一主机同时部署应用的多个独立版本?
同一主机用Docker Compose并行部署多版本应用的解决方案
当然可以实现,你遇到的问题根源是Docker Compose默认以当前目录名称作为项目标识符,两次执行命令用的是同一个项目,所以Compose会认为你要更新现有项目,从而替换掉之前的容器。只要让每个版本对应独立的Compose项目,就能实现并行部署,具体有几种方法:
方法1:用-p/--project-name指定独立项目名
直接在docker compose命令里通过-p参数给每个版本指定唯一的项目名,这样Compose会把它们当成完全独立的项目来管理:
VERSION=test1 docker compose -p my_project_test1 up -d VERSION=test2 docker compose -p my_project_test2 up -d
这样两个版本的容器、网络等资源会完全隔离,不会互相覆盖。
方法2:结合环境变量配置项目名
可以修改你的compose.yaml,用Compose内置的COMPOSE_PROJECT_NAME变量来统一资源命名,这样更灵活:
services: db: name: ${COMPOSE_PROJECT_NAME}.db image: db:$VERSION networks: - my_bridge app: name: ${COMPOSE_PROJECT_NAME}.app image: app:$VERSION networks: - my_bridge networks: my_bridge: name: ${COMPOSE_PROJECT_NAME}_bridge
然后通过环境变量指定项目名和版本:
COMPOSE_PROJECT_NAME=my_project_test1 VERSION=test1 docker compose up -d COMPOSE_PROJECT_NAME=my_project_test2 VERSION=test2 docker compose up -d
这种方式能让项目名和版本强关联,资源命名更规整。
方法3:用不同目录隔离分支代码
如果你的不同版本来自不同Git分支,可以把每个分支的代码复制到独立的目录中,比如./app-test1和./app-test2,然后分别进入对应目录执行docker compose up命令:
cd ./app-test1 VERSION=test1 docker compose up -d cd ../app-test2 VERSION=test2 docker compose up -d
因为Compose默认会把当前目录名作为项目名,所以不同目录下的部署会自动隔离,不用额外加参数。
补充说明
你之前的配置里虽然给容器和网络加了$VERSION变量,但Compose的核心项目标识还是同一个,所以它会判定为同一项目的更新操作。只有通过项目名隔离,才能让Compose将不同版本视为独立的部署实例。
内容的提问来源于stack exchange,提问作者Guillaume Chérel
相关产品推荐
相关产品推荐

