Docker环境下MySQL 8与Node.js连接失败排查求助
Docker容器中Node.js无法连接MySQL的问题
问题概述
查阅了大量关于连接Docker容器中MySQL实例的内容,尝试多种解决方案均无效。现有可正常运行的PHP应用与phpMyAdmin(均为Docker镜像),PHP内部能正常连接MySQL,但使用原生Node.js示例服务器连接时始终被拒绝:最初出现errno -4078错误,改用tcp-connect后变为errno 1045(权限拒绝)。
启动命令与运行方式
MySQL启动命令
docker run --name mysql -d -e MYSQL_ALLOW_EMPTY_PASSWORD=TRUE --expose 3306 -p 3036:3036 mysql
Node.js应用启动方式
两种方式均尝试过:
- 直接执行:
node app.js - 构建Docker镜像后运行:
docker run --name app -d --link mysql:db -p 8081:8080 app
PHP应用启动方式完全相同且可正常运行,但Node.js不行。同一用户名和密码组合可通过bash shell中的mysql CLI手动登录,说明密码无误。
Node.js应用Dockerfile内容
FROM node WORKDIR /usr/src/app COPY package.json . COPY package-lock.json . RUN npm install COPY . . EXPOSE 8080 CMD [ "node", "app.js" ]
版本信息
- MySQL:8.1.0
- Docker:24.0.5
现有用户与无效尝试
phpMyAdmin中有两个可正常使用的用户:无密码的root用户,以及拥有全部权限、带密码的用户。已尝试从外部连接Docker容器中的MySQL,暴露3306端口(似乎有效),启动应用时的--link指令也似乎生效,应用确实在尝试连接,但仅提示“连接被拒绝”。尝试过以下方案均未解决问题:
- 环境变量配置方案
- tcp-connect连接方式
- 切换为mysql_native_password认证插件
疑问
- 能否不绕过安全机制,直接提供MySQL所需的认证信息(比如证书、密钥对等)?
- 原本以为PHP能正常连接的配置,Node.js也应适用,但实际并非如此。PHP的处理方式有何不同?(PHP运行在基于Alpine Nginx的Docker镜像中,是一个仅展示少量数据库内容页面的原生应用)
补充说明
版主推荐的答案完全无法解决我的问题:
- 它提到的配置在MySQL 8中不存在
- 新版MySQL 8配置文件中没有BIND语句
- 配置文件的位置也不一样
- 该推荐答案并未出现在“相似问题”列表中
请重新开放此问题以获取进一步帮助。
内容的提问来源于stack exchange,提问作者furball
相关产品推荐
相关产品推荐

