Ralat berlaku apabila menggunakan NodeJS untuk menyambung ke MySQL dalam Docker
P粉722521204
P粉722521204 2024-04-06 12:07:19
0
1
543

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粉722521204
P粉722521204

membalas semua(1)
P粉787806024

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan