.NET Core Docker容器端口无法访问及PostgreSQL服务找不到问题排查
Docker + .NET Core + PostgreSQL 连接与访问问题排查方案
问题场景
我有一个基于Docker的.NET Core 6解决方案,通过Dockerfile构建发布并暴露80端口;docker-compose.yml定义了两个容器:PostgreSQL(容器名postgres)和.NET Core应用(容器名testapi),预期两者处于同一网络。目前遇到两个核心问题:
- 访问本地8010端口无法打开页面,尽管容器创建和数据库迁移显示成功
- 构建时会生成第三个独立网络的容器,触发错误
System.Net.Internals.SocketExceptionFactory.ExtendedSocketException: 'Name or service not known',提示找不到postgres服务
排查与解决思路
一、容器网络与服务名称匹配问题
- 修正连接字符串主机名:Docker Compose中PostgreSQL的服务名称是
postgres-db(而非容器名postgres),容器间通信需使用服务名称。检查appsettings.json中的DefaultConnection,确保主机名正确:"ConnectionStrings": { "DefaultConnection": "Host=postgres-db;Database=Test_Api;Username=postgres_user;Password=12345678" } - 验证容器网络归属:执行以下命令确认两个容器是否在同一网络:
- 查看所有Docker网络:
docker network ls - 查看testapi容器的网络信息:
docker inspect testapi | grep Networks
若不在同一网络,手动将testapi加入postgres所在网络:docker network connect <postgres-network-name> testapi
- 查看所有Docker网络:
二、端口映射与协议冲突问题
- 统一访问协议:Dockerfile暴露的是80端口(HTTP),但
launchSettings.json的Docker配置启用了HTTPS(useSSL: true)。访问时需使用http://localhost:8010/swagger,或修改配置:- 临时方案:直接访问HTTP地址跳过HTTPS重定向
- 持久方案:在
launchSettings.json的Docker节点中关闭useSSL,并修改launchUrl为http://{ServiceHost}:8010/swagger
- 检查容器运行状态:
- 查看容器状态:
docker ps,确认testapi容器处于Up状态 - 查看容器日志:
docker logs testapi,排查启动错误或数据库连接失败的详细信息
- 查看容器状态:
三、Docker Compose与VS启动方式冲突
- 统一使用docker-compose启动:VS的Docker命令(
launchSettings.json中的Docker节点)会创建独立的容器和网络,与docker-compose的网络隔离。正确启动方式为在项目根目录执行:docker-compose up --build - 添加PostgreSQL健康检查:
depends_on仅保证容器启动顺序,不保证数据库服务就绪。修改docker-compose.yml添加健康检查,确保postgres完全就绪后再启动testapi:postgres-db: image: "postgres" container_name: "postgres" restart: always environment: - POSTGRES_USER=postgres_user - POSTGRES_PASSWORD=12345678 - POSTGRES_DB=Test_Api expose: - "5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres_user -d Test_Api"] interval: 5s timeout: 5s retries: 5 testapi: depends_on: postgres-db: condition: service_healthy container_name: testapi build: context: . dockerfile: Dockerfile ports: - "8010:80"
四、数据库迁移时机优化
- 添加迁移重试机制:Startup的Configure方法中执行迁移时,可能因数据库未就绪导致连接失败。修改迁移逻辑添加重试:
public static void MigrationInitialState(IApplicationBuilder app) { using var serviceScope = app.ApplicationServices.CreateScope(); var context = serviceScope.ServiceProvider.GetService<ApplicationDbContext>(); var retryCount = 5; while (retryCount > 0) { try { context.Database.Migrate(); break; } catch (Exception) { retryCount--; Thread.Sleep(2000); } } }
内容的提问来源于stack exchange,提问作者Supplier PriceList2
相关产品推荐
相关产品推荐

