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

Docker Compose中.NET应用无法连接数据库问题求助

问题描述

我创建了包含schoolsystem.api、mongo、postgresql三个服务的docker-compose.yml文件,遇到两个问题:

  • 访问http://localhost:8080/swagger时,浏览器提示“This site can’t be reached”
  • 访问获取所有学科的接口http://localhost:8080/api/v1/subjects/list时,出现5432端口连接错误

已添加depends_on配置,但问题仍未解决,附上docker-compose.yml代码:

version: '3.4'

services:
  schoolsystem.api:
    image: schoolsystem.api
    build:
      context: .
      dockerfile: SchoolSystem.API/Dockerfile
    ports:
      - "8080:8080"
    depends_on:
      - postgresql
      - mongo
  mongo:
    image: mongo:latest
    container_name: mongodb-container
    ports:
      - "27017:27017"
    volumes:
      - mongodb-data:/data/db
  postgresql:
    image: postgres
    container_name: postgresql-container
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=schoolsystem

volumes:
  mongodb-data:
    driver: local 
  pgdata:
解决方案

解决5432端口连接错误

  • 修正数据库连接地址:schoolsystem.api的配置文件里,PostgreSQL连接地址不能写localhost:5432,要改成postgresql:5432。Docker Compose会自动为服务创建内部DNS解析,用服务名postgresql就能直接访问对应容器,而非宿主机的localhost。
  • 确保PostgreSQL就绪后再启动API:depends_on仅保证容器启动顺序,不代表数据库已完成初始化并可接受连接。给PostgreSQL添加健康检查,确保就绪后再启动API:
    修改postgresql服务配置:
    postgresql:
      image: postgres
      container_name: postgresql-container
      ports:
        - "5432:5432"
      volumes:
        - pgdata:/var/lib/postgresql/data
      environment:
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=postgres
        - POSTGRES_DB=schoolsystem
      healthcheck:
        test: ["CMD-SHELL", "pg_isready -U postgres -d schoolsystem"]
        interval: 5s
        timeout: 5s
        retries: 5
    
    同步修改schoolsystem.api的depends_on规则:
    schoolsystem.api:
      # 其他配置保持不变
      depends_on:
        postgresql:
          condition: service_healthy
        mongo:
          condition: service_started # 若Mongo也需等待就绪,可同理添加健康检查
    

解决8080端口无法访问

  • 排查API容器启动状态:执行docker-compose logs schoolsystem.api查看API服务日志,确认是否有启动失败、端口配置错误等问题(比如API实际监听的不是8080端口)。
  • 验证端口映射情况:执行docker ps查看schoolsystem.api容器的端口映射是否显示0.0.0.0:8080->8080/tcp,若没有,检查Dockerfile的EXPOSE配置和API的启动端口是否一致。
  • 检查端口占用与防火墙:用netstat -ano | findstr :8080(Windows)或lsof -i :8080(Linux/macOS)确认宿主机8080端口是否被其他程序占用,同时检查防火墙是否拦截了该端口的访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 02:16:01