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

Docker部署NestJS与PostgreSQL出现127.0.0.1连接拒绝错误

问题分析与解决方法

你的问题主要出在网络互通性、配置不匹配以及可能的镜像缓存三个方面,以下是具体的解决步骤:


核心问题点

  1. 网络隔离:你用--network=host启动NestJS容器,但PostgreSQL运行在docker-compose创建的postgres桥接网络中,两种网络环境不互通,导致NestJS无法通过容器名postgres_container访问数据库。
  2. 用户名不匹配:NestJS配置里的username: 'Lenovo'和PostgreSQL环境变量的POSTGRES_USER: Sol完全不一致。
  3. 配置未生效:如果修改app.module.ts后没有重新构建NestJS镜像,容器会一直使用旧配置运行。

解决方案(推荐整合到docker-compose)

把NestJS服务加入到docker-compose中,让所有服务处于同一个网络环境,是最稳定的方式:

1. 修改docker-compose.yaml,添加NestJS服务

version: '3.5'

services:
  postgres:
    container_name: postgres_container
    image: postgres
    environment:
      POSTGRES_USER: Sol
      POSTGRES_PASSWORD: 1234
      PGDATA: /data/postgres
      POSTGRES_DB: gamalol
    volumes:
       - ./postgres:/data/postgres
    ports:
      - "4321:5432"
    networks:
      - postgres
    restart: unless-stopped
  
  pgadmin:
    container_name: pgadmin_container
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: gama@lol.com
      PGADMIN_DEFAULT_PASSWORD: 1234
      PGADMIN_CONFIG_SERVER_MODE: 'False'
    volumes:
       - ./pgadmin:/var/lib/pgadmin
    depends_on:
      - postgres
    ports:
      - "5050:80"
    networks:
      - postgres
    restart: unless-stopped

  # 新增NestJS服务
  nest-app:
    container_name: nest_container
    build: .  # 假设你的Dockerfile在当前目录
    ports:
      - "3000:3000"
    networks:
      - postgres
    depends_on:
      - postgres
    restart: unless-stopped

networks:
  postgres:
    driver: bridge

volumes:
    postgres:
    pgadmin:

2. 修正NestJS的数据库配置

修改app.module.ts里的用户名和网络配置:

TypeOrmModule.forRoot({
  type: 'postgres',
  host: 'postgres_container',  // 同网络下直接用容器名访问
  port: 5432,                  // 用容器内部的端口,不是宿主机映射的4321
  username: 'Sol',             // 和PostgreSQL的环境变量保持一致
  password: '1234',
  database: 'gamalol',
  autoLoadEntities: true,
  synchronize: true,
}),

3. 重新构建并启动所有服务

docker-compose up --build

备选方案(单独运行NestJS容器)

如果不想整合到docker-compose,需要让NestJS容器加入PostgreSQL所在的网络:

  1. 先查看docker-compose创建的网络名称:
docker network ls

找到名称类似[当前目录名]_postgres的网络。

  1. 重新构建NestJS镜像(确保配置生效):
docker build -t prj:latest .
  1. 用指定网络启动NestJS容器:
docker run -d -p 3000:3000 --network=[你的postgres网络名称] prj:latest

同时必须保证app.module.ts里的用户名已经修正为Sol。


额外注意事项

  • 不要混用host网络和桥接网络:host网络下容器直接使用宿主机网络栈,无法访问docker-compose创建的桥接网络内的容器(除非用宿主机IP+映射端口4321,但不推荐)。
  • 数据库就绪检测:depends_on只保证启动顺序,不确保PostgreSQL完全就绪,可在NestJS中添加数据库连接重试逻辑,或者使用wait-for-it等脚本等待数据库启动完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:06:00