【问题标题】:How to do port mapping in docker when running .net core applications?运行.net核心应用程序时如何在docker中进行端口映射?
【发布时间】:2020-02-15 15:06:31
【问题描述】:

网络核心项目。我已经成功构建了这个项目。下面是我的 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 时,我收到以下消息。

托管环境:生产内容根路径:/app 正在收听 on:http://[::]:80 应用程序已启动。按 Ctrl+C 关闭。

但我无法使用以下任何网址访问我的应用程序

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

谁能帮我解决这个问题。任何帮助,将不胜感激。谢谢

【问题讨论】:

    标签: docker asp.net-core


    【解决方案1】:

    这个问题我有点晚了。

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

    您需要向 Dockerfile 添加一个与您的公开端口匹配的环境变量,如下所示。

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

    文件最后一行:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 谢谢。我这样做了,但仍然没有工作。图片可能有问题?
      • 你也暴露了端口80吗?使用-p 80:80 并尝试访问localhost:80/app
      • 是的几次。之后我删除了图像并创建了新图像
      • 我刚刚登录到容器,我可以看到所有的 dll。
      【解决方案3】:

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

      如果您想查看保存时的任何更改,只需使用卷,否则您将不得不在更改后重新启动它。

      希望对你有帮助 ;)

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          【解决方案6】:

          我将-p 80:80 放在图像名称之后,而它必须在之前!

          错误且不起作用: docker run image_name -p 80:80

          正确: docker run -p 80:80 image_name

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-04-17
            • 2020-11-21
            • 2019-11-28
            • 1970-01-01
            • 1970-01-01
            • 2021-12-05
            • 2018-07-10
            • 1970-01-01
            相关资源
            最近更新 更多