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.
相关产品推荐
相关产品推荐

