You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多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

遇到两个核心问题:

  1. 不同项目的MySQL数据库互相可见,销毁/重建某项目的MySQL容器会导致其他项目数据丢失。
  2. 部分项目需PHP7.x版本,部分需PHP8.x版本,但修改Dockerfile版本后所有项目会同步更新,引发崩溃。
    运行环境:Windows10 Pro + WSL2 Ubuntu

问题1:MySQL数据跨项目共享/丢失的解决

原因

当前docker-compose.yml中MySQL的存储卷使用了宿主机固定目录绑定:

volumes:
    - /docker/mysql-dump:/var/lib/mysql

所有项目的MySQL容器都挂载到宿主机的同一个目录,导致数据完全共享,容器重建时会清空该目录下所有数据。

解决方案

使用项目专属命名卷实现数据隔离,步骤如下:

  1. 修改MySQL服务的volumes配置,替换为动态命名卷:
mysql:
    # 其他配置不变
    volumes:
        - ${COMPOSE_PROJECT_NAME}_mysql:/var/lib/mysql # 动态卷名,每个项目独立
        - ./docker/mysql/my.cnf:/etc/mysql/my.cnf
  1. 在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镜像,步骤如下:

  1. 在每个项目的.env文件中添加PHP_VERSION变量,例如:
# project1/.env
PHP_VERSION=7.4

# project2/.env
PHP_VERSION=8.2
  1. 修改项目的Dockerfile,将基础镜像改为动态版本:
FROM php:${PHP_VERSION}-fpm # 替换原固定的php:8.2-fpm
  1. 修改docker-compose.yml中app服务的镜像名,添加项目标识和版本标签:
app:
    build:
        context: .
        dockerfile: Dockerfile
    image: ${COMPOSE_PROJECT_NAME}-php:${PHP_VERSION} # 动态镜像名,避免冲突
    # 其他配置不变
  1. 重建镜像时,每个项目会生成独立的镜像,启动时仅使用自身项目的镜像,不会互相覆盖。

额外注意事项

  • 端口冲突:当前所有项目的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:32:52