Une erreur se produit lors de l'utilisation de NodeJS pour se connecter à MySQL dans Docker
P粉722521204
P粉722521204 2024-04-06 12:07:19
0
1
514

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
}

P粉722521204
P粉722521204

répondre à tous(1)
P粉787806024

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

  1. Créer un réseau Docker

docker网络创建awesomeNetwork

  1. Rejoignez le premier conteneur au réseau

docker网络连接nodebackend AwesomeNetwork

  1. Rejoignez le deuxième conteneur au réseau

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 à 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 连接到节点应用程序中的 db

const con = mysql.createConnection({
  host: "db",
  user: "root",
  password: "ilovestackoverflow",
  database: "db830",
  port: "3306"
});

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal