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端口,因此连接被拒绝。
修复步骤
替换连接字符串中的主机地址
将连接字符串里的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";确保两个容器在同一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
相关产品推荐
相关产品推荐

