【问题标题】:docker nodejs container cant connect to mysql container from localhostdocker nodejs容器无法从localhost连接到mysql容器
【发布时间】: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
我尝试将端口号更改为 3306,但没有帮助。 有什么我想念的吗?

这是我的 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, enter rs` db_1 | [nodemon] 观看:/opt/app/src/**/* db_1 | [nodemon] 开始babel-node src/index.js db_1 |应用程序监听端口 9000 `@PeterGrainger

标签: node.js docker


【解决方案1】:

出于调试目的,您也可以直接连接到您的 docker 容器,例如:docker exec -it CONTAINER_ID /bin/bash 并尝试在本地连接到您的 mysql 数据库。我将首先验证数据库是否能够接受连接。此外,您确定当您的 nodeJS 应用程序尝试连接数据库时该数据库已经在运行吗?我没有用 docker compose 做任何事情,所以我不太确定网络功能,但是当您使用network_mode: host 时,我认为您也应该能够直接从本地计算机连接到 mysql 容器与 mysql 客户端。您应该先进行这些测试。
给我们一些反馈:)

【讨论】:

  • 数据库正在运行,我可以在本地连接到mysql DB。但我无法通过localhost:9001 连接到网络浏览器中的数据库。
猜你喜欢
  • 2019-04-01
  • 2017-08-10
  • 1970-01-01
  • 2019-04-14
  • 2020-12-30
  • 2020-07-29
  • 2021-04-04
  • 2019-07-22
  • 2016-04-26
相关资源
最近更新 更多