【问题标题】:Cannot access asp .net core app when run with docker on local machine, or to kubernetes在本地机器上使用 docker 或 kubernetes 运行时无法访问 asp .net 核心应用程序
【发布时间】:2019-10-11 00:36:01
【问题描述】:

我有一个非常简单的 asp.net 核心应用程序(支持 Linux 的 C# Web 应用程序),当我构建 docker 映像并尝试在本地 PC 上运行它时,会发生以下情况; 在我的镜像名为 test 的 docker 中,我键入 docker run test,此时它显示“内容根路径:/app 现在正在侦听:http://[::]:80” 即使当我输入 docker ps 时,我可以看到进程正在运行,但当我尝试导航到 localhost:80 时,我得到的只是漫长的等待,然后“无法访问此站点,localhost 拒绝连接。”

我输入了

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ec158cc3b344

这给了我容器的 IP 地址,但即使直接导航到容器我也得到“无法访问此站点 “如果我在端口 80 上导航,或者如果我尝试直接访问 IP,则“您的连接已中断”。

我还尝试完全跨过 docker 并将映像部署到 Kubernetes 以查看这是否会给我带来好运,但是当我尝试访问服务 External-IP(在本例中为 localhost)时,我得到以下信息 “此页面不工作,本地主机没有发送任何数据。”

我也试过用

kubectl get pods -o wide

并直接访问 Pod 的 IP,但这只会给我“找不到这个 10.1.0.32 页面”,例如。

如果你想知道,这是我的 dockerfile 和 kubernetes 部署 .yml

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src
COPY ["Test/Test.csproj", "Test/"]
RUN dotnet restore "Test/Test.csproj"
COPY . .
WORKDIR "/src/Test"
RUN dotnet build "Test.csproj" -c Release -o /app

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Test.dll"]
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      labels:
        app: test
    spec:
      containers:
      - name: test
        image: <DockerEndpoint>.io/test:v5 #Sorry, can't include the real endpoint!
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: test
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: test

我也明白 .net 核心以奇怪的方式工作,除非你告诉它,否则它不允许它向外界公开其端口,但这与我对 docker/kubernetes 堆栈的相对较新相结合并离开了我不知所措。

有人知道我如何制作一个 .net 核心应用程序,任何应用程序,与 docker 一起工作吗?

附:我真的在使用这样一个简单的应用程序,即使我创建一个具有 docker 支持的全新 .net 核心应用程序,并尝试立即构建和运行基本的 .net 核心应用程序,它也不起作用。我无法让它与任何 .net 核心应用程序一起工作!

【问题讨论】:

  • 对于80,它是容器中的端口,尝试 trun docker ps -ls 以找到您的容器并检查端口,例如 0.0.0.0:54413-&gt;80/tcp, 0.0.0.0:44365-&gt;443/tcp。对于此示例,您需要访问 54413 而不是 80。将结果分享给我们docker ps -ls

标签: c# docker asp.net-core kubernetes


【解决方案1】:

当它说正在侦听http://[::]:80 时,它指的是容器中的本地主机。当您尝试在计算机上运行的网络浏览器中通过http://localhost 访问它时,localhost 是您的计算机,不是容器。您需要使用容器的 IP。

根据您的描述,您似乎也尝试过,但您没有理由对此有任何问题。你要么没有得到正确的 IP,要么你做了其他不正确的事情,这里没有详细说明。

【讨论】:

  • 非常节省时间。
【解决方案2】:

您将8080 作为端口转发的目标端口,但您的应用程序正在侦听端口80。将targetport 设置更改为80,您应该能够按预期连接到您的容器化应用程序。

您可能还需要调整containerPort 设置。

【讨论】:

  • 做到了!我不会假装完全知道为什么,但似乎将服务上的目标端口更改为 80 已经解决了我的问题,我现在可以通过服务 IP 成功访问我的应用程序。我最好的理论是我在我的 Dockerfile 和 .net 核心中暴露了端口 80,就像那样,谢谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2022-07-25
  • 2021-03-05
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
相关资源
最近更新 更多