.Net 6 Web Api docker 端口转发问题

Posted

技术标签:

【中文标题】.Net 6 Web Api docker 端口转发问题【英文标题】:.Net 6 Web Api docker port forwarding issue 【发布时间】:2021-12-03 13:52:58 【问题描述】:

我有一个安装了 swagger 的空 .NET 6 web api 解决方案。我从 Visual Studio 生成了一个 docker 文件,如下所示:

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["Api.Permissions/Api.Permissions.csproj", "Api.Permissions/"]
COPY ["Api.Permissions.Models/Api.Permissions.Models.csproj", "Api.Permissions.Models/"]
COPY ["Api.Permissions.Services/Api.Permissions.Services.csproj", "Api.Permissions.Services/"]
RUN dotnet restore "Api.Permissions/Api.Permissions.csproj"
COPY . .
WORKDIR "/src/Api.Permissions"
RUN dotnet build "Api.Permissions.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Api.Permissions.csproj" -c Release -o /app/publish

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

我创建了一个 docker 映像并推送到我的 docker hub 帐户。

然后我运行这个命令来拉取并在本地运行镜像:

docker container run -d --name mynewapi -p 8000:443 myusername/myreponame:mycontainername

但是当我浏览到 http://localhost:433/swagger/index.html 我得到:

无法访问此站点 localhost 拒绝连接。

我也尝试使用邮递员向示例端点发出 GET 请求,但我得到了同样的错误。

我在这里做错了什么?

【问题讨论】:

【参考方案1】:

运行容器时,将容器中的 443 端口映射到主机上的 8000 端口。所以你需要使用8000端口来访问它。

由于您映射的是 https 端口 443,因此您应该使用 https。所以你的网址应该是https://localhost:8000/swagger/index.html

但这还不够。默认情况下,Swagger 仅在您的解决方案在开发模式下运行时可用。您可以使用需要设置为“开发”的环境变量ASPNETCORE_ENVIRONMENT 来控制它。当您像这样运行容器时,您可以在 docker 命令中执行此操作

docker container run -d --name mynewapi -p 8000:443 -e ASPNETCORE_ENVIRONMENT=Development myusername/myreponame:mycontainername

或者你可以像这样将它添加到 Dockerfile 中

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
ENV ASPNETCORE_ENVIRONMENT=Development
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["Api.Permissions/Api.Permissions.csproj", "Api.Permissions/"]
COPY ["Api.Permissions.Models/Api.Permissions.Models.csproj", "Api.Permissions.Models/"]
COPY ["Api.Permissions.Services/Api.Permissions.Services.csproj", "Api.Permissions.Services/"]
RUN dotnet restore "Api.Permissions/Api.Permissions.csproj"
COPY . .
WORKDIR "/src/Api.Permissions"
RUN dotnet build "Api.Permissions.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Api.Permissions.csproj" -c Release -o /app/publish

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

【讨论】:

以上是关于.Net 6 Web Api docker 端口转发问题的主要内容,如果未能解决你的问题,请参考以下文章

web api与webservice(转)

在同一个端口上运行 Angular 和 ASP.NET Web API

在 Elastic Beanstalk 上使用 Docker 部署 .NET Core Web API

使用 docker 将代码覆盖率结果添加到 Azure Pipelines for .NET6 Web API

无法从 NET Core 2.2 Web API 连接到 docker sql server

在不同的端口上运行 Angular UI 和 Asp.net Web Api