本地Docker运行的MariaDB宿主机root连接报1045访问拒绝错误
问题成因
- 你启动容器时配置了
MYSQL_ROOT_HOST=localhost参数,该参数限制了root用户仅允许从容器本地(localhost)发起登录请求 - 宿主机通过TCP协议访问容器内的MariaDB时,请求来源IP是docker网桥的网关地址
172.17.0.1,不属于localhost范围,因此被权限校验拦截 - 普通用户
user可正常连接,是因为官方MariaDB镜像默认对MYSQL_USER创建的账号开放了所有来源(%)的访问权限;容器内可登录root也是因为请求来源匹配localhost限制
解决方案
场景1:还未创建容器,可在启动时调整参数
根据需要调整MYSQL_ROOT_HOST的取值,比如允许所有docker内网访问可设为172.17.0.%,临时测试允许所有来源可设为%,示例命令如下:
docker run --name mariadbtest -e MYSQL_ROOT_PASSWORD=password -e MYSQL_USER=user -e MYSQL_DATABASE=test -e MYSQL_PASSWORD=password -e MYSQL_ROOT_HOST=172.17.0.% -p 3306:3306 -d docker.io/library/mariadb:10.4
场景2:已创建正在运行的容器,无需重建直接修改权限
- 进入容器内部登录root账号:
docker exec -it mariadbtest mysql -u root -p
输入root密码后进入MariaDB命令行
2. 按需执行对应授权命令,注意把命令中的你的root密码替换为实际的root账号密码:
- 仅允许宿主机(172.17.0.1)登录root:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.17.0.1' IDENTIFIED BY '你的root密码' WITH GRANT OPTION;
- 允许所有docker内网地址登录root:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.17.0.%' IDENTIFIED BY '你的root密码' WITH GRANT OPTION;
- 允许所有来源登录root(不建议生产环境使用):
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的root密码' WITH GRANT OPTION;
- 刷新权限使配置生效:
FLUSH PRIVILEGES;
配置完成后即可在宿主机正常连接root账号。
内容的提问来源于stack exchange,提问作者Filip Stamenkovic
相关产品推荐
相关产品推荐

