Docker Compose复用已有MySQL容器问题:原因及解决方案
问题描述
我有两个通过Docker Compose部署的项目,各自配了独立的MySQL容器:
- 第一个项目的MySQL配置和环境文件运行完全正常
- 第二个项目仅环境文件里的数据库凭证和第一个不一样,但运行时用自身凭证连不上,必须用第一个项目的凭证才能成功连接
- 就算停了第一个项目、修改第二个项目的卷名,问题还是没解决
第一个项目配置
Docker Compose的MySQL片段
mysql: image: mysql:latest env_file: mysql.env ports: - 3306:3306 networks: - my-network healthcheck: test: ["CMD-SHELL", "mysqladmin ping -h localhost -P 3306"] interval: 1s retries: 10 volumes: - mysql-data:/var/lib/mysql restart: always
mysql.env文件
MYSQL_ROOT_PASSWORD=root123@23 MYSQL_DATABASE=db1 MYSQL_USER=db_user_1 MYSQL_PASSWORD=db_pass1 MYSQL_PORT_INTERNAL=3306 MYSQL_HOST=mysql MYSQL_PORT_EXTERNAL=3306
第二个项目配置
Docker Compose的MySQL片段
mysql: image: mysql:latest env_file: mysql.env ports: - 3306:3306 networks: - my-new-network healthcheck: test: ["CMD-SHELL", "mysqladmin ping -h localhost -P 3306"] interval: 1s retries: 10 volumes: - mysql-data:/var/lib/mysql restart: always
mysql.env文件
MYSQL_ROOT_PASSWORD=root124@24 MYSQL_DATABASE=db2 MYSQL_USER=db_user_2 MYSQL_PASSWORD=db_pass2 MYSQL_PORT_INTERNAL=3306 MYSQL_HOST=mysql MYSQL_PORT_EXTERNAL=3306
问题根源
- 端口冲突:两个项目都把MySQL容器的3306端口映射到宿主机3306,就算停了第一个项目,宿主机端口可能被残留进程占用,或者启动第二个时实际连的是没清干净的第一个容器实例
- 卷复用导致数据残留:初始配置里两个项目用了同名的
mysql-data卷,MySQL第一次启动会按环境变量初始化数据库,但卷创建后,后续启动容器直接复用卷里的旧数据(包括第一个项目的用户凭证),改环境变量也不会重新初始化 - 环境变量加载异常:可能第二个项目的
mysql.env路径不对,或者Docker Compose没正确读取到,导致容器还是用旧凭证初始化
解决步骤
1. 彻底清理旧资源
先把相关的容器、网络、卷全清干净:
# 清理第一个项目 cd 第一个项目目录 docker-compose down -v # 清理第二个项目 cd 第二个项目目录 docker-compose down -v # 手动删除可能残留的mysql-data卷 docker volume rm mysql-data
2. 修改第二个项目的端口映射
避免宿主机端口冲突,把第二个项目的MySQL映射端口改成3307:
# 第二个项目Compose文件的mysql部分,修改ports项 ports: - 3307:3306
同时更新第二个项目的mysql.env:
MYSQL_PORT_EXTERNAL=3307
3. 给第二个项目配独立的卷
确保第二个项目用唯一的卷名,和第一个彻底隔离开:
# 第二个项目Compose文件的mysql部分,修改volumes项 volumes: - mysql-data-2:/var/lib/mysql
然后在Compose文件末尾加上卷的声明:
volumes: mysql-data-2:
4. 验证环境变量是否加载正确
启动第二个项目后,进入容器检查环境变量:
# 启动第二个项目 cd 第二个项目目录 docker-compose up -d # 进入mysql容器(替换成你的容器名) docker exec -it 你的第二个项目mysql容器名 bash # 查看root密码是否正确 echo $MYSQL_ROOT_PASSWORD
确认输出是root124@24,不是第一个项目的密码。
5. 测试连接
用第二个项目的凭证连接测试:
mysql -h localhost -P 3307 -u db_user_2 -p # 输入密码db_pass2,看看能不能正常连进db2数据库
内容的提问来源于stack exchange,提问作者Jinu Joseph Daniel
相关产品推荐
相关产品推荐

