docker-compose部署Drupal容器无法连接MySQL容器问题排查
Drupal容器连接MySQL失败排查方案
核心参数校验
首先确认Drupal安装向导填写的数据库连接参数完全匹配配置:
- 数据库主机地址填写 compose 中定义的数据库服务名
db-drupal,禁止填写localhost或127.0.0.1,容器内部网络中服务名会自动解析为对应容器IP - 数据库名填写
drupal,数据库用户名填写user,对应密码填写password - 无需额外指定端口,内部网络默认使用3306端口通信
最高发问题修复:MySQL8认证插件兼容问题
当前配置使用mysql:latest镜像,目前最新版为MySQL8.x系列,默认采用caching_sha2_password身份认证插件,Drupal内置的PHP数据库驱动暂不支持该认证方式,会直接导致连接失败。
修改docker-compose.yml中数据库服务配置,固定镜像版本、覆盖默认启动命令兼容旧认证方式:
db-drupal: image: mysql:8.0 command: --default-authentication-plugin=mysql_native_password --default-storage-engine=INNODB --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci environment: - MYSQL_DATABASE=drupal - MYSQL_USER=user - MYSQL_PASSWORD=password - MYSQL_ROOT_PASSWORD=password volumes: - Mysql:/var/lib/mysql restart: always # 新增健康检查,确认MySQL服务完全就绪 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-ppassword"] interval: 5s timeout: 5s retries: 10
修改后必须清理旧的MySQL持久化数据,否则初始化配置不会生效:
- 停止现有容器:
docker-compose down - 查询对应数据卷ID:
docker volume ls | grep Mysql,找到项目前缀命名的Mysql卷 - 删除旧数据卷:
docker volume rm 对应卷完整名称 - 同步修改Drupal服务的依赖规则,等待数据库就绪后再启动:
drupal: image: drupal:latest ports: - 80:80 volumes: - Drupal_modules:/var/www/html/modules - Drupal_profiles:/var/www/html/profiles - Drupal_sites:/var/www/html/sites - Drupal_themes:/var/www/html/themes depends_on: db-drupal: condition: service_healthy restart: always
注:配置中的
links字段在新版Compose规范中已废弃,同文件下的服务默认加入同一桥接网络,可直接通过服务名通信,该字段可直接删除。
- 重新启动服务:
docker-compose up -d,等待30秒左右待MySQL初始化完成后,再访问安装页提交参数。
连通性兜底验证
如果修改后仍连接失败,直接进入容器内部验证网络连通性:
- 进入Drupal容器命令行:
docker-compose exec drupal bash - 安装MySQL客户端测试连接:
apt update && apt install -y default-mysql-client mysql -h db-drupal -u user -ppassword drupal
- 如果命令行能正常进入MySQL交互界面,说明网络、账号权限均正常,返回安装页重新提交参数即可,注意检查表单是否有多余空格、拼写错误
- 如果提示连接拒绝,检查数据库服务是否正常启动、3306端口是否正常监听
- 如果提示账号权限错误,进入数据库容器执行
docker-compose exec db-drupal mysql -u root -ppassword -e "SELECT user,host,plugin FROM mysql.user;",确认user账号对应的认证插件为mysql_native_password,且允许同网段IP访问。
内容的提问来源于stack exchange,提问作者Sergej
相关产品推荐
相关产品推荐

