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

.NET Core Docker容器端口无法访问及PostgreSQL服务找不到问题排查

Docker + .NET Core + PostgreSQL 连接与访问问题排查方案

问题场景

我有一个基于Docker的.NET Core 6解决方案,通过Dockerfile构建发布并暴露80端口;docker-compose.yml定义了两个容器:PostgreSQL(容器名postgres)和.NET Core应用(容器名testapi),预期两者处于同一网络。目前遇到两个核心问题:

  1. 访问本地8010端口无法打开页面,尽管容器创建和数据库迁移显示成功
  2. 构建时会生成第三个独立网络的容器,触发错误System.Net.Internals.SocketExceptionFactory.ExtendedSocketException: 'Name or service not known',提示找不到postgres服务

排查与解决思路

一、容器网络与服务名称匹配问题

  • 修正连接字符串主机名:Docker Compose中PostgreSQL的服务名称是postgres-db(而非容器名postgres),容器间通信需使用服务名称。检查appsettings.json中的DefaultConnection,确保主机名正确:
    "ConnectionStrings": {
      "DefaultConnection": "Host=postgres-db;Database=Test_Api;Username=postgres_user;Password=12345678"
    }
    
  • 验证容器网络归属:执行以下命令确认两个容器是否在同一网络:
    • 查看所有Docker网络:docker network ls
    • 查看testapi容器的网络信息:docker inspect testapi | grep Networks
      若不在同一网络,手动将testapi加入postgres所在网络:docker network connect <postgres-network-name> testapi

二、端口映射与协议冲突问题

  • 统一访问协议:Dockerfile暴露的是80端口(HTTP),但launchSettings.json的Docker配置启用了HTTPS(useSSL: true)。访问时需使用http://localhost:8010/swagger,或修改配置:
    • 临时方案:直接访问HTTP地址跳过HTTPS重定向
    • 持久方案:在launchSettings.json的Docker节点中关闭useSSL,并修改launchUrl为http://{ServiceHost}:8010/swagger
  • 检查容器运行状态:
    • 查看容器状态:docker ps,确认testapi容器处于Up状态
    • 查看容器日志:docker logs testapi,排查启动错误或数据库连接失败的详细信息

三、Docker Compose与VS启动方式冲突

  • 统一使用docker-compose启动:VS的Docker命令(launchSettings.json中的Docker节点)会创建独立的容器和网络,与docker-compose的网络隔离。正确启动方式为在项目根目录执行:
    docker-compose up --build
    
  • 添加PostgreSQL健康检查:depends_on仅保证容器启动顺序,不保证数据库服务就绪。修改docker-compose.yml添加健康检查,确保postgres完全就绪后再启动testapi:
    postgres-db:
      image: "postgres"
      container_name: "postgres"
      restart: always
      environment:
        - POSTGRES_USER=postgres_user
        - POSTGRES_PASSWORD=12345678
        - POSTGRES_DB=Test_Api
      expose: 
        - "5432"
      healthcheck:
        test: ["CMD-SHELL", "pg_isready -U postgres_user -d Test_Api"]
        interval: 5s
        timeout: 5s
        retries: 5
    testapi:
      depends_on: 
        postgres-db:
          condition: service_healthy
      container_name: testapi
      build:
        context: .
        dockerfile: Dockerfile
      ports: 
        - "8010:80"
    

四、数据库迁移时机优化

  • 添加迁移重试机制:Startup的Configure方法中执行迁移时,可能因数据库未就绪导致连接失败。修改迁移逻辑添加重试:
    public static void MigrationInitialState(IApplicationBuilder app)
    {
        using var serviceScope = app.ApplicationServices.CreateScope();
        var context = serviceScope.ServiceProvider.GetService<ApplicationDbContext>();
        var retryCount = 5;
        while (retryCount > 0)
        {
            try
            {
                context.Database.Migrate();
                break;
            }
            catch (Exception)
            {
                retryCount--;
                Thread.Sleep(2000);
            }
        }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:01:01