Docker部署两个项目时,首个项目无法连接MariaDB的问题
问题:Docker中WordPress项目1无法连接MariaDB,项目2正常
我用Docker搭建两个类似项目,均使用wordpress:php7.4-apache(项目2为php7.3-apache)和mariadb:10.3.39镜像。为实现同时运行,给两个MariaDB配置了不同端口:项目1用3306,项目2用3307。但即使单独运行一个项目、使用相同端口,项目1仍无法连接MariaDB,项目2则正常,且两者配置几乎一致。
项目1配置
.env文件
# .env COMPOSE_PROJECT_NAME=project1 MYSQL_ROOT_PASSWORD=root MYSQL_DATABASE=database MYSQL_USER=docker MYSQL_PASSWORD=secret
docker-compose.yml
version: '3' services: db: platform: linux/x86_64 image: mariadb:10.3.39 ports: - "3306:3306" volumes: - my_db:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} wordpress: image: wordpress:php7.4-apache depends_on: - db ports: - "8000:80" volumes: - ./:/var/www/html environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: ${MYSQL_USER} WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD} WORDPRESS_DB_NAME: ${MYSQL_DATABASE} volumes: my_db:
项目2配置
.env文件
# .env COMPOSE_PROJECT_NAME=project2 MYSQL_ROOT_PASSWORD=root MYSQL_DATABASE=database MYSQL_USER=docker MYSQL_PASSWORD=secret
docker-compose.yml
version: '3' services: db: platform: linux/x86_64 image: mariadb:10.3.39 ports: - "3307:3306" volumes: - my_db:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} wordpress: image: wordpress:php7.3-apache depends_on: - db ports: - "8001:80" volumes: - ./:/var/www/html environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: ${MYSQL_USER} WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD} WORDPRESS_DB_NAME: ${MYSQL_DATABASE} volumes: my_db:
错误现象
项目1连接失败
执行命令:
docker exec -it 609f7807c859 mysql -udocker -psecret -e 'show databases;'
返回错误:
ERROR 1045 (28000): Access denied for user 'docker'@'localhost' (using password: YES)
项目2连接正常
执行命令:
docker exec -it 484a719c2e6e mysql -udocker -psecret -e 'show databases;'
返回结果:
---------------------- | Database | ---------------------- | database | | information_schema |
解决方案
1. 清理同名Docker卷
两个项目都使用了未指定前缀的my_db卷,Docker会自动加上COMPOSE_PROJECT_NAME作为前缀,但如果之前启动时未正确隔离,可能导致卷数据冲突。执行以下步骤:
- 停止项目1容器:在项目1目录下运行
docker-compose down - 删除项目1关联的数据库卷:
docker volume rm project1_my_db - 重新启动项目1:
docker-compose up -d
2. 验证数据库用户权限
如果清理卷后仍有问题,进入项目1的MariaDB容器,用root账号检查用户权限:
docker exec -it project1_db_1 mysql -uroot -proot
执行SQL查看用户主机权限:
SELECT user, host FROM mysql.user;
确保docker用户的host为%(允许所有主机连接),若不是则执行:
GRANT ALL PRIVILEGES ON database.* TO 'docker'@'%'; FLUSH PRIVILEGES;
3. 添加数据库健康检查
确保MariaDB完全启动后再启动WordPress,避免连接时数据库未就绪。修改项目1的docker-compose.yml:
db: # 保留原有配置 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot"] interval: 10s timeout: 5s retries: 5 wordpress: # 保留原有配置 depends_on: db: condition: service_healthy
内容的提问来源于stack exchange,提问作者superfive33
相关产品推荐
相关产品推荐

