当节点应用程序 Docker 化时,与 MYSQL 数据库的连接被拒绝

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

我在将节点应用程序容器连接到 MySQL 数据库时遇到问题。当 -compose up 时,我不断从容器日志中收到错误: 服务器1 |无法连接到数据库 ConnectionRefusedError [SequelizeConnectionRefusedError]: connect ECONNREFUSED 172.20.0.2:3306

这是我的数据库实例:

const { Sequelize } = require("sequelize");
require("dotenv").config();

const sequelize = new Sequelize("admin", "password", "table", {
  host: "mysql2",
  dialect: "mysql",
  port: 3306,
});

module.exports = sequelize;

Docker 撰写文件:

services:
  server:
    build:
      context: .
    ports:
      - "3001:3001"
    restart: always
    depends_on:
      - "mysql"

  mysql:
    image: mysql:8.0.0
    container_name: mysql2
    restart: always
    environment:
      MYSQL_USER: admin
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3307:3306"

和 Dockerfile:

Docker file: 

FROM node:20-alpine

WORKDIR /server

COPY package.json .

RUN npm install --production

COPY . .

EXPOSE 3001

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

我尝试仅创建一个 MYSQL 容器,并且能够初始化数据库并连接到工作台中的端口。我尝试将 MySQL 容器与节点容器放在同一个 docker 网络中,但遇到了相同的错误。我尝试了不同的版本,节点:18、20和22 alpine,以及MySQL 8.0、9.0.1和8.0.33。

我还尝试

docker inspect
MYSQL容器,找到网关IP,使用该IP作为主机,它所做的就是将错误更改为该IP。

只是想指出我在我的应用程序中使用 Sequelize。

替代 Docker 撰写文件:

services:
  server:
    build:
      context: .
    ports:
      - "3001:3001"
    depends_on:
      mysql:
        condition: service_healthy

  mysql:
    image: mysql:8.0.0
    container_name: mysql2
    environment:
      MYSQL_USER: admin
      MYSQL_ROOT_PASSWORD: password
      MYSQL_PASSWORD: password
    ports:
      - "3307:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-p'password'"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 30s
mysql node.js docker sequelize.js
1个回答
0
投票

在 docker-compose.yml 中添加共享网络以确保连接:

networks:
  app-network:
    driver: bridge
services:
  server:
    networks:
      - app-network
  mysql:
    networks:
      - app-network
© www.soinside.com 2019 - 2024. All rights reserved.