簡體   English   中英

Node.js連接到MySQL Docker容器ECONNREFUSED

[英]Node.js connect to MySQL Docker container ECONNREFUSED

在您將此問題標記為重復之前,請注意我確實閱讀了其他答案,但這並沒有解決我的問題。

我有一個Docker撰寫文件,包含兩個服務:

version: "3"
services:
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_HOST: localhost
      MYSQL_DATABASE: mydb
      MYSQL_USER: mysql
      MYSQL_PASSWORD: 1234
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "3307:3306"
    expose:
      - 3307
    volumes:
      - /var/lib/mysql
      - ./mysql/migrations:/docker-entrypoint-initdb.d
    restart: unless-stopped
  web:
    build:
      context: .
      dockerfile: web/Dockerfile
    volumes:
      - ./:/web
    ports:
      - "3000:3000"
    environment:
      NODE_ENV: development
      PORT: 3000
    links:
      - mysql:mysql
    depends_on:
      - mysql
    expose:
      - 3000
    command: ["./wait-for-it.sh", "mysql:3307"]

/網絡/ Dockerfile:

FROM node:6.11.1

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app/
RUN npm install

COPY . /usr/src/app

CMD [ "npm", "start" ]

docker-compose up --build之后docker-compose up --build 構建服務啟動,但是等待mySQL啟動時“wait-for-it.sh”腳本超時(所以暫時我在測試數據庫連接時沒有使用它,我只是等待直到控制台顯示MySQL已准備好接受傳入連接)

當MySQL從主機運行時,我可以使用Sequel Pro登錄並查詢數據庫並從./mysql/migrations獲取樣本記錄

在此輸入圖像描述 在此輸入圖像描述

我也可以通過SSH連接到正在運行的MySQL容器並執行相同操作。

但是,我的Node.js應用程序在連接時會產生ECONNREFUSED 127.0.0.1:3307

MySQL初始化:

import * as mysql from 'promise-mysql'

const config = {
    host: 'localhost',
    database: 'mydb',
    port: '3307',
    user: 'mysql',
    password: '1234',
    connectionLimit: 10
}

export let db = mysql.createPool(config);

MySQL查詢:

import { db } from '../db/client'

export let get = () => {

return db.query('SELECT * FROM users', [])
    .then((results) => {
        return results

    })
    .catch((e) => {
        return Promise.reject(e)
    })
}

擊中網址時調用的路由/

import { Router } from 'express';
import * as repository from '../repository'
export let router = Router();

router.get('/', async (req, res) => {

    let users;

    try{
        users = await repository.users.get();
    } catch(e){
        // ECONNREFUSED 127.0.0.1:3307
    }

    res.render('index', {
        users: users
    });
});

它不太可能是競爭條件,因為在Node.js失敗的同時,我可以使用Sequel Pro或SSH查詢正在運行的Docker容器和查詢。 所以這可能是Node.js無法訪問MySQL容器的情況?

{
    error: connect ECONNREFUSED 127.0.0.1:3307
    code: 'ECONNREFUSED',
    errno: 'ECONNREFUSED',
    syscall: 'connect',
    address: '127.0.0.1',
    port: 3307,
    fatal: true
}

這個:

mysql:
    image: mysql:5.7
    environment:
    ...
    ports:
      - "3307:3306"

意味着Docker將主機的3307端口映射到容器的3306端口。 所以你可以從Sequel訪問localhost:3307

但是,這並不意味着容器持續到3307 ; 事實上,容器仍然在聽3306 當其他容器嘗試訪問mysql DNS時,它會轉換為內部容器IP,因此您必須連接到3306

因此,您的節點配置應如下所示:

const config = {
    host: 'mysql',
    database: 'mydb',
    port: '3306',
    user: 'mysql',
    password: '1234',
    connectionLimit: 10
}

這在你的docker-compose.yml中:

command: ["./wait-for-it.sh", "mysql:3306"]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM