【发布时间】:2021-11-09 11:41:57
【问题描述】:
Ubuntu 20.04.3 LTS、Docker 20.10.8、MySQL 8.0.26(安装在主机上)。
我有一个 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)
我检查了docker exec -it ... ping host.docker.internal 确实被解析为 172.17.0.1。
我能够使用host.docker.internal 访问同一主机上的另一个容器。我相信这证明我已经正确运行了--add-host=host.docker.internal:host-gateway。
我还可以通过在 localhost 和 127.0.0.1 上使用 node xyz.js 独立运行 js 来查询 MySQL。
然后我做了一个疯狂的实验,通过在主机上运行 js 独立 node xyz.js 与 mysql.createPool({host: '172.17.0.1', ...}) 它会给出
连接 ECONNREFUSED 172.17.0.1:3306`
但是如果我编辑/etc/hosts并添加172.17.0.1 host.docker.internal(在主机上)和mysql.createPool({host: 'host.docker.internal', ...}),js可以独立连接到MySQL!
****************************** 已解决 ***************** *********
从docker forum 得到提示,原来我缺少的是允许外部 IP 访问 MySQL。这就是我所做的:
-
/etc/mysql/mysql.conf.d/下,mysql.cnf为空白文件;mysqld.cnf有bind-address和mysqlx-bind-address两者= 127.0.0.1,我只将bind-address更改为127.0.0.1,host.docker.internal然后systemctl restart mysql - 在
/etc/hosts之前添加了一个条目172.17.0.1 host.docker.internal CREATE USER 'reader'@'%' IDENTIFIED WITH mysql_native_password BY 'xxxxx'
【问题讨论】:
-
您能添加您的
docker-compose或您的运行命令吗? -
嗨 Joseph,我使用的是 docker run 命令以及 -p 80:5050 --name --restart 和 --add-host 参数。 (5050 是 J 正在监听的容器化端口)
标签: mysql node.js docker ubuntu-20.04