Docker环境下MySQL连接被拒绝问题求助
Docker下MySQL连接被拒绝问题求助
我从昨天开始使用Docker,但一直无法解决MySQL连接被拒绝的错误,希望能得到帮助。
以下是我的docker-compose.yml配置:
version: '3' services: db: image: mysql:latest environment: MYSQL_DATABASENAME: my_test_database MYSQL_HOST: mysql MYSQL_PORT: 3306 MYSQL_USER: develop MYSQL_PASSWRD: develop MYSQL_ALLOW_EMPTY_PASSWORD: 1 ports: - '3306:3306' www: depends_on: - db image: php:8.0.30-apache volumes: - "./:/var/www/html" ports: - 80:80 - 443:443 phpmyadmin: depends_on: - db image: phpmyadmin/phpmyadmin environment: - PMA_HOST=db - PMA_PORT=3306
我的Dockerfile内容如下:
FROM php:8.0.30-apache RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
我期望能成功连接数据库服务器,注:已将配置中的PWA改为PMA。
问题修复方案
1. 修正MySQL环境变量名称
MySQL官方镜像的环境变量有固定命名规则,你的配置里存在两处错误:
MYSQL_DATABASENAME→ 改为MYSQL_DATABASE(初始化时创建数据库的正确变量)MYSQL_PASSWRD→ 改为MYSQL_PASSWORD(设置用户密码的正确变量)- 移除
MYSQL_HOST和MYSQL_PORT,这两个变量对MySQL容器本身无效,服务间通信依赖Docker内部DNS解析。
另外你同时设置了MYSQL_PASSWORD和MYSQL_ALLOW_EMPTY_PASSWORD: 1,这会导致MySQL忽略密码设置,直接允许空密码登录。如果要使用密码登录,删除MYSQL_ALLOW_EMPTY_PASSWORD: 1即可。
2. 解决容器启动顺序问题
depends_on仅保证容器启动顺序,不确保MySQL服务完全就绪。给db服务添加健康检查,让Docker确认MySQL服务可用后再启动依赖服务:
db: # 其他配置不变 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] timeout: 20s retries: 10
然后修改www和phpmyadmin的depends_on配置:
www: depends_on: db: condition: service_healthy phpmyadmin: depends_on: db: condition: service_healthy
3. 确保PHP镜像使用自定义构建
你的www服务当前使用官方php:8.0.30-apache镜像,不会执行你自定义的Dockerfile(安装mysqli扩展)。需要将image字段改为build: .,让Docker构建你自己的镜像:
www: depends_on: db: condition: service_healthy build: . volumes: - "./:/var/www/html" ports: - 80:80 - 443:443
4. 补充phpMyAdmin端口映射
当前phpmyadmin服务没有配置端口映射,无法从宿主机访问。添加端口映射:
phpmyadmin: # 其他配置不变 ports: - 8080:80
5. PHP代码中的数据库连接配置
PHP代码连接数据库时,主机名必须使用db(即docker-compose中MySQL服务的名称),而不是localhost或mysql,Docker内部服务通过服务名进行通信。
修复后的完整docker-compose.yml示例:
version: '3' services: db: image: mysql:latest environment: MYSQL_DATABASE: my_test_database MYSQL_USER: develop MYSQL_PASSWORD: develop ports: - '3306:3306' healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] timeout: 20s retries: 10 www: depends_on: db: condition: service_healthy build: . volumes: - "./:/var/www/html" ports: - 80:80 - 443:443 phpmyadmin: depends_on: db: condition: service_healthy image: phpmyadmin/phpmyadmin environment: - PMA_HOST=db - PMA_PORT=3306 ports: - 8080:80
内容的提问来源于stack exchange,提问作者DatIsVinnie
相关产品推荐
相关产品推荐

