【问题标题】:Node.js able to connect to MySQL container when app is ran locally but unable to connect when app is ran in a container当应用程序在本地运行时,Node.js 能够连接到 MySQL 容器,但当应用程序在容器中运行时无法连接
【发布时间】: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 连接到数据库。只是当应用程序作为容器运行时,应用程序无法连接到数据库。

【问题讨论】:

    标签: mysql node.js docker


    【解决方案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 的基础知识。
    猜你喜欢
    • 2020-12-07
    • 2017-11-03
    • 2015-11-19
    • 1970-01-01
    • 2018-06-25
    • 2018-02-07
    • 1970-01-01
    • 2016-04-11
    • 2022-11-24
    相关资源
    最近更新 更多