ASP.NET Core 8.0 Web API+SQL Server Docker多容器无法通过localhost访问
排查ASP.NET Core 8.0 Web API容器访问失败问题
环境信息
项目结构:
jobApplicationTrackerApi - jobApplicationTracker (folder) - .github - jobApplicationTracker.sln - docker-compose.yaml and some other files.
jobApplicationTracker文件夹内的Dockerfile:
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY jobApplicationTrackerApi.csproj . RUN dotnet restore COPY . . RUN dotnet publish -c Release -o /app FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app EXPOSE 80 EXPOSE 7128 COPY --from=build /app . ENTRYPOINT ["dotnet", "jobApplicationTrackerApi.dll"]
docker-compose.yaml内容:
services: app: build: context: ./jobApplicationTracker dockerfile: Dockerfile ports: - "8080:80" - "7128:8128" environment: - JobTrackerDb=Server=sqlserver,1433;Database=JobAppDb;User Id=sa;Password=pwd;TrustServerCertificate=True; depends_on: - sqlserver sqlserver: image: mcr.microsoft.com/mssql/server:2022-latest container_name: sqlserver ports: - "1433:1433" environment: - ACCEPT_EULA=Y - SA_PASSWORD=pwd healthcheck: test: ["CMD-SHELL", "sqlcmd -S localhost -U sa -P pwd -Q 'SELECT 1'"] interval: 10s timeout: 10s retries: 3 volumes: - sql-data:/var/opt/mssql volumes: sql-data:
容器启动日志:
[+] Running 2/2 ✔ Container sqlserver Created 0.0s ✔ Container jobapplicationtrackerapi-app-1 Recreated 0.2s app-1 | info: Microsoft.Hosting.Lifetime[14] app-1 | Now listening on: http://[::]:8080
排查步骤
1. 修正端口映射与监听端口的矛盾
日志显示API在容器内监听8080端口,但docker-compose中配置的端口映射是8080:80(主机8080映射到容器80),两者不匹配导致请求无法到达API。
- 方案一:修改docker-compose的端口映射为
8080:8080; - 方案二:调整API监听端口为80,可通过环境变量
ASPNETCORE_URLS=http://+:80覆盖,或在Program.cs中确保未硬编码非80端口。
同时注意到docker-compose中7128:8128的映射也存在错误,Dockerfile中EXPOSE的是7128,应改为7128:7128。
2. 检查API完整启动日志
执行以下命令查看容器完整日志,确认是否存在数据库连接失败、初始化异常等隐藏错误:
docker logs jobapplicationtrackerapi-app-1
3. 确保SQL Server就绪后再启动API
depends_on仅保证容器启动顺序,不保证SQL Server完全就绪。可升级docker-compose版本至3.8+,添加健康检查依赖:
depends_on: sqlserver: condition: service_healthy
同时建议在API中添加数据库连接重试逻辑,避免启动时因SQL Server未就绪导致崩溃。
4. 验证容器内部API可用性
进入app容器内部,用curl测试端点是否正常:
docker exec -it jobapplicationtrackerapi-app-1 bash curl http://localhost:8080/api/Lookup/statuses
- 若容器内访问失败:说明API本身存在问题,需检查路由配置、控制器注解、中间件逻辑等;
- 若容器内访问正常:则排查主机与容器的网络映射问题,比如防火墙是否拦截8080端口。
5. 确认路由与数据库配置
- 检查Program.cs中是否添加了
app.MapControllers();,控制器是否标注[ApiController]及正确的路由模板(如[Route("api/[controller]/[action]")]),确保/api/Lookup/statuses端点存在; - 验证数据库连接字符串:确认
Server=sqlserver,1433格式正确,JobAppDb数据库是否已创建,若API未配置自动建库逻辑,需手动创建或在DbContext中添加EnsureCreated()/迁移代码。
内容的提问来源于stack exchange,提问作者Ivan Andrau
相关产品推荐
相关产品推荐

