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網(wǎng)絡(luò)創(chuàng)建awesomeNetwork
docker網(wǎng)絡(luò)連接nodebackend AwesomeNetwork
docker網(wǎng)絡(luò)連接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
環(huán)境中,我強(qiáng)烈建議使用 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 à ceci
# 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=
Vous pouvez maintenant utiliser le nom d'h?te db
連接到節(jié)點(diǎn)應(yīng)用程序中的 db
const con = mysql.createConnection({ host: "db", user: "root", password: "ilovestackoverflow", database: "db830", port: "3306" });