【发布时间】:2018-07-05 01:55:57
【问题描述】:
我正在我的计算机上运行 nodejs docker 和 mysql。但即使我提供了正确的用户名和密码,我也无法通过 localhost 访问数据库。 当我尝试访问 docker nodejs 服务器时,我收到错误消息。
以下是当我尝试通过 localhost 访问 docker 服务器时收到的 $docker-compose logs -f 日志消息:
db_1 | App listening on port 9000
backend_1 | Error occurred: { Error: connect ECONNREFUSED
172.18.0.3:3306
backend_1 | at Object.createConnection
(/opt/app/node_modules/mysql2/promise.js:31:31)
backend_1 | at _callee$ (/opt/app/src/index.js:29:30)
backend_1 | at tryCatch (/opt/app/node_modules/regenerator-
runtime/runtime.js:65:40)
backend_1 | at Generator.invoke [as _invoke]
(/opt/app/node_modules/regenerator-runtime/runtime.js:303:22)
backend_1 | at Generator.prototype.(anonymous function) [as
next] (/opt/app/node_modules/regenerator-runtime/runtime.js:117:21)
backend_1 | at step (/opt/app/src/index.js:21:191)
backend_1 | at /opt/app/src/index.js:21:437
backend_1 | at new Promise (<anonymous>)
backend_1 | at /opt/app/src/index.js:21:99
backend_1 | at /opt/app/src/index.js:26:1
backend_1 | message: 'connect ECONNREFUSED 172.18.0.3:3306',
backend_1 | code: 'ECONNREFUSED',
backend_1 | errno: 'ECONNREFUSED',
backend_1 | sqlState: undefined }
backend_1 |
backend_1 | Error: connect ECONNREFUSED 172.18.0.3:3306
backend_1 | at Object.createConnection
(/opt/app/node_modules/mysql2/promise.js:31:31)
backend_1 | at _callee$ (/opt/app/src/index.js:29:30)
backend_1 | at tryCatch
(/opt/app/node_modules/regenerator-runtime/runtime.js:65:40)
backend_1 | at Generator.invoke [as _invoke]
(/opt/app/node_modules/regenerator-runtime/runtime.js:303:22)
backend_1 | at Generator.prototype.(anonymous function)
[as next] (/opt/app/node_modules/regenerator-
runtime/runtime.js:117:21)
backend_1 | at step (/opt/app/src/index.js:21:191)
backend_1 | at /opt/app/src/index.js:21:437
backend_1 | at new Promise (<anonymous>)
backend_1 | at /opt/app/src/index.js:21:99
backend_1 | at /opt/app/src/index.js:26:1
这是我的 docker-compose.yml 文件:
version: '3'
services:
backend:
build:
context: ./
dockerfile: .dockerfiles/BackendDev
ports:
- "9000:9000"
volumes:
- ./backend:/opt/app
restart: always
backend_test:
build:
context: ./
dockerfile: .dockerfiles/BackendDev
command: yarn run test:watch
ports:
- "9005:9005"
volumes:
- ./backend:/opt/app
restart: always
db:
image: mysql:8.0.3
volumes:
- /var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: db_rootpass
MYSQL_DATABASE: db_1
restart: always
mywebsql:
image: quantumobject/docker-mywebsql
ports:
- "9001:80"
restart: always
这是我的 js 文件:
import 'babel-polyfill';
import Koa from 'koa';
import Router from 'koa-router';
import mysql from 'mysql2/promise';
// The port that this server will run on, defaults to 9000
const port = process.env.PORT || 9000;
// Instantiate a Koa server
const app = new Koa();
// Instantiate routers
const test = new Router();
// Define API path
const apiPath = '/api/v1';
const connectionSettings = {
host: 'db',
user: 'root',
database: 'db_1',
password: 'db_rootpass',
namedPlaceholders: true,
};
test.get(`${apiPath}/test`, async (ctx) => {
// Tell the HTTP response that it contains JSON data encoded in UTF-8
try {
const conn = await mysql.createConnection(connectionSettings);
const [data] = await conn.execute(`
SELECT *
FROM test_table
`);
console.log('Data fetched:', data);
// Tell the HTTP response that it contains JSON data encoded in UTF-8
ctx.type = 'application/json; charset=utf-8';
// Add stuff to response body
ctx.body = { greeting: 'Hello world!', data };
} catch (error) {
console.error('Error occurred:', error);
ctx.throw(500, error);
}
});
app.use(test.routes());
app.use(test.allowedMethods());
// Start the server and keep listening on port until stopped
app.listen(port);
console.log(`App listening on port ${port}`);
【问题讨论】:
-
你是如何连接到mysql的?显示该代码。
-
您是否尝试将
network_mode: host添加到 docker-compose 服务? -
你有来自
db_1容器的日志吗?您的输出中似乎只有一行,甚至在您的后端代码中似乎有点奇怪? -
我尝试将 'network_mode: host' 添加到 docker-compose 服务,但没有成功。
-
这里是 db_1 日志:
Attaching to nodejsmysqlmartinbaseka_db_1 db_1 | yarn run v1.5.1 db_1 | $ nodemon src/index.js -w src --exec babel-node db_1 | [nodemon] 1.17.4 db_1 | [nodemon] to restart at any time, enterrs` db_1 | [nodemon] 观看:/opt/app/src/**/* db_1 | [nodemon] 开始babel-node src/index.jsdb_1 |应用程序监听端口 9000 `@PeterGrainger