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

Docker中ASP.NET容器无法连接同环境PostgreSQL容器问题

问题:Docker中ASP.NET容器无法连接PostgreSQL容器,本地控制台可正常连接

我有两个Docker容器:本地.NET 6控制台应用调用Test.Main()方法可正常连接Docker中的PostgreSQL,但从ASP.NET Docker容器调用同一方法时无法连接,抛出异常Failed to connect to 127.0.0.1:5432。

错误信息

{Npgsql.NpgsqlException (0x80004005): Failed to connect to 127.0.0.1:5432
 ---> System.Net.Sockets.SocketException (111): Connection refused
   at Npgsql.Internal.NpgsqlConnector.Connect(NpgsqlTimeout timeout)
   at Npgsql.Internal.NpgsqlConnector.Connect(NpgsqlTimeout timeout)
   at Npgsql.Internal.NpgsqlConnector.RawOpen(SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken, Boolean isFirstAttempt)
   at Npgsql.Internal.NpgsqlConnector.<Open>g__OpenCore|215_1(NpgsqlConnector conn, SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken, Boolean isFirstAttempt)
   at Npgsql.Internal.NpgsqlConnector.Open(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
   at Npgsql.PoolingDataSource.OpenNewConnector(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
   at Npgsql.PoolingDataSource.<Get>g__RentAsync|28_0(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlConnection.<Open>g__OpenAsync|45_0(Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlConnection.Open()
   at APIDA.DBModels.Test.Main() in Version.cs:line 34}

当前容器列表

C:\Users\HT>docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                                           NAMES
bdc65451aeda   gb3api:dev   "tail -f /dev/null"      17 minutes ago   Up 16 minutes   0.0.0.0:49160->80/tcp, 0.0.0.0:49159->443/tcp   GB3API
95b6a289f4a8   postgres     "docker-entrypoint.s…"   47 minutes ago   Up 47 minutes   0.0.0.0:5432->5432/tcp                          gb-postgres

ASP.NET项目Dockerfile内容

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["GB3API/GB3API.csproj", "GB3API/"]
RUN dotnet restore "GB3API/GB3API.csproj"
COPY . .
WORKDIR "/src/GB3API"
RUN dotnet build "GB3API.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "GB3API.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "GB3API.dll"]

Test.Main代码

public class Test
{
    public static void Main()
    {
        string connectionString = "Host=127.0.0.1;Database=postgres;Username=postgres;Password=xxxxx";

        // 创建PostgreSQL连接
        using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
        {
            try
            {
                // 打开连接
                connection.Open();

                // 检查连接状态
                if (connection.State == System.Data.ConnectionState.Open)
                {
                    Console.WriteLine("Connected to PostgreSQL!");

                    // 执行数据库操作

                    // 关闭连接
                    connection.Close();
                    Console.WriteLine("Connection closed.");
                }
                else
                {
                    Console.WriteLine("Failed to open the connection.");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
            }
        }

        Console.ReadLine();
    }
}

解决方案

问题根源

Docker容器内部的127.0.0.1指向容器自身,而非宿主机。本地控制台能连接是因为宿主机的5432端口已映射到PostgreSQL容器,但ASP.NET容器内访问127.0.0.1只会查找自身的5432端口,因此连接被拒绝。

修复步骤

  1. 替换连接字符串中的主机地址
    将连接字符串里的Host=127.0.0.1改为PostgreSQL容器的名称Host=gb-postgres。Docker默认会在同一网络环境下解析容器名称到对应IP,ASP.NET容器可直接通过该名称访问PostgreSQL容器。修改后的代码:

    string connectionString = "Host=gb-postgres;Database=postgres;Username=postgres;Password=xxxxx";
    
  2. 确保两个容器在同一Docker网络
    如果当前容器不在同一自定义网络中,需要创建网络并重新启动容器:

    # 创建自定义Docker网络
    docker network create gb-network
    # 停止并删除现有PostgreSQL容器(若已运行)
    docker stop gb-postgres && docker rm gb-postgres
    # 在新网络中启动PostgreSQL容器
    docker run --name gb-postgres --network gb-network -p 5432:5432 -e POSTGRES_PASSWORD=xxxxx -d postgres
    # 停止并删除现有ASP.NET容器(若已运行)
    docker stop GB3API && docker rm GB3API
    # 在新网络中启动ASP.NET容器
    docker run --name GB3API --network gb-network -p 49160:80 -p 49159:443 -d gb3api:dev
    

内容的提问来源于stack exchange,提问作者Syed Rafey Husain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:05:19