Docker中运行的Node.js应用无法连接宿主机MySQL数据库问题求助
问题核心原因
你的数据库连接配置中host值设为了localhost,当应用运行在Docker容器内时,localhost指向的是容器自身的网络空间,而非运行MySQL服务的宿主机,因此会抛出127.0.0.1:3306连接被拒绝的错误。你提到的容器对外暴露3300端口是Node.js应用的服务端口,和数据库连接逻辑无关,该配置没有问题。
修复方案
快速临时修复
根据你的Docker运行环境修改连接配置的host值即可:
- 若使用Docker Desktop(Mac/Windows版):直接将
host改为Docker内置的宿主机域名host.docker.internal - 若使用Linux版Docker:启动容器时添加参数
--add-host=host.docker.internal:host-gateway,之后同样将host改为host.docker.internal,或者直接填宿主机的物理IP地址
修改后的代码示例如下:
const DATABASE = MYSQL.createPool({ host : 'host.docker.internal', // 替换原有localhost user : dbconfig.DATABASE_USER, password: dbconfig.DATABASE_CREDENTIAL, database: dbconfig.DATABASE_USING, multipleStatements: true });
修改后还需要确认两个MySQL侧的配置:
- MySQL服务没有绑定仅本地访问,即MySQL配置文件中
bind-address的值不是127.0.0.1,可改为0.0.0.0或者Docker网段地址 - 你使用的数据库账号授权了Docker网段的访问权限,可执行SQL
GRANT ALL ON 你的数据库名.* TO '你的数据库用户名'@'172.17.0.0/255.255.0.0' IDENTIFIED BY '你的数据库密码';完成授权
规范生产方案
推荐将MySQL也使用Docker容器部署,和Node.js应用加入同一个Docker自定义网络,此时直接将host值改为MySQL容器的服务名即可,不需要暴露MySQL端口到宿主机,安全性更高。
内容的提问来源于stack exchange,提问作者Silent3rror
相关产品推荐
相关产品推荐

