Docker部署Laravel项目MySQL容器数据持久化及登录权限问题求助
解决Docker部署MySQL数据持久化+远程连接问题
一、先搞定MySQL容器登录问题
你直接在VPS终端用mysql -uroot -p登不上是因为你连的是VPS本地的MySQL(大概率没装),正确操作是进入Docker容器内部登录:
- 启动MySQL服务:
docker-compose up -d mysql - 查看容器ID/名称:
docker ps,找到对应MySQL容器的标识 - 进入容器终端:
docker exec -it <容器ID/名称> bash - 在容器内登录MySQL:
mysql -uroot -p,输入你docker-compose.yml里配置的MYSQL_ROOT_PASSWORD密码
要是还是登不上,90%是本地数据卷目录权限的锅:
- 停掉容器:
docker-compose down - 删除当前的mysql数据目录:
rm -rf ./mysql - 重新创建并设置权限:
mkdir ./mysql && sudo chown -R 999:999 ./mysql(MySQL容器内的运行用户UID是999,必须让宿主目录权限匹配) - 重启容器:
docker-compose up -d,此时MySQL会重新初始化数据,用你配置的密码就能正常登录了
二、解决远程连接1130错误
成功登录容器内的MySQL后,执行授权命令开放远程访问:
- 允许root用户从任意IP连接(嫌不安全的话可以把
%换成你的本地IP):GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的root密码' WITH GRANT OPTION; - 如果是Laravel用的普通用户,同样授权:
GRANT ALL PRIVILEGES ON 你的项目数据库名.* TO '普通用户名'@'%' IDENTIFIED BY '普通用户密码'; - 刷新权限生效:
FLUSH PRIVILEGES;
另外检查你的docker-compose.yml,确保MySQL配置里加了必要参数:
services: mysql: image: mysql:8.0 # 换成你实际用的镜像版本 environment: MYSQL_ROOT_PASSWORD: your_root_password MYSQL_DATABASE: laravel_db MYSQL_USER: laravel_user MYSQL_PASSWORD: laravel_pass MYSQL_ROOT_HOST: "%" # 部分镜像需要这个参数允许root远程连接 ports: - "3306:3306" volumes: - ./mysql:/var/lib/mysql
注意:MySQL 8.0+版本不支持在GRANT语句里直接创建用户,得分开写:
CREATE USER 'root'@'%' IDENTIFIED BY '你的root密码'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
三、验证数据持久化
操作完后执行docker-compose down再docker-compose up -d,用Navicat测试连接,同时检查VPS上的./mysql目录下是否生成了数据文件,确保重启容器后数据不会丢失。
内容的提问来源于stack exchange,提问作者randosev
相关产品推荐
相关产品推荐

