构建的 docker 容器 .NET Core 6.0(使用 Linux 虚拟机)的镜像中没有暴露端口

问题描述 投票:0回答:2

我正在尝试运行适用于 Linux 的 .NET Core 6.0 docker 容器,但由于某种原因没有公开端口。我有一个包含多个项目的解决方案,由于我使用的是 Windows 10,因此我必须发布 .sln 并将其转换为 Linux。我正在使用这个命令:

docker build . -t backendapi

和我的 dockerfile(存在于 .sln 目录中):

FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine as build
WORKDIR /app
COPY . .
EXPOSE 7101
RUN dotnet restore
RUN dotnet publish -o /app/published-app

FROM mcr.microsoft.com/dotnet/aspnet:6.0-alpine as runtime
WORKDIR /app
COPY --from=build /app/published-app /app
ENTRYPOINT [ "dotnet", "/app/CateringApp.dll" ]
CMD ["./CateringApp", "--urls", "http://0.0.0.0:7101"]

发布文件的目录为

./CateringApp\bin\Debug\net6.0\linux-x64\publish

因此,图像构建完毕,容器正在工作(据我所知),但 localhost:7101 上没有任何内容,因此我检查了 docker 图像中的端口,并在“端口”部分看到了这一点: [![在此处输入图像描述][1]][1]

这些是容器的统计数据 [![在此处输入图像描述][2]][2]

我猜我需要更改我的 dockerfile,但我不知道还可以编辑什么。我还尝试在发布的文件夹目录中构建图像,但这根本没有成功。 [1]:https://i.stack.imgur.com/DBP2h.png [2]:https://i.stack.imgur.com/bH9s8.png

.net docker .net-core dockerfile
2个回答
2
投票

首先,命令参考说将路径放在最后

docker build
上。你的可能有用,但为了安全起见,我会这么做

docker build -t backendapi .

其次,多阶段 Dockerfile 中除最后阶段之外的所有语句均不包含在最终映像中。您可能会将每个阶段视为一个单独的 Dockerfile。所以你的EXPOSE声明应该在最后阶段而不是在第一阶段。

第三,EXPOSE 实际上并没有任何事情。它充当有关映像使用哪个端口的文档。你的情况很可能是不正确的,我们稍后会谈到。所以我会删除 EXPOSE 语句。

第四,当您同时拥有 ENTRYPOINT 和 CMD 语句时,它们将组合成一个在容器启动时运行的命令。在您的情况下,该命令最终为

dotnet /app/CateringApp.dll ./CateringApp --urls http://0.0.0.0:7101
。这可能就是您想要的,但大多数 ASP.NET 应用程序仅使用入口点中的内容来运行 DLL。

第五,来自 Microsoft 的 ASP.NET 映像将环境变量 ASPNETCORE_URLS 设置为

http://+:80
,使应用程序侦听端口 80,除非您更改它。

如果您将 Dockerfile 更改为

FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine as build
WORKDIR /app
COPY . .
RUN dotnet restore
RUN dotnet publish -o /app/published-app

FROM mcr.microsoft.com/dotnet/aspnet:6.0-alpine as runtime
WORKDIR /app
COPY --from=build /app/published-app /app
ENTRYPOINT [ "dotnet", "/app/CateringApp.dll" ]

您应该能够构建并运行它

docker build -t backendapi .
docker run -d -p 8080:80 backendapi

然后您应该能够通过 http://localhost:8080/ 访问您的应用程序

由于您的图像名称中包含“API”,我猜测您的应用程序可能基于 webapi 模板。请注意,如果您这样做了,那么 Swagger 将不可用。默认情况下,Swagger 仅当应用程序在开发环境中运行时才可用,而 Docker 容器默认情况下不是开发环境。


0
投票

对我来说,在 Windows 上添加本地主机拒绝连接问题。

我的基于下面 dockerfile 的图像在从 docker CLI 运行时出现问题。 Docker GUI 拒绝允许我在运行/可选设置下指定端口。我研究了很长时间,看看是否需要更改防火墙设置。事实上,welcome-to-docker 的例子是有效的。它使用 EXPOSE 语句,所以我添加了一个

EXPOSE 5001

作为倒数第二个项目,在我的 Dockerfile 中的入口点之前,现在可以通过以下方式访问容器:

docker run [name] -p 8000:5001
localhost:8000
© www.soinside.com 2019 - 2024. All rights reserved.