recherche

Maison  >  Questions et réponses  >  le corps du texte

Une erreur se produit lors de l'utilisation de NodeJS pour se connecter à MySQL dans Docker

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粉722521204P粉722521204272 Il y a quelques jours606

répondre à tous(1)je répondrai

  • P粉787806024

    P粉7878060242024-04-07 09:21:49

    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"
    });
    
    

    répondre
    0
  • Annulerrépondre