Ubuntu环境下Docker MySQL容器连接报错ERROR 1045求助
解决Docker MySQL容器连接时的Access Denied错误
咱们先拆解下你碰到的问题:你已经成功把MySQL 5.7容器的3306端口映射到了主机的3000端口,但用mysql -u root -h localhost -P 3000 -p连接时被拒绝了。这里有几个常见原因和对应的解决办法,一步步来排查:
1. 修正root用户的访问权限配置
MySQL 5.7默认情况下,root用户只允许从容器内部的localhost访问。而你是从主机发起连接,对于容器来说,主机的连接来源并不是它的localhost,而是主机IP或者Docker默认网关(通常是172.17.0.1)。
解决步骤:
- 先进入容器内部的MySQL控制台:
docker exec -it mysql mysql -u root -p123456789 - 修改root用户的访问权限,允许从任意IP连接(也可以指定你的主机IP来提升安全性):
这里的ALTER USER 'root'@'%' IDENTIFIED BY '123456789'; FLUSH PRIVILEGES;%代表允许所有地址访问,如果你想更严谨,替换成你的主机实际IP即可。
2. 确保连接命令的参数正确
有时候可能是参数输入细节出错:
- 注意区分大小写:
-P(大写)是指定端口,-p(小写)是提示输入密码,别搞混了 - 试试用
127.0.0.1替代localhost连接:
部分系统中mysql -u root -h 127.0.0.1 -P 3000 -plocalhost会优先尝试socket连接,而127.0.0.1会强制走TCP/IP协议,对应你设置的端口映射规则。
3. 验证容器状态与端口映射
- 先检查容器是否正常运行:
确认docker psmysql容器的状态是Up,并且端口映射列显示0.0.0.0:3000->3306/tcp或:::3000->3306/tcp - 测试端口是否通:
如果端口不通,重启容器试试:nc -zv localhost 3000 # 或者用telnet:telnet localhost 3000docker restart mysql
4. 核对密码输入是否正确
虽然提示using password: YES,但偶尔会出现输入时的手误。你可以直接在命令里指定密码(仅测试用,生产环境不推荐)来验证:
mysql -u root -h 127.0.0.1 -P 3000 -p123456789
额外建议:用专用用户连接
其实不推荐用root用户从外部访问数据库,你已经在创建容器时指定了docker_user,这个用户默认被授予docker_db的全部权限,且允许从任意IP访问。直接用这个用户连接会更安全:
mysql -u docker_user -h 127.0.0.1 -P 3000 -p0000
按照上面的步骤逐一排查,应该就能解决你的连接问题了。
内容的提问来源于stack exchange,提问作者MiraTech
相关产品推荐
相关产品推荐

