[英]NodeJS Docker container can't connect to MySQL (on host)
我有一个nodejs试图mysql.createPool({host: 'host.docker.internal', ...})
但我得到了
错误:连接 ECONNREFUSED 127.0.0.1:3306
在 TCPConnectWrap.afterConnect [as oncomplete] (net.js:1144:16)
在 Protocol._enqueue (.../node_modules/mysql/lib/protocol/Protocol.js:144:48)
在 Protocol.handshake (.../node_modules/mysql/lib/protocol/Protocol.js:51:23)
在 PoolConection.connect (.../node_modules/mysql/lib/Connection.js:116:18)
在 Pool.getConnection (.../node_modules/mysql/lib/Pool.js:48:16)
node:12-alpine 映像中的 mysql 客户端是否存在错误? 我检查了docker exec -it ... ping host.docker.internal
确实被解析为 172.17.0.1。
为什么mysql.createPool({host: 'host.docker.internal', ...})
试图寻找 127.0.0.1:3306?
我能够使用host.docker.internal
到达同一主机上的另一个容器。 我相信这证明我已经正确运行了--add-host=host.docker.internal:host-gateway
。
我还可以通过在localhost和127.0.0.1上使用node xyz.js
独立运行 js 来查询 MySQL。
我错过了什么?
我正在Ubuntu 20.04.3 LTS 、 Docker 20.10.8 、 MySQL 8.0.26 (安装在主机上)上尝试所有这些。
****************************** PS ************************* ***
我在createPool()
中用硬编码的 172.10.0.1 构建了另一个映像,并在容器中运行 js,但无济于事。
然后我做了一个疯狂的实验,用mysql.createPool({host: '172.17.0.1', ...})
在主机上运行 js 独立node xyz.js
它会给
连接 ECONNREFUSED 172.17.0.1:3306`
但是如果我编辑/etc/hosts
并添加172.17.0.1 host.docker.internal
(在主机上)和mysql.createPool({host: 'host.docker.internal', ...})
,js可以连接到MySQL独立!
如果您使用 127.0.0.1,则容器将尝试在容器内的 localhost 上连接,但 mysql 正在 docker 主机上运行。
您可以尝试在docker添加的网络接口上连接到它,您可以使用命令ip a
进行检查,请参见以下输出
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:53:81:5c:57 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
在我的情况下,我会使用下面的 url 连接到 mysql:
172.17.0.1:3306
我正在运行一个 docker-compose NodeJS 应用程序,它连接到端口 3306 上的 Linux 主机 MySQL 数据库。要解决描述的错误:
专门针对Ubuntu 20.04.3 LTS & mysql Ver 15.1 Distrib 10.3.32-MariaDB ,配置在/etc/mysql/mariadb.conf.d/50-server.cnf
如果您不确定配置所在的位置,请运行以下命令进行定位:
grep -rnw 'bind-address' /etc/mysql/
继续编辑 mysql 服务器配置,将127.0.0.1
替换为0.0.0.0
,如 Docker 论坛中所述。
sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf
进行以下更改差异:
- bind-address = 127.0.0.1 + bind-address = 0.0.0.0
并重新启动 mysql (MariaDB)
sudo systemctl restart mariadb.service
在运行docker-compose
时,之前失败的容器现在可以访问 localhost SQL 数据库了!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.