主机Flask应用无法连接VM中Docker部署的MySQL求助
排查思路:本地Flask无法连接VirtualBox中Docker部署的MySQL
修正Flask连接地址
主机无法直接访问VirtualBox虚拟机内Docker容器的私有子网IP,别用容器IP+3306。直接复用你本地mysql命令的参数:连接地址填127.0.0.1,端口填7703,和你能成功连接的命令mysql -h 127.0.0.1 -P 7703 -u root -p一致。
检查Flask代码里的数据库URL,示例格式:SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:你的密码@127.0.0.1:7703/你的数据库名'验证MySQL绑定配置
进入VM的MySQL容器,确认MySQL允许外部访问:- 查看配置文件:
cat /etc/mysql/my.cnf | grep bind-address,确保输出是bind-address = 0.0.0.0(不是127.0.0.1) - 或者在MySQL命令行执行:
SHOW VARIABLES LIKE 'bind_address';,结果应为0.0.0.0
- 查看配置文件:
检查Docker容器端口映射
在VM内执行docker ps,查看MySQL容器的端口映射列,必须是0.0.0.0:xxx->3306/tcp格式(xxx是VM内的端口,对应VirtualBox端口转发的VM端端口)。如果是127.0.0.1:xxx->3306/tcp,只能VM内部访问,需重新启动容器并指定绑定0.0.0.0,比如:docker run -d -p 0.0.0.0:3306:3306 --name mysql-container mysql:latest检查VM系统防火墙
确认VirtualBox虚拟机的系统防火墙没有拦截Docker映射的端口:- Ubuntu:
ufw status,确保对应端口(如3306)已开放 - CentOS/RHEL:
firewall-cmd --list-ports,确认端口在开放列表中
- Ubuntu:
验证MySQL用户权限
确认你使用的MySQL用户允许从主机IP访问:
登录MySQL执行:SELECT user, host FROM mysql.user;如果目标用户的
host是localhost或VM内部IP,执行以下命令修改权限:ALTER USER 'root'@'%' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES;测试主机端口连通性
在主机上用工具测试端口是否通畅:nc -zv 127.0.0.1 7703或
telnet 127.0.0.1 7703能连通则网络层面无问题,重点检查代码配置和MySQL权限。
内容的提问来源于stack exchange,提问作者DisplayName
相关产品推荐
相关产品推荐

