docker mysql 出现错误:连接 ECONNREFUSED
Posted
技术标签:
【中文标题】docker mysql 出现错误:连接 ECONNREFUSED【英文标题】:docker mysql with Error: connect 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 你有这个修复它***.com/questions/50093144/…
【参考方案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 后,连接成功,但只有在延迟后才能工作。以上是关于docker mysql 出现错误:连接 ECONNREFUSED的主要内容,如果未能解决你的问题,请参考以下文章