搜索

首页  >  问答  >  正文

Docker中使用NodeJS连接MySQL时出现错误

我创建了一个连接到 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粉722521204P粉722521204300 天前650

全部回复(1)我来回复

  • P粉787806024

    P粉7878060242024-04-07 09:21:49

    在多容器环境中,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"
    });
    
    

    回复
    0
  • 取消回复