cari

Rumah  >  Soal Jawab  >  teks badan

Ralat berlaku apabila menggunakan NodeJS untuk menyambung ke MySQL dalam Docker

Saya mencipta pelayan backend NodeJS yang disambungkan ke MySQL. Menggunakan Docker, saya mencipta imej untuk menjalankan fail nodeJS dan package.json saya (yang termasuk MySQL) menggunakan arahan berikut. Inilah fail Docker saya:

FROM node

WORKDIR /app

COPY package.json .

RUN npm install

COPY . /app

EXPOSE 3000

CMD ["node", "app.js"]

Saya mempunyai fail lain untuk membuat sambungan ke MySQL menggunakan 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;

Saya cuba menjalankan Dockers (docker run -p 3000:3000 help:help) tetapi mendapat ralat berikut (tidak tahu cara membetulkannya, tolong bantu!!):

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 hari yang lalu603

membalas semua(1)saya akan balas

  • P粉787806024

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

    Dalam persekitaran berbilang bekas, terdapat berbilang rangkaian dalam bekas docker, dan setiap bekas mempunyai ruang nama rangkaiannya sendiri. Apabila anda perlu mengakses bekas Docker lain, rangkaian dalam Docker dilakukan melalui nama perkhidmatan. Dalam tetapan docker-compose, anda akan merujuk nama perkhidmatan. Apabila menggunakan bekas docker biasa, ia lebih sukar. Anda perlukan

    1. Buat rangkaian Docker

    docker网络创建awesomeNetwork

    1. Sertai bekas pertama ke rangkaian

    docker网络连接nodebackend AwesomeNetwork

    1. Sertai bekas kedua ke rangkaian

    docker网络连接db AwesomeNetwork

    Anda kini boleh merujuk bekas lain dalam rangkaian kontena menggunakan nama db/nodebackend secara individu.


    Dalam dev/local docker-compose 环境中,我强烈建议使用 docker-compose dan tulis manifes karang anda. Kemudian anda tidak perlu membuat rangkaian kerana ia akan dibuat untuk anda setiap masa. Persediaan kelihatan seperti ini

    # 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=
    

    Kini anda boleh menggunakan nama hos db 连接到节点应用程序中的 db

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

    balas
    0
  • Batalbalas