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

时间:2019-10-18 15:26:02

标签: docker asp.net-core

.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 run -it locationservices时,出现以下消息。

  

托管环境:Production Content根路径:/ app现在正在监听   on:http://[::]:80应用程序已启动。按Ctrl + C关闭。

但是我无法使用以下任何URL来打我的应用

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

有人可以帮助我解决问题。任何帮助,将不胜感激。谢谢

4 个答案:

答案 0 :(得分:1)

运行容器时,必须发布端口,以便在单击localhost:someport时将请求转发到容器。这是通过在运行容器时使用--publish/-p选项来完成的:

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

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

答案 1 :(得分:1)

我有类似的问题并找到了解决方案。您可以将urls参数传递给入口点,以在某个特定端口上启动应用程序。示例:ENTRYPOINT [“ dotnet”,“监视”,“运行”,“-server.urls”,“ http://0.0.0.0:5050”]

如果要查看保存时的任何更改,请仅使用卷,否则必须在更改后重新启动它。

我希望它将对您有帮助;)

答案 2 :(得分:1)

这个问题我来晚了。

但是实际的问题是,您正在告诉docker公开哪些端口,但它们与ASP.NET Core正在侦听的端口不匹配。

您需要将Docker变量添加到与您的暴露端口相匹配的环境变量。

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

文件的最后一行:

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

然后使用 -p 4040:4040 运行容器,以将端口映射到“外部”世界。

答案 3 :(得分:0)

在容器内部,应用程序绑定到端口80上的localhost。但是,这是在容器内部 。当您尝试命中http://localhost时,localhost就是您的机器,而不是容器实例。您需要通过LAN上的IP而不是localhost来访问容器。