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