我建立了一個連接到 MySQL 的 NodeJS 後端伺服器。透過使用 Docker,我使用以下命令建立了一個映像來運行我的 nodeJS 和 package.json 檔案(其中包括 MySQL)。以下是我的 Dockerfile:
FROM node WORKDIR /app COPY package.json . RUN npm install COPY . /app EXPOSE 3000 CMD ["node", "app.js"]
我有另一個檔案可以使用 NodeJS 建立與 MySQL 的連接:
const mysql = require("mysql"); const con = mysql.createConnection({ host: "localhost", user: "root", password: "ilovestackoverflow", database: "db830", port: "3306" }); con.connect(function (err, rows) { if (err) throw err; console.log("Database is connected!"); }); module.exports = con;
我嘗試執行 Dockers (docker run -p 3000:3000 help:help),但遇到以下錯誤(不知道如何解決,請幫忙!!):
Server is listening on Port: 3000 /app/config/database.js:12 if (err) throw err; ^ Error: connect ECONNREFUSED 127.0.0.1:3306 at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1247:16) -------------------- at Protocol._enqueue (/app/node_modules/mysql/lib/protocol/Protocol.js:144:48) at Protocol.handshake (/app/node_modules/mysql/lib/protocol/Protocol.js:51:23) at Connection.connect (/app/node_modules/mysql/lib/Connection.js:116:18) at Object.<anonymous> (/app/config/database.js:11:5) at Module._compile (node:internal/modules/cjs/loader:1120:14) at Module._extensions..js (node:internal/modules/cjs/loader:1174:10) at Module.load (node:internal/modules/cjs/loader:998:32) at Module._load (node:internal/modules/cjs/loader:839:12) at Module.require (node:internal/modules/cjs/loader:1022:19) at require (node:internal/modules/cjs/helpers:102:18) { errno: -111, code: 'ECONNREFUSED', syscall: 'connect', address: '127.0.0.1', port: 3306, fatal: true }
在多容器環境中,docker 容器中有多個網絡,每個容器都有自己的網路命名空間。當您需要存取其他 Docker 容器時,Docker 中的網路是透過服務名稱完成的。在 docker-compose 設定中,您將引用服務的名稱。使用普通的 docker 容器時,會有點困難。你需要
docker網路建立awesomeNetwork
docker網路連接nodebackend AwesomeNetwork
docker網路連接db AwesomeNetwork
#現在,您可以分別使用名稱
db/nodebackend
來引用容器網路內的另一個容器。在開發/本地
docker-compose
環境中,我強烈建議使用docker-compose
並編寫您的 compose 清單。那麼您就不需要建立網絡,因為它每次都會為您建立。設定看起來像這樣現在您可以使用主機名稱
db
連接到節點應用程式中的db