繁体   English   中英

NodeJS Docker 容器无法连接到 MySQL(在主机上)

[英]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

我还可以通过在localhost127.0.0.1上使用node xyz.js独立运行 js 来查询 MySQL。

我错过了什么?

我正在Ubuntu 20.04.3 LTSDocker 20.10.8MySQL 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM