簡體   English   中英

無法測試部署到 Docker 的簡單 Asp.net 核心 Web api

[英]Cannot test a simple Asp.net core web api deployed to Docker

我是 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應該托管在hellodocker中,並像我們在 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 所以這一次看起來更明顯的是它正在偵聽請求。 但是,它仍然無法正常工作。

在您的 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"]

這有幫助嗎?

我不知道為什么我無法從 Docker 的論壇中搜索解決方案,但是在嘗試搜索Now listening on: http://[::]:80 ,它讓我找到了一個非常相似的鏈接Docker 論壇中的問題

所以我在那里嘗試了一種解決方案,首先使用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意味着EXPOSE 50633將通過端口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之前使用的命令docker run -t -p:80:50633 hellodocker:dev用的端口映射(至少對於從主機測試 web api),因為http://172.30.242.85/api/values應該如果 docker 實際運行 web api 以偵聽默認端口80

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM