Docker中使用NodeJS连接MySQL时出现错误
P粉722521204
P粉722521204 2024-04-06 12:07:19
0
1
572

我创建了一个连接到 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"
});

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板