运行.net核心应用程序时如何在docker中进行端口Map?

jvlzgdj9  于 2022-12-03  发布在  Docker
关注(0)|答案(6)|浏览(147)

net的核心项目。我已经成功地建立了该项目。下面是我的dockerfile。

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 4040
EXPOSE 5050

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ["MWS.AspNetCoreApis/MWS.AspNetCoreApis.csproj", "MWS.AspNetCoreApis/"]
RUN dotnet restore "MWS.AspNetCoreApis/MWS.AspNetCoreApis.csproj"
COPY . .
WORKDIR "/src/MWS.AspNetCoreApis"
RUN dotnet build "MWS.AspNetCoreApis.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "MWS.AspNetCoreApis.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
CMD tail -f /dev/null
ENTRYPOINT ["dotnet", "MWS.AspNetCoreApis.dll"]

我构建我的应用程序为docker build -t locationservices .在这里我构建我的图像。然后当我运行我的图像使用docker run -d locationservices它给一些长的id。当我试图点击http://localhost:40/swagger/index.htmlhttp://localhost:5050/swagger/index.html我的网页没有打开。当我运行〉docker运行-it位置服务我得到下面的消息。
宿主环境:生产内容根路径:/app正在侦听:http://[::]:80应用程序已启动。请按Ctrl+C关闭。
但我无法使用以下任何URL访问我的应用程序

http://localhost:5050/swagger/index.html
http://localhost:4040/swagger/index.html
http://localhost:80/swagger/index.html

有人能帮我解决这个问题吗?任何帮助都将不胜感激。谢谢

kmb7vmvb

kmb7vmvb1#

我回答这个问题有点晚了。
但实际的问题是,您告诉Docker要公开哪些端口,但它们与ASP .NETCore正在侦听的端口不匹配。
您需要将一个环境变量添加到与您的公开端口相匹配的Dockerfile中,如下所示。

EXPOSE 4040
ENV ASPNETCORE_URLS=http://*:4040

文件的最后一行:

ENTRYPOINT ["dotnet", "myapp.dll"]

然后使用**-p 4040:4040**运行容器,这样它就可以将端口Map到“外部”世界。

fnx2tebb

fnx2tebb2#

您还可以将Docker容器运行参数直接添加到.csproj文件中:

<PropertyGroup>
    <DockerfileRunArguments>-p "4040:443" -p "5050:80"</DockerfileRunArguments>
</PropertyGroup>
i86rm4rw

i86rm4rw3#

我把-p 80:80后的图像名称时,它必须之前!
错误和不起作用:docker run image_name -p 80:80
正确:docker run -p 80:80 image_name

gdx19jrr

gdx19jrr4#

在运行容器时必须发布端口,这样当您点击localhost:someport时,请求将被转发到容器。这可以通过在运行容器时使用--publish/-p选项来完成:

docker run -d -p 4040:4040 -p 5050:5050 locationservices

现在您可以访问localhost:5050/swagger/index.htmllocalhost:4040/swagger/index.html

m4pnthwp

m4pnthwp5#

我有类似的问题,并找到了解决方案。你可以传递urls参数到你的入口点,以启动应用程序在一些特定的端口。例如:[“dotnet”,“监视”,“运行”,“--服务器. url”,“http://0.0.0.0:5050“]
如果你想在保存时看到任何更改,只需使用卷,否则你将不得不在更改后重新启动它。
我希望它会帮助你;)

vcudknz3

vcudknz36#

在容器内部,应用绑定到端口80上的localhost。然而,这是在容器 * 内部 *。当你试图点击http://localhost时,该上下文中的localhost是你的机器,而不是容器示例。你需要通过LAN上的IP访问容器,而不是localhost

相关问题