J'ai créé un serveur backend NodeJS connecté à MySQL. À l'aide de Docker, j'ai créé une image pour exécuter mes fichiers nodeJS et package.json (qui incluent MySQL) à l'aide des commandes suivantes. Voici mon Dockerfile :
FROM node WORKDIR /app COPY package.json . RUN npm install COPY . /app EXPOSE 3000 CMD ["node", "app.js"]
J'ai un autre fichier pour créer une connexion à MySQL en utilisant NodeJS :
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;
J'ai essayé d'exécuter Dockers (docker run -p 3000:3000 help:help) mais j'ai obtenu l'erreur suivante (je ne sais pas comment y remédier, aidez s'il vous plaît !!) :
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 }
Dans un environnement multi-conteneurs, il existe plusieurs réseaux dans les conteneurs Docker, et chaque conteneur possède son propre espace de noms réseau. Lorsque vous devez accéder à d'autres conteneurs Docker, la mise en réseau dans Docker se fait via les noms de services. Dans les paramètres de docker-compose, vous référencerez le nom du service. Lorsque vous utilisez des conteneurs Docker classiques, c'est un peu plus difficile. Vous avez besoin
docker网络创建awesomeNetwork
docker网络连接nodebackend AwesomeNetwork
docker网络连接db AwesomeNetwork
Vous pouvez désormais faire référence à un autre conteneur au sein d'un réseau de conteneurs en utilisant le nom
db/nodebackend
individuellement.Dans dev/local
docker-compose
环境中,我强烈建议使用docker-compose
et rédigez votre manifeste de composition. Vous n’avez alors pas besoin de créer le réseau car il sera créé pour vous à chaque fois. La configuration ressemble à ceciVous pouvez maintenant utiliser le nom d'hôte
db
连接到节点应用程序中的db