多Docker Compose项目服务隔离异常:数据共享与版本冲突求助
多Docker项目数据隔离与PHP版本独立解决方案
问题背景
我有多个开发中的网站项目,每个项目都配有独立的docker-compose.yml,核心依赖PHP、MySQL、Nginx等服务。已在每个项目的.env文件中配置唯一的COMPOSE_PROJECT_NAME,并设置动态容器名称。项目目录结构:
/projects /project1 /.env /docker-compose.yml /project2 /.env /docker-compose.yml
遇到两个核心问题:
- 不同项目的MySQL数据库互相可见,销毁/重建某项目的MySQL容器会导致其他项目数据丢失。
- 部分项目需PHP7.x版本,部分需PHP8.x版本,但修改Dockerfile版本后所有项目会同步更新,引发崩溃。
运行环境:Windows10 Pro + WSL2 Ubuntu
问题1:MySQL数据跨项目共享/丢失的解决
原因
当前docker-compose.yml中MySQL的存储卷使用了宿主机固定目录绑定:
volumes: - /docker/mysql-dump:/var/lib/mysql
所有项目的MySQL容器都挂载到宿主机的同一个目录,导致数据完全共享,容器重建时会清空该目录下所有数据。
解决方案
使用项目专属命名卷实现数据隔离,步骤如下:
- 修改MySQL服务的volumes配置,替换为动态命名卷:
mysql: # 其他配置不变 volumes: - ${COMPOSE_PROJECT_NAME}_mysql:/var/lib/mysql # 动态卷名,每个项目独立 - ./docker/mysql/my.cnf:/etc/mysql/my.cnf
- 在
docker-compose.yml的volumes区块添加该动态卷定义:
volumes: ${COMPOSE_PROJECT_NAME}_mysql: driver: local sail-redis: driver: local # 若需隔离Redis数据,同理改为${COMPOSE_PROJECT_NAME}_redis
可选方案:若偏好宿主机目录存储,可改为
./docker/mysql/data:/var/lib/mysql,每个项目的数据库数据会存在自身项目目录下的docker/mysql/data中,同样实现隔离。
问题2:PHP版本全局同步的解决
原因
当前app服务的镜像名固定为digitalocean.com/php,所有项目共用同一个镜像标签,当某项目重建镜像时会覆盖全局镜像,导致所有项目启动时自动使用新版本。
解决方案
为每个项目生成独立的PHP镜像,步骤如下:
- 在每个项目的
.env文件中添加PHP_VERSION变量,例如:
# project1/.env PHP_VERSION=7.4 # project2/.env PHP_VERSION=8.2
- 修改项目的
Dockerfile,将基础镜像改为动态版本:
FROM php:${PHP_VERSION}-fpm # 替换原固定的php:8.2-fpm
- 修改
docker-compose.yml中app服务的镜像名,添加项目标识和版本标签:
app: build: context: . dockerfile: Dockerfile image: ${COMPOSE_PROJECT_NAME}-php:${PHP_VERSION} # 动态镜像名,避免冲突 # 其他配置不变
- 重建镜像时,每个项目会生成独立的镜像,启动时仅使用自身项目的镜像,不会互相覆盖。
额外注意事项
- 端口冲突:当前所有项目的webserver默认绑定80/443端口,会导致启动失败。建议在
.env中配置动态端口:
# project1/.env FORWARD_WEB_PORT=8081 FORWARD_PMA_PORT=8281 # project2/.env FORWARD_WEB_PORT=8082 FORWARD_PMA_PORT=8282
然后修改docker-compose.yml中的端口配置:
webserver: ports: - "${FORWARD_WEB_PORT:-80}:80" - "${FORWARD_WEB_PORT:-443}:443" pma: ports: - "${FORWARD_PMA_PORT:-8282}:80"
内容的提问来源于stack exchange,提问作者MatH
相关产品推荐
相关产品推荐

