簡體   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