Bei der Verwendung von NodeJS zum Herstellen einer Verbindung zu MySQL in Docker tritt ein Fehler auf
P粉722521204
P粉722521204 2024-04-06 12:07:19
0
1
515

Ich habe einen NodeJS-Backend-Server erstellt, der mit MySQL verbunden ist. Mit Docker habe ich mit den folgenden Befehlen ein Image erstellt, um meine Dateien „nodeJS“ und „package.json“ (einschließlich MySQL) auszuführen. Hier ist meine Docker-Datei:

FROM node

WORKDIR /app

COPY package.json .

RUN npm install

COPY . /app

EXPOSE 3000

CMD ["node", "app.js"]

Ich habe eine weitere Datei, um mit NodeJS eine Verbindung zu MySQL herzustellen:

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;

Ich habe versucht, Dockers auszuführen (docker run -p 3000:3000 help:help), habe aber die folgende Fehlermeldung erhalten (ich weiß nicht, wie ich das beheben kann, bitte helfen Sie!!):

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

Antworte allen(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"
});

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage