无法测试部署到Docker的简单Asp.net核心Web API?

时间:2019-03-14 00:52:27

标签: .net docker asp.net-web-api asp.net-core

我是docker的新手,真的想体验它的功能。 在这里,我想在docker中(使用docker run运行(托管)一个简单的Asp.net核心Web api,而不是使用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。 因此,这次看起来更明显是在侦听请求。但是,它仍然不起作用:(

2 个答案:

答案 0 :(得分:1)

在您的ENTRYPOINT语句之前,尝试添加

 ENV ASPNETCORE_URLS=http://+:50633 DOTNET_RUNNING_IN_CONTAINER=true 

所以看起来像这样:

FROM base AS final WORKDIR /app COPY --from=publish /app . ENV ASPNETCORE_URLS=http://+:50633 DOTNET_RUNNING_IN_CONTAINER=true ENTRYPOINT ["dotnet", "HelloDocker.dll"]

有帮助吗?

答案 1 :(得分:0)

看起来我应该已经在所有Docker专家都更感兴趣的Docker论坛中发布了这个问题(与本领域的SO相比)。 不确定为什么我无法从Docker论坛中搜索解决方案,但是尝试搜索Now listening on: http://[::]:80之后,它导致我在https://forums.docker.com/t/unable-to-launch-the-net-core-website-in-docker/48129的docker论坛中找到了一个非常相似的问题的高层链接。 / p>

因此,我尝试使用一种解决方案,首先使用docker inspect [container_id]查找容器的IP,然后使用该IP成功访问Web API:)

可以在Networks部分中找到容器的IP:

"Networks": {
            "nat": {
                "IPAMConfig": null,
                "Links": null,
                "Aliases": null,
                "NetworkID": "e336becc4500435f7338ebd8f84fef47ec2fc247f77bc82b6dbf49553f68afd5",
                "EndpointID": "a8ede68e3f4bb02392c295901f65d50f0ee014c114f564768d9c82a4644b0218",
                "Gateway": "172.30.240.1",
                "IPAddress": "172.30.242.85",
                "IPPrefixLen": 16,
                "IPv6Gateway": "",
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "MacAddress": "00:15:5d:5a:29:8d",
                "DriverOpts": null
            }
        }

我现在用来测试Web api的正确地址是:

http://172.30.242.85/api/values

更新

我假设EXPOSE 50633意味着Docker将通过端口50633公开Web api,因此我运行命令docker run -t -p 80:50633 hellodocker:dev

但是实际上它在这里公开的端口仍然是默认的80(不确定原因)。但这至少是有道理的。因此,要映射docker和主机之间的端口,我们使用命令docker run -t -p:80:80 hellodocker:dev。 我已经尝试过了,它非常适合http://localhost/api/values

我认为docker run -t -p:80:50633 hellodocker:dev之前使用的命令具有无用的端口映射(至少用于测试来自主机的Web api),因为如果码头工人实际运行Web api来监听,http://172.30.242.85/api/values应该可以工作在默认端口80上。