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

Docker容器无法连接Winter CMS(Laravel)数据库问题求助

Winter CMS Docker部署数据库连接失败问题解决

问题场景

我有一个Winter CMS项目,采用Docker Compose部署,相关配置如下:

Docker Compose 配置

version: '3'
services:
  web:
    image: nginx:latest
    container_name: 12k_nginx_dev
    ports:
      - 8080:80
    environment:
      - DB_TYPE=mysql
      - DB_HOST=db #DB_HOST should match the service name of the database container
      - DB_DATABASE=12k_winter
      - DB_USERNAME=root
      - DB_PASSWORD=root
      - PHP_MEMORY_LIMIT=-1
    volumes:
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./app:/var/www/html
  php:
    build: ./docker/php/
    container_name: 12k_php_dev
    depends_on:
      - db
    volumes:
      - ./app:/var/www/html
      - ./docker/php/conf.d/xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
      - ./docker/php/conf.d/error_reporting.ini:/usr/local/etc/php/conf.d/error_reporting.ini
    links:
      - db
    environment:
      XDEBUG_CONFIG: "remote_host=host.docker.internal remote_enable=1"
      PHP_IDE_CONFIG: "serverName=Docker"
  db:
    image: mariadb:latest
    command: --max_allowed_packet=32505856
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
      MYSQL_USER: 'root'
      MYSQL_PASSWORD: 'root123'
      MYSQL_DATABASE: '12k_winter'
    volumes:
      - $HOME/sites/12knots_winter_new/mysql/data:/var/lib/mysql
    ports:
      - 3306:3306
#volumes:
#    mysqldata: {}

.env 配置

DB_CONNECTION=mysql
DB_HOST=db
#DB_HOST="172.18.0.1"
DB_PORT=3306
DB_DATABASE="12k_winter"
DB_USERNAME="root"
DB_PASSWORD="root123"

执行php artisan winter:up时出现数据库连接失败错误,尝试修改.env中DB_HOST为IP地址、重建容器均无效。进入DB容器登录MySQL时,提示:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)。相同配置的其他项目实例(仅数据库卷不同)可正常连接。

解决步骤

1. 清理残留的数据库卷数据

本地绑定的数据库目录$HOME/sites/12knots_winter_new/mysql/data可能残留了旧的权限配置,导致新容器无法正确初始化用户:

  • 停止并删除所有相关容器:
    docker-compose down -v
    
  • 删除本地数据库目录:
    rm -rf $HOME/sites/12knots_winter_new/mysql/data
    
  • 重新启动容器:
    docker-compose up -d
    

2. 修复数据库环境变量冲突

DB容器中同时设置MYSQL_ROOT_PASSWORD=root和MYSQL_USER=root会导致权限覆盖,MariaDB初始化时会出现用户权限异常:

  • 修改Docker Compose中DB服务的环境变量,将MYSQL_USER改为非root用户名:
    db:
      image: mariadb:latest
      command: --max_allowed_packet=32505856
      environment:
        MYSQL_ROOT_PASSWORD: 'root'
        MYSQL_USER: 'winter_user'
        MYSQL_PASSWORD: 'root123'
        MYSQL_DATABASE: '12k_winter'
      volumes:
        - $HOME/sites/12knots_winter_new/mysql/data:/var/lib/mysql
      ports:
        - 3306:3306
    
  • 更新.env中的DB_USERNAME为新用户名:
    DB_USERNAME="winter_user"
    

3. 验证容器内数据库连接

重新启动容器后,进入PHP容器测试连接:

docker exec -it 12k_php_dev bash

执行MySQL客户端命令验证:

mysql -h db -u winter_user -proot123 12k_winter

能正常进入数据库后,再执行php artisan winter:up。

4. 统一环境变量密码

Web容器中的DB_PASSWORD=root与.env中的DB_PASSWORD=root123不一致,建议修改Web容器的环境变量,确保密码统一:

web:
  image: nginx:latest
  container_name: 12k_nginx_dev
  ports:
    - 8080:80
  environment:
    - DB_TYPE=mysql
    - DB_HOST=db
    - DB_DATABASE=12k_winter
    - DB_USERNAME=winter_user
    - DB_PASSWORD=root123 # 修改为与.env一致的密码
    - PHP_MEMORY_LIMIT=-1
  volumes:
    - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    - ./app:/var/www/html

内容的提问来源于stack exchange,提问作者Eugene B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:57:47