You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境下NestJS连接MySQL报ECONNREFUSED错误排查

问题原因分析

1. 容器间网络寻址错误

Docker Compose中每个容器都是独立的网络节点,不能用127.0.0.1访问其他容器。127.0.0.1在后端容器内指向容器自身,而非MySQL容器。正确的做法是使用docker-compose.yml中MySQL服务的名称(比如mysql)作为数据库连接的主机地址。

2. 端口概念混淆

  • MySQL容器内部默认端口是3306,如果你的docker-compose.yml里将MySQL端口映射为3307:3306,后端容器连接时必须用3306(容器内部端口),而非3307(宿主机映射端口)。宿主机端口仅用于外部访问,容器间通信直接使用容器内部端口。

3. 服务启动顺序问题

NestJS启动速度通常比MySQL快,后端可能在MySQL完成初始化前就尝试连接,导致连接被拒绝。需要在docker-compose.yml中给后端服务添加依赖配置,同时配合健康检查,确保MySQL就绪后再启动后端。

4. MySQL配置不匹配

  • 检查MySQL容器的环境变量(如MYSQL_ROOT_PASSWORD、MYSQL_DATABASE)是否正确,后端连接的用户名、密码、数据库名必须与这些配置完全一致。
  • 确认MySQL容器未被自定义配置限制容器间连接(默认官方MySQL镜像允许容器间访问,除非你修改了权限配置)。

示例修正方向

docker-compose.yml 调整

services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: your_pwd
      MYSQL_DATABASE: your_db
    ports:
      - "3307:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      timeout: 20s
      retries: 10

  backend:
    build:
      context: .
      dockerfile: Dockerfile-backend
    depends_on:
      mysql:
        condition: service_healthy
    environment:
      DB_HOST: mysql
      DB_PORT: 3306
      DB_USER: root
      DB_PASSWORD: your_pwd
      DB_NAME: your_db

app.module.ts 数据库配置调整

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: process.env.DB_HOST,
      port: parseInt(process.env.DB_PORT),
      username: process.env.DB_USER,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_NAME,
      entities: [/* 你的实体类 */],
      synchronize: true,
    }),
  ],
})
export class AppModule {}

内容的提问来源于stack exchange,提问作者pmiranda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 08:49:58