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

Docker部署PostgreSQL后,C#/.NET6无法连接的问题求助

在Visual Studio 2022/.NET6环境下连接Docker容器中PostgreSQL的连接超时问题

Docker部署PostgreSQL的步骤

步骤1 - 安装PostgreSQL

docker pull postgres
docker run --name gb-postgres -e POSTGRES_PASSWORD=xxxxxx -d postgres

步骤2 - 获取容器IP地址

运行
docker ps

复制容器ID后执行

docker inspect {容器ID}

复制容器的IPAddress

步骤3 - 配置API

在Program.cs中使用上述IP地址

异常信息

Npgsql.NpgsqlException (0x80004005): 无法连接到 172.17.0.3:5432
 ---> System.TimeoutException: 连接尝试超时
   在 Npgsql.Internal.NpgsqlConnector.Connect(NpgsqlTimeout timeout)
   在 Npgsql.Internal.NpgsqlConnector.Connect(NpgsqlTimeout timeout)
   在 Npgsql.Internal.NpgsqlConnector.RawOpen(SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken, Boolean isFirstAttempt)
   在 Npgsql.Internal.NpgsqlConnector.<Open>g__OpenCore|203_1(NpgsqlConnector conn, SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken, Boolean isFirstAttempt)
   在 Npgsql.Internal.NpgsqlConnector.Open(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
   在 Npgsql.PoolingDataSource.OpenNewConnector(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
   在 Npgsql.PoolingDataSource.<Get>g__RentAsync|28_0(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
   在 Npgsql.NpgsqlConnection.<Open>g__OpenAsync|45_0(Boolean async, CancellationToken cancellationToken)
   在 Npgsql.NpgsqlConnection.Open()
   在 Program.Main(String[] args) 位置 D:\data\code\Dust-IO\388013gb3\cloud\API\GB3API\ConsoleApp1\Program.cs:行号 14

C#程序代码

using System;
using Npgsql;

class Program
{
    static void Main(string[] args)
    {
        string connectionString = "Host=172.17.0.3;Database=GB3;Username=postgres;Password=xxxxx";

        using (var connection = new NpgsqlConnection(connectionString))
        {
            try
            {
                connection.Open();
                Console.WriteLine("已连接到PostgreSQL数据库。");

                // 在此执行数据库操作

                connection.Close();
                Console.WriteLine("连接已关闭。");
            }
            catch (Exception ex)
            {
                Console.WriteLine("错误: " + ex.Message);
            }
        }

        Console.ReadLine();
    }
}

其他连接工具的错误信息

  • 使用Visual Studio 2022扩展Npgsql PostgreSQL Integration连接时,提示"Exception while connecting"
  • 使用VS Code扩展PostgreSQL by Chris Kolkman连接时,出现错误"ETIMEDOUT 172.17.0.2:5432"

docker inspect结果(网络部分)

"Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "d9371cf11864c75a9c35d03ce24bf90bb78af8f44b43e6336b0630a6d79d9503",
                    "EndpointID": "b235ae6eb713404f9fbbcd35453acb6e9dcb213ad6d51fa8809272912a569e15",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }

解决方案

1. 映射容器端口到主机

当前运行容器时未映射5432端口到主机,导致主机无法直接访问容器内部端口。停止现有容器并重新运行,添加端口映射参数:

# 停止并删除现有容器(如果需要)
docker stop gb-postgres
docker rm gb-postgres

# 重新运行容器,映射主机端口5432到容器5432
docker run --name gb-postgres -e POSTGRES_PASSWORD=xxxxxx -p 5432:5432 -d postgres

2. 修改连接字符串

使用主机localhost或主机IP,而非容器内部IP:

string connectionString = "Host=localhost;Database=GB3;Username=postgres;Password=xxxxx";

注意:如果数据库GB3未在PostgreSQL中创建,需要先进入容器创建该数据库:

docker exec -it gb-postgres psql -U postgres
CREATE DATABASE GB3;

3. 检查防火墙设置

确保主机防火墙允许5432端口的入站连接,避免端口被拦截。

4. 验证容器内PostgreSQL状态

进入容器检查PostgreSQL是否正常运行:

docker exec -it gb-postgres pg_isready -U postgres

如果返回/var/run/postgresql:5432 - accepting connections,说明服务正常。


内容的提问来源于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.17 05:43:08