【发布时间】:2019-03-14 00:52:27
【问题描述】:
我是 Docker 新手,非常想体验它的功能。这里我想在 Docker 中运行一个简单的 Asp.net core web api(使用docker run)而不是使用 IIS 运行它。
这很简单,因为它正是默认的自动生成 ASP.NET 核心 Web API 项目,只有一个名为 ValuesController 的控制器。通常在使用 IISExpress 进行调试时,以下 URI 应该响应一个值数组:
http://localhost:[some_port]/api/values
现在我为项目添加 Docker 支持(使用 Windows 容器)。构建 Docker 镜像后,可以使用docker images 列出它。现在我运行 Docker 映像来托管我的 web api,如下所示:
docker run -t -rm -p 80:50633 hellodocker:dev
它运行正常,我可以使用docker ps 进行检查。但是为了测试它是否真的有效,我尝试在浏览器中输入以下地址:
http://localhost/api/values
它不工作,什么都没有显示,看起来就像一个不存在的网站。
当我尝试以下命令docker exec [container_id] netstat 时,它有时会显示一条状态为TIME_WAIT 的记录,几乎没有任何记录。虽然我不确定这是否与外部聆听有关。
这是 Dockerfile 的内容:
FROM microsoft/dotnet:2.2-aspnetcore-runtime-nanoserver-1803 AS base
WORKDIR /app
EXPOSE 50633
EXPOSE 44322
FROM microsoft/dotnet:2.2-sdk-nanoserver-1803 AS build
WORKDIR /src
COPY HelloDocker/HelloDocker.csproj HelloDocker/
RUN dotnet restore HelloDocker/HelloDocker.csproj
COPY . .
WORKDIR /src/HelloDocker
RUN dotnet build HelloDocker.csproj -c Release -o /app
FROM build AS publish
RUN dotnet publish HelloDocker.csproj -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "HelloDocker.dll"]
我真的被困在这个问题上。一个 hello-world 应用程序可能只是打印出一个简单的字符串,但这个 hellodocker 应该托管在 docker 中并像我们在 IIS 中托管它一样处理任何 HTTP 请求。
更新
在尝试删除已构建的映像并改为重建另一个映像后,使用上面相同的 docker run 命令运行后看起来有所不同:
Hosting environment: Production
Content root path: C:\app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.
和之前一样没有显示,提示根路径变为C:\app。
所以这一次看起来更明显的是它正在监听请求。但是还是不行。
【问题讨论】:
-
hello-world 服务器的默认端口是什么?你确定是
50633? -
@Jack Gore 我不太确定,这就是我根据
dockerfile假设的,你可以看到 EXPOSE 50633 行
标签: .net docker asp.net-web-api asp.net-core