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