【问题标题】:Cannot test a simple Asp.net core web api deployed to Docker无法测试部署到 Docker 的简单 Asp.net 核心 web api
【发布时间】: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


【解决方案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"]

这有帮助吗?

【讨论】:

  • 其实我认为我们不需要那行(因为它已经通过默认端口 80 公开了 web api,我们可以将其映射到主机的端口 80,而不是从 50633 映射到 80 )。此处的目的是为来自外部的请求提供服务,无论内部使用的端口如何。但是,您的答案确实会强制在端口 50633 上(内部)进行侦听,这不是由EXPOSE 强制执行的。添加该行后,我的原始命令就可以工作了。无论如何,谢谢你。
【解决方案2】:

我不知道为什么我无法从 Docker 的论坛中搜索解决方案,但在尝试搜索 Now listening on: http://[::]:80 之后,它引导我找到了 Docker's forums here 中一个非常相似的问题的最顶部链接。

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

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

"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 而言),因为如果 docker 实际运行 web api 以侦听默认端口,http://172.30.242.85/api/values 应该可以工作80.

【讨论】:

    猜你喜欢
    • 2020-06-21
    • 2020-01-24
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 2019-02-20
    • 1970-01-01
    相关资源
    最近更新 更多