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

如何固定Docker部署的ASP.NET Web API端口?避免随机端口

解决Docker部署.NET 7 Web API固定端口问题

问题根源

你当前的配置存在两个核心问题:

  • docker-compose端口映射格式错误(包含多余空格)
  • Web API监听地址仅指向容器内部localhost,外部无法访问;同时未与容器映射端口匹配

具体修复步骤

1. 修正docker-compose.yml配置

确保端口映射无空格,同时通过环境变量配置容器内API的监听地址:

version: '3.4'

services:
  acmeapi:
    image: ${DOCKER_REGISTRY-}acmeapi
    build:
      context: .
      dockerfile: AcmeAPI/Dockerfile
    ports:
      - "14331:14331"  # 宿主机端口:容器内端口,格式无空格
    environment:
      - ASPNETCORE_URLS=http://+:14331  # 让API监听容器内所有IP的14331端口
      - ASPNETCORE_ENVIRONMENT=Development

  sqlserver:
    image: mcr.microsoft.com/mssql/server:2019-latest
    ports:
      - "14330:1433"
    environment:
      - SA_PASSWORD=Abc*123!
      - ACCEPT_EULA=Y
    volumes:
      - sqlserver-data:/var/opt/mssql

volumes:
  sqlserver-data:

2. 调整Program.cs监听配置

将监听地址改为容器可外部访问的形式(替代原来的localhost):

using DataAccessLayer;
using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

// 配置API监听所有IP的14331端口,确保容器外部能访问
builder.WebHost.UseUrls("http://0.0.0.0:14331");

//For Entity Framework
builder.Services.AddDbContext<DBContextCore>();

// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

#region
//Inyeccion de dependencias
//DALs
// BLs
#endregion

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();

// 优化数据库迁移方式(可选,更符合依赖注入规范)
using (var scope = app.Services.CreateScope())
{
    var context = scope.ServiceProvider.GetRequiredService<DBContextCore>();
    context.Database.Migrate();
}

app.Run();

3. 确保Dockerfile暴露对应端口

检查你的AcmeAPI/Dockerfile,添加EXPOSE指令声明容器内端口:

FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app
EXPOSE 14331  # 与容器内监听端口一致

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["AcmeAPI/AcmeAPI.csproj", "AcmeAPI/"]
RUN dotnet restore "AcmeAPI/AcmeAPI.csproj"
COPY . .
WORKDIR "/src/AcmeAPI"
RUN dotnet build "AcmeAPI.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "AcmeAPI.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "AcmeAPI.dll"]

验证操作

  1. 停止现有容器:docker-compose down
  2. 重新构建并启动服务:docker-compose up --build
  3. 访问http://localhost:14331/swagger,确认API正常运行在固定端口

内容的提问来源于stack exchange,提问作者Alexis252

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:48:23