使用docker和docker-compose将nodejs应用程序连接到mysql数据库

问题描述 投票:0回答:1

我正在尝试将我的 Node.js 应用程序与 mysql 数据库连接 这是我的 dockerfile

FROM node:latest  
WORKDIR /app 
COPY . /app 
RUN npm update 
RUN npm install 
RUN npm rebuild bcrypt 
ENV SERVER_PORT 3000 
EXPOSE $SERVER_PORT 
CMD ["npm", "start"]

这是 myd docker-compose 文件

 services:
mysqldb:
image: mysql:8.0
container_name: mysqlcontainer
command: --default-authentication-plugin=mysql_native_password
restart: unless-stopped
volumes:

- ./dbinit/init.sql:/docker-entrypoint-initdb.d/0_init.sql

- $HOME/database:/var/lib/mysql
  ports:

- 3306:3306
  expose:

- 3306
  environment:
  MYSQL_DATABASE: hotel_managment
  MYSQL_USER: admin
  MYSQL_PASSWORD: letmein
  MYSQL_ROOT_PASSWORD: letmein

      SERVICE_TAGS: prod
      SERVICE_NAM: mysqldb 

  networks:
  - internalnet

nodeapp:
container_name: nodeappcontainer
build: .
image: nodeapp:v1
ports:

- 3000:3000
  expose:
- 3000
  depends_on:
- mysqldb
  environment:
  DB_HOST: mysqldb
  DB_USER : 'root'
  DB_PASSWORD: 'letmein'
  DB_NAME : hotel_managment
  DB_PORT : 3306
  DB_CONNECTION_LIMIT : 10
  SERVER_PORT : 3000
  SERVICE_TAGS: prod
  SERVICE_NAME: nodeappservice
  networks:
- internalnet

networks:
internalnet:
driver: bridge

这是我的项目结构:(包含在图像中)

这是我的环境文件

DB_HOST = localhost 
DB_USER = root 
DB_PASSWORD = letmein 
DB_NAME = hotel_managment 
DB_PORT = 3306 
DB_CONNECTION_LIMIT = 10 
SERVER_PORT = 5000

这就是我连接到节点内数据库的方式:js

let connection = mysql.createConnection({
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,

});

我正在nodejs目录(文件夹)内运行此命令 docker-compose up -d --build

我收到此错误: `> [电子邮件受保护] 开始

node -r dotenv/config app.js 服务器正在侦听端口:3000 [电子邮件受保护] 开始 节点-r dotenv/config app.js 服务器正在侦听端口:3000 连接到数据库时出错:错误:连接ECONNREFUSED 172.22.0.2:3306 在 TCPConnectWrap.afterConnect [作为未完成] (节点:net:1606:16) { 错误号:-111, 代码:'ECONNREFUSED', 系统调用:'连接', 地址:'172.22.0.2', 端口:3306, 致命:真实 }`

我尝试了一切,但没有任何效果

mysql node.js docker
1个回答
0
投票

如果您从 Docker 中运行节点应用程序,那么我认为您只需要在

.env
文件中使用容器名称即可:

DB_HOST=mysqlcontainer 
DB_USER=root 
DB_PASSWORD=letmein 
DB_NAME=hotel_managment 
DB_PORT=3306 
DB_CONNECTION_LIMIT=10 
SERVER_PORT=5000

在 Docker 上下文中,

localhost
并不是指 mysql 容器。

© www.soinside.com 2019 - 2024. All rights reserved.