docker mysql 出现错误:连接 ECONNREFUSED

Dev*_*per 6 mysql node.js docker docker-compose

尝试从微服务内部连接数据库,但无法连接数据库

错误:连接ECONNREFUSED 172.18.0.2:3306

服务/index.js

var http = require('http');

//create a server object:
http.createServer(function (req, res) {
    res.write('Hello World!'); //write a response to the client
    res.end(); //end the response
}).listen(8080); //the server object listens on port 8080

console.log("Listening at 8080");

var mysql = require('mysql');

var con = mysql.createConnection({
    host: "database",
    user: "root",
    password: "password"
});

con.connect(function(err) {
    if (err) throw err;
    console.log("Database Connected!");
});
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

version: '3'

services:
  database:
    build:
      ./database
    ports:
      - "6603:3306"
    image: "test-mysql"
    container_name: "test-mysql"

  service:
    build:
      ./service
    ports:
      - "8080:8080"
    depends_on:
      - database
    image: "test-nodejs"
    container_name: "test-nodejs"
    restart: on-failure
Run Code Online (Sandbox Code Playgroud)

我尝试使用不同的设置连接到数据库。

1) 无端口

var con = mysql.createConnection({
    host: "database",
    user: "root",
    password: "password"
});
Run Code Online (Sandbox Code Playgroud)

2)指定端口3306

var con = mysql.createConnection({
    host: "database",
    user: "root",
    password: "password"
    port: 3306
});
Run Code Online (Sandbox Code Playgroud)

3)指定端口6603

var con = mysql.createConnection({
    host: "database",
    user: "root",
    password: "password",
    port: 6603
});
Run Code Online (Sandbox Code Playgroud)

数据库/Dockerfile

FROM mysql

ENV MYSQL_DATABASE=test
ENV MYSQL_ROOT_PASSWORD=password

EXPOSE 6603:3306

COPY ./schema.sql /docker-entrypoint-initdb.d/
Run Code Online (Sandbox Code Playgroud)

基本上我的 Node.js 微服务如何发现数据库服务?


编辑

我怀疑在nodejs启动时数据库还没有准备好,所以我在连接到数据库之前添加了一些延迟并且错误发生了变化

更新代码

setTimeout(function(){

    var mysql = require('mysql');

    var con = mysql.createConnection({
        host: "database",
        user: "root",
        password: "password"
    });

    con.connect(function(err) {
        if (err) throw err;
        console.log("Database Connected!");
    });

}, 20 * 1000);
Run Code Online (Sandbox Code Playgroud)

输出

Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
Run Code Online (Sandbox Code Playgroud)

Ras*_*mon 0

您使用的 MySQL 版本可能不支持您尝试的登录。尝试使用 mysql v5.7:

docker run -d -p 6603:3306 --name mysql-container -e MYSQL_ROOT_PASSWORD=password mysql:5.7
Run Code Online (Sandbox Code Playgroud)