Docker容器中C# Web Api无法连接同网络Postgres数据库求助
问题背景
Linux服务器上部署两个Docker容器:Postgres数据库容器和C# Web API容器,已加入自定义shared-network网络。Web API使用容器名postgres-database连接,但报错:
Unhandled exception. Npgsql.NpgsqlException (0x80004005): Failed to connect to 172.18.0.5:62451
---> System.Net.Sockets.SocketException (111): Connection refused
已确认DNS解析正常(IP和端口正确),外部通过端口映射可正常连接Postgres,且已设置listen_addresses='*'、修改pg_hba.conf允许172.18.0.1/16网段访问并重启容器。
启动命令:
docker run --name postgres-database -e POSTGRES_PASSWORD=PASSWORD --network shared-network -p 62451:5432 -d postgres -c listen_addresses=* docker run -p 12345:80 -d --name my-api --network shared-network my-api
可能的故障原因及解决步骤
1. 连接字符串错误使用宿主机映射端口
容器在自定义网络内通信时,必须使用Postgres容器的内部端口5432,而非宿主机映射的62451。报错显示连接的是62451,说明Web API的连接字符串端口配置错误。
- 修正连接字符串,确保端口为
5432,示例:Host=postgres-database;Port=5432;Database=your_db;Username=postgres;Password=PASSWORD
2. pg_hba.conf配置未真正生效
直接修改容器内的pg_hba.conf会在容器重启后被官方Postgres镜像的初始化配置覆盖,导致设置无效。正确做法:
- 挂载本地修改好的
pg_hba.conf到容器:docker run --name postgres-database -e POSTGRES_PASSWORD=PASSWORD --network shared-network -p 62451:5432 -v /path/to/your/pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf -d postgres -c listen_addresses=* - 测试阶段可临时使用环境变量放宽权限(生产环境禁用):
docker run --name postgres-database -e POSTGRES_PASSWORD=PASSWORD -e POSTGRES_HOST_AUTH_METHOD=trust --network shared-network -p 62451:5432 -d postgres -c listen_addresses=*
3. 容器启动顺序导致连接时机过早
Web API容器先于Postgres启动时,Postgres尚未完成初始化,会触发连接拒绝。解决方式:
- 使用Docker Compose的
depends_on配置,确保Postgres启动后再启动Web API; - 在Web API代码中添加连接重试逻辑(比如用Polly库实现);
- 手动先启动Postgres容器,等待10-15秒再启动Web API容器。
4. 自定义网络网段与pg_hba.conf不匹配
检查自定义网络的实际网段:
docker network inspect shared-network
查看Subnet字段,若实际网段不是172.18.0.0/16,需更新pg_hba.conf中的对应网段配置。
5. Postgres容器未正常启动
查看Postgres容器日志确认服务状态:
docker logs postgres-database
若日志中出现database system is ready to accept connections则启动正常;若有错误(如权限问题、磁盘空间不足),需针对性修复。
内容的提问来源于stack exchange,提问作者Glover

