Docker部署MariaDb后登录失败:ERROR 1045权限拒绝问题求助
问题与解决方案
问题描述
在Ubuntu远程服务器通过Docker部署MariaDB后,无法通过容器内、宿主机或远程机器登录,报错:
ERROR 1045 (28000): Access denied for user 'root'@'some_ip' (using password: YES)
操作流程:
- 拉取镜像:
docker pull mariadb:latest - 启动容器:
docker run -d --name some_name -e MYSQL_ROOT_PASSWORD=some_secret_password -p 1111:3306 -v /volume/path:/volume/path mariadb:latest - 进入容器修改
50-server.cnf,将bind_address 172.0.0.1改为bind_address 0.0.0.0 - 尝试登录命令:
mariadb -P 1111 --protocol=tcp -u root -p及变体均失败
解决方案
1. 修正容器内登录方式
容器内登录无需指定端口和TCP协议,直接使用本地socket连接:
mariadb -u root -p
输入启动容器时设置的some_secret_password即可登录。之前指定-P 1111是错误的,1111是宿主机的映射端口,容器内MariaDB默认端口为3306,本地socket连接无需端口参数。
2. 配置远程访问权限
MariaDB 10.4+默认root@localhost仅允许本地socket登录,需创建或修改用户以支持远程访问:
登录容器内MariaDB后执行SQL命令:
-- 创建允许所有远程地址访问的root用户 CREATE USER 'root'@'%' IDENTIFIED BY 'some_secret_password'; -- 授予全部权限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; -- 刷新权限生效 FLUSH PRIVILEGES;
若不想开放root远程访问,可创建专用远程用户:
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'your_secure_password'; GRANT ALL PRIVILEGES ON your_database.* TO 'remote_user'@'%'; FLUSH PRIVILEGES;
3. 让配置修改生效
修改50-server.cnf后需重启容器使配置生效:
docker restart some_name
注:部分MariaDB Docker镜像默认bind_address已设为0.0.0.0,若不确定可通过docker exec some_name grep bind_address /etc/mysql/mariadb.conf.d/50-server.cnf查看。
4. 应急:跳过授权登录(若容器内也无法登录)
若容器内登录失败,可通过启动容器时添加跳过授权参数重置权限:
# 停止现有容器 docker stop some_name # 启动临时容器并跳过授权 docker run -d --name some_name_temp -v /volume/path:/volume/path mariadb:latest --skip-grant-tables # 进入临时容器 docker exec -it some_name_temp bash # 无密码登录MariaDB mariadb # 修改root密码或配置权限 UPDATE mysql.user SET Password=PASSWORD('new_secret_password') WHERE User='root'; FLUSH PRIVILEGES; # 停止临时容器,恢复正常启动 docker stop some_name_temp docker rm some_name_temp docker run -d --name some_name -e MYSQL_ROOT_PASSWORD=new_secret_password -p 1111:3306 -v /volume/path:/volume/path mariadb:latest
内容的提问来源于stack exchange,提问作者Majkel
相关产品推荐
相关产品推荐

