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

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:35:17