【问题标题】:docker mysql with Error: connect ECONNREFUSEDdocker mysql 出现错误:连接 ECONNREFUSED
【发布时间】:2019-10-08 20:34:16
【问题描述】:

尝试从微服务中连接数据库,连接数据库失败

错误:连接 ECONNREFUSED 172.18.0.2:3306

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

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

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

1) 没有端口

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

2) 指定端口3306

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

3) 指定端口6603

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

数据库/Dockerfile

FROM mysql

ENV MYSQL_DATABASE=test
ENV MYSQL_ROOT_PASSWORD=password

EXPOSE 6603:3306

COPY ./schema.sql /docker-entrypoint-initdb.d/

基本上我的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);

输出

Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client

【问题讨论】:

  • 您是否尝试过使用像dBeaver这样的常规客户端在它启动后自己连接到MySQL服务?
  • 我可以通过127.0.0.1:3306通过mysqlworkbench成功连接。
  • 请看我的编辑,我在连接前添加了一些延迟后错误发生了变化。
  • 不需要超时,只需订购您的代码即可。看看我的回复
  • 对于那个 ER_NOT_SUPPORTED_AUTH_MODE 你有这个修复它stackoverflow.com/questions/50093144/…

标签: mysql node.js docker docker-compose


【解决方案1】:

数据库端口没有被翻译,因为它在容器中。只需在您的应用中使用 3306

【讨论】:

    【解决方案2】:

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

    docker run -d -p 6603:3306 --name mysql-container -e MYSQL_ROOT_PASSWORD=password mysql:5.7
    

    【讨论】:

    • 是的,我降级了数据库并且它工作了,但是,我仍然需要保持连接前的延迟,比如在连接到数据库之前 10 秒,depends_on 不是很有帮助,有什么想法吗?
    • 刚刚注意到您在另一篇帖子中发表了评论
    • 没有错误,降级后它现在可以工作了,只是在我连接到数据库之前与settimeout 的延迟很麻烦。
    • 我想我在这里提到了这种情况。 dev.to/hugodias/wait-for-mongodb-to-start-on-docker-3h8b
    • 我现在明白了,你对 docker 的责任是正确的。是的,我现在从 docker 开始,我觉得它很棒! :)
    【解决方案3】:

    你错过了订单:

    先连接数据库,再监听端口。

    var http = require('http');
    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!");
    });
    
     //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");
    

    【讨论】:

    • 重新排序并没有解决问题,我觉得 mysql 和 nodejs 容器在 mysql 完全初始化之前就同时启动了,即使我已经为我的服务指定了依赖项。跨度>
    • 在我将数据库降级到 mysql:5.7 后,连接成功,但只有在延迟后才能工作。
    猜你喜欢
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 2014-05-20
    • 2022-12-21
    • 2021-06-20
    • 2019-05-03
    • 2022-08-21
    相关资源
    最近更新 更多