如何在docker容器中托管asp.net核心wep api

如何在docker容器中托管asp.net核心wep api,docker,asp.net-core,asp.net-core-webapi,Docker,Asp.net Core,Asp.net Core Webapi,我最近开始学习docker,但我在使用visualstudio code在dockerwindows容器中创建一个简单的asp.net核心web api锅炉板应用程序时遇到了问题 我已经在project中设置了Docker Fie,并运行了Docker build——标记helloapi。 但是当我运行docker run-p 9000:80 helloapi时,我得到以下错误: 找不到任何兼容的框架版本 指定的框架“Microsoft.AspNetCore.App”,版本“2.1.1”为 没有

我最近开始学习
docker
,但我在使用
visualstudio code
docker
windows容器中创建一个简单的
asp.net核心web api
锅炉板应用程序时遇到了问题

我已经在project中设置了
Docker Fie
,并运行了
Docker build——标记helloapi。

但是当我运行
docker run-p 9000:80 helloapi时,我得到以下错误:

找不到任何兼容的框架版本 指定的框架“Microsoft.AspNetCore.App”,版本“2.1.1”为 没有找到。 -检查应用程序依赖项并针对安装在以下位置的框架版本: \ -或者,安装框架版本“2.1.1”

我试过很多教程和教程

我尝试了不同的docker图像用于asp.net核心和

dotnet核心版本:

 dotnet --info

.NET Core SDK (reflecting any global.json):
  Version:   2.1.402

.NET Core SDKs installed:
  2.1.402 

.NET Core runtimes installed:
  Microsoft.AspNetCore.All 2.1.4 
  Microsoft.AspNetCore.App 2.1.4 
  Microsoft.NETCore.App 2.1.4 
FROM microsoft/aspnetcore
ARG source
WORKDIR /app
EXPOSE 80
COPY ${source:-/publish} .
ENTRYPOINT ["dotnet", "HelloApi.dll"]
helloapi.csproj文件

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

</Project>

注意:我无法切换到
Linux容器
,因为docker显示了一些运行时错误,所以我使用的是
Windows容器
,而且
IIS服务器
没有依次启用Windows功能

我不知道我做错了什么

有人能告诉我在windows容器中使用
docker
托管
api
的正确方法吗


任何帮助都会很好。

我已经使用Kestrel web server成功地在docker中托管了dotnet core 2.1 WebAPI应用程序,图像和标签分别为2.1-sdk和dotnet:2.1-aspnetcore-runtime,用于多阶段构建,例如

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
FROM microsoft/dotnet:2.1-sdk AS build

希望这有帮助。

看起来像是生成的dockerfile表单,而不是引用
dotnet:2.1-aspnetcore-runtime
dotnet:2.1-sdk

尝试执行以下步骤

将下面的Dockerfile添加到解决方案文件夹

FROM microsoft/dotnet:2.1-sdk AS build-env
WORKDIR /build
COPY . /build

#Restore
RUN dotnet restore ./HelloApi.sln

RUN dotnet publish ./HelloApi/ -o /publish --configuration Release

# Build runtime image
FROM microsoft/dotnet:2.1-aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /publish/ .
ENTRYPOINT ["dotnet", "WebApp.dll"]
建造它

docker build-t app1.

运行它

docker run-p8080:80——名称appcontainer1 app1

测试一下


浏览到

看起来您所遵循的教程都是针对.NET Core 2.0的,但您的项目使用的是.NET Core 2.1

正如您(可能)所知,
Dockerfile
中的第一行定义了在哪个映像上运行应用程序。在您的情况下,您可以使用microsoft/aspnetcore
。如果你看一看图片,你会看到上面写着:

2.1及更新版本的最新图像现已在microsoft/dotnet上提供。有关迁移到2.1的更多详细信息,请参见此

单击该链接,您将进入支持.NET Core 2.1的图像的Docker Hub页面

因此,正如另一个答案中所述,您需要更改
Dockerfile
,以引用安装了.NET Core 2.1运行时的不同映像。 您可以将第一行更改为:

FROM microsoft/dotnet
这可能会使用安装了.NET Core 2.1 SDK的映像,但如果您计划将映像部署到生产环境中,则该映像将过于简单

目前的做法是使用多阶段DockerFile在容器内执行构建、测试和发布步骤。你可以看看这个。这允许您使用不同的映像库来构建和测试应用程序,但仅使用较小的运行时映像作为最终生产映像

请看一些示例,了解如何做到这一点

在查找教程时,请注意它们使用较新的.NET Core 2.1作为基础映像,或者确保您创建的任何应用程序使用与教程相同的.NET Core版本

希望有帮助

Dockerfile

docker-compose.yml

运行下面的命令


你能同时显示docker文件的内容吗?你先运行docker build吗?@SimplyGed,我已经更新了,谢谢。@MarcusHöglund,这很明显,我运行了它,我已经更新了问题中的信息。谢谢。我正在使用
windows容器
,你能分享你的工作
DockerFile
?谢谢,谢谢你提供详细信息。我会试试这个,稍后再告诉你。谢谢,下次我会试试:)
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
COPY ./SampleWebApi.csproj /SampleWebApi/
RUN dotnet restore ./SampleWebApi/SampleWebApi.csproj
COPY . ./SampleWebApi/
WORKDIR /SampleWebApi/
RUN dotnet build "SampleWebApi.csproj" -c Release -o /app/build

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "SampleWebApi.dll"]
version: '3.5'

services:
    sample-web-api:
        build: SampleWebApi/
        restart: always
        ports:
            - "7000:80"
docker-compose build
docker-compose up