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
相关产品推荐
相关产品推荐

