【发布时间】:2021-05-13 08:59:09
【问题描述】:
我目前在 Raspberry Pi 3 上运行 Ubuntu 20.10。我已经安装了 Docker 和 MySQL 服务器,它在 Ubuntu 上作为服务运行。两种安装都正常工作。现在我正在尝试运行这个 Node.js API:
'use strict';
const express = require('express');
const mysql = require('mysql');
const PORT = 8080;
const HOST = '0.0.0.0';
const app = express();
app.get('/', (req, res) => {
res.send('Hello World');
});
app.get('/persons', (req, res) => {
connection.query('SELECT * FROM persons', (err, result) => {
if (err) res.send(`Some error occured: ${err}`);
res.send(result);
});
});
app.listen(PORT, HOST);
console.log(`Runnning API on http://${HOST}:${PORT}`);
const connection = mysql.createConnection({
host: 'localhost',
user: myuser,
password: 'mypwd,
database: mydb
});
connection.connect(err => {
if (err) throw err;
console.log('Successfully connected to MySQL');
});
在我将此应用程序包装到 Docker 容器中之前,这非常有效。 Dockerfile 如下所示:
FROM node:14
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "node", "server.js"]
然后我得到这个错误:
if (err) throw err;
^
Error: connect ECONNREFUSED 127.0.0.1:3306
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1135:16)
--------------------
at Protocol._enqueue (/home/felix/workspaces/node-api/node_modules/mysql/lib/protocol/Protocol.js:144:48)
at Protocol.handshake (/home/felix/workspaces/node-api/node_modules/mysql/lib/protocol/Protocol.js:51:23)
at Connection.connect (/home/felix/workspaces/node-api/node_modules/mysql/lib/Connection.js:116:18)
at Object.<anonymous> (/home/felix/workspaces/node-api/server.js:31:12)
at Module._compile (internal/modules/cjs/loader.js:1138:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)
at Module.load (internal/modules/cjs/loader.js:986:32)
at Function.Module._load (internal/modules/cjs/loader.js:879:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
at internal/main/run_main_module.js:17:47 {
errno: 'ECONNREFUSED',
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 3306,
fatal: true
}
有谁知道如何解决这个问题? 此外,我想知道在 Linux 上将 MySQL 作为服务运行或在容器中运行它有什么区别……优点/缺点是什么?或者有人可以解释在两个不同的容器中运行应用程序和数据库并使用 Docker compose 连接它们是否有意义?
【问题讨论】:
-
错误消息有一个不同的端口
3306而不是8080为什么会这样?你可以通过运行sudo ss -tnlp | grep 8080来检查docker容器是否使用端口8080