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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:15:07