Phi*_*ens 35 asp.net docker .net-core kestrel-http-server
TL; DR:为什么aspnet核心应用程序在Docker镜像中的端口80上运行,但在docker镜像之外运行5000.
阐述
我浏览了这里的aspnet核心/ docker教程:https: //docs.microsoft.com/en-us/dotnet/core/docker/building-net-docker-images
在页面的一半,我按照规定启动应用程序:
dotnet run
Run Code Online (Sandbox Code Playgroud)
除此之外,这打印这个:
Now Listening on: http://localhost:5000
Run Code Online (Sandbox Code Playgroud)
大.这就是我的预期.本教程的下一步是从Docker镜像中启动完全相同的应用程序.
docker build -t aspnetapp .
docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp
Run Code Online (Sandbox Code Playgroud)
这导致了
Now listening on: http://[::]:80
Run Code Online (Sandbox Code Playgroud)
等待.笏?为什么aspnet核心应用程序在端口80上运行?当我直接从机器运行它时,它在端口5000上运行.没有配置文件更改.
我怀疑它与基本的docker图像有关,但是在docker中还不够熟练以跟踪它.
Oma*_*jid 62
该microsoft/aspnetcore-build容器建立在顶部
microsoft/aspnetcore容器.在该dockerhub页说:
关于港口的说明
此映像将ASPNETCORE_URLS环境变量设置为http:// +:80,这意味着如果您没有明确地在应用程序中设置URL,例如通过Program.cs中的app.UseUrl,那么您的应用程序将在端口上侦听80在容器内.
所以这是主动将端口设置为80的容器.如果需要,可以通过以下方式覆盖它Dockerfile:
ENV ASPNETCORE_URLS = http:// +:5000
此外,值得注意的是,由于您使用的是docker命令,您仍然可以http://localhost:5000直接或在容器中运行应用程序来访问应用程序.
ASL*_*LIM 17
如果没有 dockerfile,您可以在 docker 容器之外设置任何端口。( .NET Core 3.1 , .NET 5 ) 与 docker args
docker run -it --rm -p 5000:80 -p 5001:443 -e ASPNETCORE_HTTPS_PORT=https://+:5001
-e ASPNETCORE_URLS=http://+:5000 --name aspnetcore_sample aspnetapp
Run Code Online (Sandbox Code Playgroud)
更多细节:
小智 8
Windows 网络堆栈限制对 Windows Docker 容器影响很大。参考视频
docker run -it --rm -p ${host_computer_port}:${container_port} --name ${container_name} ${image_name}
Run Code Online (Sandbox Code Playgroud)
命令示例:
docker run -it --rm -p 5000:8090 --name dockerwebapp9172020c dockerwebapp9172020
Run Code Online (Sandbox Code Playgroud)
您的机器端口(5000)映射到容器端口(8090)。这并不意味着在容器中运行的应用程序侦听端口:8090。有关如何将容器端口映射到应用程序端口的信息,请参阅下面的 docker 文件。
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1903 AS base
WORKDIR /app
EXPOSE 8090
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-nanoserver-1903 AS build
WORKDIR /src
COPY ["DockerWebApp/DockerWebApp.csproj", "DockerWebApp/"]
RUN dotnet restore "DockerWebApp/DockerWebApp.csproj"
COPY . .
WORKDIR "/src/DockerWebApp"
RUN dotnet build "DockerWebApp.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "DockerWebApp.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENV ASPNETCORE_URLS http://*:8090
ENTRYPOINT ["dotnet", "DockerWebApp.dll"]
Run Code Online (Sandbox Code Playgroud)
Windows 网络堆栈限制不允许直接运行以下命令。
http://localhost:5000
Run Code Online (Sandbox Code Playgroud)
让我们继续第一个解决方法。解决方法-1 直接点击Container。(以下是 PowerShell 或命令提示符中的命令)
ps c:/>docker inspect f31e8add55af
从最后的“NETWORKS”节点找到容器的IP地址,并在浏览器中运行命令。
http://{container IP}:8090
Run Code Online (Sandbox Code Playgroud)
来自 Windows 主机的解决方法 2
我们首先找到您的机器 IP 地址。
c:\>ipconfig
Run Code Online (Sandbox Code Playgroud)
找到机器 IP 后,运行以下命令。
http://{Your Machine IP}:5000
Run Code Online (Sandbox Code Playgroud)
由于 5000 映射到容器端口(8090),并且 ASP.NET Core 应用程序也在容器内侦听 8090 端口。
如果使用的是.NET Core 2.2或更高版本,则应使用另一个映像:mcr.microsoft.com/dotnet/core/aspnet : 2.2。在这种情况下,指定ENV ASPNETCORE_URLS=http://+:5000无济于事。您仍然可以通过UseUrls("http://*:5000")在Programs.cs文件中使用来强制应用监听端口5000 。
| 归档时间: |
|
| 查看次数: |
12833 次 |
| 最近记录: |