当应用程序在本地运行时,Node.js 能够连接到 MySQL 容器,但当应用程序在容器中运行时无法连接

Posted

技术标签:

【中文标题】当应用程序在本地运行时,Node.js 能够连接到 MySQL 容器,但当应用程序在容器中运行时无法连接【英文标题】:Node.js able to connect to MySQL container when app is ran locally but unable to connect when app is ran in a container 【发布时间】:2022-01-07 18:52:51 【问题描述】:

Docker 编写文件:

version: '3.8'

networks:
  app-tier:
    driver: bridge


services: 
  mysql_node: 
    image: mysql:5.7
    restart: always
    environment: 
      MYSQL_DATABASE: 'sample_db' 
      MYSQL_USER: 'user' 
      MYSQL_PASSWORD: 'password' 
      MYSQL_ROOT_PASSWORD: 'password'
    ports: 
      - '3306:3306'
    expose: 
      - '3306' 
    volumes:
      - mysql_db:/var/lib/mysql
  app:   
    depends_on:
      - mysql_node
    build: .   
    ports:
      - 3000:3000
    environment:
      - MYSQL_HOST=mysql_node
      - MYSQL_USER=root
      - MYSQL_PASSWORD=password
      - MYSQL_NAME=sample_db
      - MYSQL_PORT=3306
      - MYSQL_HOST_IP=mysql_node
    networks:
      - app-tier   
    volumes:
      - .:/app

volumes:
  mysql_db:

码头文件:

FROM node:latest

RUN mkdir app

WORKDIR /app

COPY . .  
RUN npm install

EXPOSE 3000

CMD ["node", "app.js"]

源码:

const http = require('http')
var mysql = require('mysql');


const hostname = '0.0.0.0'
const port = 3000

console.log(process.env.MYSQL_HOST_IP)
console.log(process.env.MYSQL_PORT)
var con = mysql.createConnection(
  host: "process.env.MYSQL_HOST_IP",
  user: "user",
  password: "password",
  port: 3306
);

con.connect(function(err) 
  if (err) throw err;
  console.log("Connected!");
); 

当我运行docker-compose up 时,MySQL 容器成功启动。但应用退出,错误代码为Error: connect ETIMEDOUT

当我通过node app.js 在本地运行应用程序时,我最终获得了成功的“已连接!”消息输出到我的控制台。

我也可以通过 MySQLWorkbench 连接到数据库。只是当应用程序作为容器运行时,应用程序无法连接到数据库。

【问题讨论】:

【参考方案1】:

您已指定应用程序应位于命名网络上,而数据库不应。然后数据库服务在默认网络上,两个容器不能互相通信。

我会从应用程序中删除命名网络,因为它可能不需要。

  app:   
    depends_on:
      - mysql_node
    build: .   
    ports:
      - 3000:3000
    environment:
      - MYSQL_HOST=mysql_node
      - MYSQL_USER=root
      - MYSQL_PASSWORD=password
      - MYSQL_NAME=sample_db
      - MYSQL_PORT=3306
      - MYSQL_HOST_IP=mysql_node
    volumes:
      - .:/app

【讨论】:

该死的,谢谢。我到处寻找答案。当我运行docker network ls 并看到 2 个不同的网络时,我应该认为有些奇怪。事实证明我需要花更多时间学习 docker 的基础知识。

以上是关于当应用程序在本地运行时,Node.js 能够连接到 MySQL 容器,但当应用程序在容器中运行时无法连接的主要内容,如果未能解决你的问题,请参考以下文章

wbhook 通过 ngrok 连接到本地 node.js 服务器,服务触发 Webhooks 需要密码吗?

Mongodb atlas + node.js 在本地工作,但在推送到 Heroku 时停止

无法连接到本地 Node.js 安全 WebSocketServer

Node.js - 在 Heroku 上使用 MongoHQ 连接到 MongoDB

将节点js连接到postgresql(谷歌云平台)

在 Node.js 中连接到多个 MySQL 数据库