当应用程序在本地运行时,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