我创建了一个连接到 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
} Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
在多容器环境中,docker 容器中有多个网络,每个容器都有自己的网络命名空间。当您需要访问其他 Docker 容器时,Docker 中的网络是通过服务名称完成的。在 docker-compose 设置中,您将引用服务的名称。使用普通的 docker 容器时,会有点困难。你需要
docker网络创建awesomeNetworkdocker网络连接nodebackend AwesomeNetworkdocker网络连接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连接到节点应用程序中的dbconst con = mysql.createConnection({ host: "db", user: "root", password: "ilovestackoverflow", database: "db830", port: "3306" });