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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:27:28