【问题标题】:Can't connect from Vue to .NET Core API on Docker无法从 Vue 连接到 Docker 上的 .NET Core API
【发布时间】:2022-01-20 10:46:38
【问题描述】:

我必须从 Vue 前端解决方案向 .NET Core (3.1) 后端 API 发出请求。正常运行它(没有 Docker),没有任何问题,但我必须(单独)将它们 dockerize 并使它们工作,这是我做不到的。

Vue Dockerfile:

# base image
FROM node:12.2.0-alpine

# set working directory
WORKDIR /app

# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH

# install and cache app dependencies
COPY package.json /app/package.json
RUN npm install

# start app
CMD ["npm", "run", "serve"]

Vue Docker 运行命令:

docker run -v ${PWD}:/app -v /app/node_modules -p 8081:8080 --rm dockerized-vue:front

.NET Dockerfile:

# syntax=docker/dockerfile:1
FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy rest of the files
COPY . .

# Build
RUN dotnet publish -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "MyApp.dll"]

.NET Docker 运行命令:

docker run -p 8082:8080 --rm dockerized-netcore:back

.NET Core 启动设置.json:

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:58726",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "myapp",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "MyApp": {
      "commandName": "Project",
      "launchUrl": "myapp",
      "applicationUrl": "http://localhost:8082",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

我将请求从 Vue 发送到

http://localhost:8082/api/MyEndpoint

还必须补充一点,我最初使用端口 5000 进行本地测试(没有 docker)但我决定更改为端口 8082,因为 Docker 告诉我端口 5000 已经在使用中(不知道为什么...)

谢谢。

【问题讨论】:

  • 您是通过 vue 应用从 vue 应用的容器还是从浏览器发送指定的请求?
  • 另外,你为什么在你的 web api 中转发到 8080 而不是端口 80?
  • @4ng3L 您可能引用了容器的 localhost 而不是主机 localhost,请尝试使用您指定的主机 IP 地址和端口 8082 从 Vue 应用程序连接.NET 后端

标签: .net docker api vue.js


【解决方案1】:

在您用作图像基础的 aspnet 图像中,Microsoft 将 ASPNETCORE_URLS 环境变量设置为 http://+:80,这会覆盖您的启动设置文件。

这意味着您应该像这样将主机上的端口映射到图像中的端口 80

docker run -p 8082:80 --rm dockerized-netcore:back

确定应用程序正在监听哪个端口的好方法(因为有很多方法可以设置它,所以很难确定哪个设置获胜)是运行命令docker logs <container name>。然后你会看到这样的东西

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://[::]:80
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /app

在这里你可以看到它正在监听哪个端口。

【讨论】:

  • 就是这样!谢谢你(再次:D)@HansKilian 第一次使用 Docker,这些信息帮助我更好地理解它,而不仅仅是让它工作。
猜你喜欢
  • 2020-01-11
  • 2019-11-24
  • 2021-06-21
  • 1970-01-01
  • 2019-07-10
  • 2019-08-11
  • 2021-01-02
  • 2019-05-30
  • 2021-03-27
相关资源
最近更新 更多