Docker中使用NodeJS連接MySQL時出現錯誤
P粉722521204
P粉722521204 2024-04-06 12:07:19
0
1
544

我建立了一個連接到 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
}

P粉722521204
P粉722521204

全部回覆(1)
P粉787806024

在多容器環境中,docker 容器中有多個網絡,每個容器都有自己的網路命名空間。當您需要存取其他 Docker 容器時,Docker 中的網路是透過服務名稱完成的。在 docker-compose 設定中,您將引用服務的名稱。使用普通的 docker 容器時,會有點困難。你需要

  1. 建立 Docker 網路

docker網路建立awesomeNetwork

  1. 將第一個容器加入網路

docker網路連接nodebackend AwesomeNetwork

  1. #將第二個容器加入網路

docker網路連接db AwesomeNetwork

#現在,您可以分別使用名稱 db/nodebackend 來引用容器網路內的另一個容器。


在開發/本地 docker-compose 環境中,我強烈建議使用 docker-compose 並編寫您的 compose 清單。那麼您就不需要建立網絡,因為它每次都會為您建立。設定看起來像這樣

# docker-compose.yml
version: '3.8'
services:
  nodeBackend:
    build: .
    context: ./Path
    dockerfile: Dockerfile
    ports:
     - "3000:3000"
  db:
    image: mysql
    ports:
      - 3306:3306
    volumes:
      - :/var/lib/mysql      # select a path to persist your data
    environment:
      - MYSQL_ROOT_PASSWORD=
      - MYSQL_PASSWORD=
      - MYSQL_USER=
      - MYSQL_DATABASE=

現在您可以使用主機名稱 db 連接到節點應用程式中的 db

const con = mysql.createConnection({
  host: "db",
  user: "root",
  password: "ilovestackoverflow",
  database: "db830",
  port: "3306"
});

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板