WSL中MySQL客户端连接自定义Docker网络内MariaDB容器失败求助
我来帮你梳理下问题并给出解决方案,你遇到的情况其实和Docker自定义网络的特性以及WSL的网络访问规则有关:
问题根源
当你把MariaDB容器放到自定义testnetwork网络后,容器的内部IP(比如172.18.0.2)属于Docker的内部网络段,WSL的网络环境默认无法直接访问这个内部IP——这就是为什么你之前不用自定义网络时能正常连接(默认用的是Docker的默认bridge网络,端口映射后localhost能直接转发),但切换自定义网络后就报错的原因。
另外你提到用--link让Spring Boot应用和数据库通信,其实自定义网络本身就支持容器名的DNS解析,--link是比较旧的用法,现在完全可以直接用容器名作为数据库地址。
具体解决方案
1. 改用localhost或WSL主机IP连接数据库
既然你已经做了端口映射-p 3306:3306,直接在WSL的MySQL客户端里用以下命令连接即可:
mysql -h localhost -P 3306 -u root -p
输入你设置的密码mysqlRootPassword就能正常连接了。如果localhost不行,试试WSL的主机IP:先在WSL里执行hostname -I拿到当前IP,然后替换localhost为这个IP再连接。
2. 确保MariaDB允许外部访问权限
有时候默认的root用户只允许从容器内部或localhost访问,你可以进入MariaDB容器配置权限:
- 进入容器:
docker exec -it testdb mysql -u root -p
- 输入密码后执行授权命令(测试环境下允许所有地址访问,生产环境请限制具体IP段):
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mysqlRootPassword'; FLUSH PRIVILEGES;
执行完退出容器,再重新尝试连接。
3. 优化Spring Boot应用与数据库的通信(替代--link)
在自定义testnetwork网络里,Docker会自动为容器提供DNS解析,所以你的Spring Boot应用配置文件里的数据库URL可以直接用容器名testdb作为主机地址,比如:
spring.datasource.url=jdbc:mysql://testdb:3306/localtestdb?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=mysqlRootPassword
这样不需要--link参数,两个容器就能正常通信,同时也不会影响你从WSL外部连接数据库。
内容的提问来源于stack exchange,提问作者Daniel Tran

