我创建了一个连接到 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 }
在多容器环境中,docker 容器中有多个网络,每个容器都有自己的网络命名空间。当您需要访问其他 Docker 容器时,Docker 中的网络是通过服务名称完成的。在 docker-compose 设置中,您将引用服务的名称。使用普通的 docker 容器时,会有点困难。你需要
docker网络创建awesomeNetwork
docker网络连接nodebackend AwesomeNetwork
docker网络连接db AwesomeNetwork
现在,您可以分别使用名称
db/nodebackend
引用容器网络内的另一个容器。在开发/本地
docker-compose
环境中,我强烈建议使用docker-compose
并编写您的 compose 清单。那么您就不需要创建网络,因为它每次都会为您创建。设置看起来像这样现在您可以使用主机名
db
连接到节点应用程序中的db