【问题标题】:Cannot assign requested address (localhost:xxxx) - Docker + Linux Containers无法分配请求的地址 (localhost:xxxx) - Docker + Linux 容器
【发布时间】:2021-05-19 20:31:08
【问题描述】:

我们有一个 WPF 应用程序,它将调用一个名为 API-1 的 Web API,它在 docker 容器中运行。我还有另一个名为 API-2 的 API,它也在 docker 中运行,但在不同的容器中运行。

每当应用程序调用 API-1 时,API-1 都会执行一些逻辑并尝试向 API-2 发出 post 请求。

现在,我的问题是,对 API-2 的发布请求总是返回 Cannot assign requested address (localhost:XXXX)。

如果我尝试不使用 docker,它可以正常工作。 此外,对每个 API 的单独请求都可以正常工作(使用 POSTMAN)

仅当 API 部署在 docker 中时才会出现此问题。我正在使用 docker-compose 创建容器。我创建了一个 docker 网桥并将其分配给 docker-compose.yml 文件中的相应 API。

这是我的 docker-compose 文件以及两个 API 的 docker 文件。

Docker-Compose.yml

version: "3.7"

networks : 
  localdev:
    name: localdev
    external: true

services:
  api-01:
    build:
      context: .
      dockerfile: api-01/Dockerfile
    restart: always
    container_name: "api-01"
    ports:
       - "8082:80"
    environment:
      ASPNETCORE_ENVIRONMENT: "Development"
    networks:
     - localdev

  api-02:
    build:
      context: .
      dockerfile: api-02/Dockerfile
    restart: always
    container_name: "api-02"
    ports:
       - "8083:80"
    environment:
      ASPNETCORE_ENVIRONMENT: "Development"
    networks:
     - localdev

DockerFile(API-1)

FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY ["api-01/api-01.csproj", "api-01/"]
COPY ["CommonEntities/CommonEntities.csproj", "CommonEntities/"]
RUN dotnet restore "api-01/api-01.csproj"
COPY . .
WORKDIR "/src/api-01"
RUN dotnet build "api-01.csproj" -c Release -o /app/build

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "api-01.dll"]

DockerFile(API-2)

来自 mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS 基础 工作目录 /app 曝光 80

FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY ["api-02/api-02.csproj", "api-02/"]
COPY ["CommonEntities/CommonEntities.csproj", "CommonEntities/"]
RUN dotnet restore "api-02/api-02.csproj"
COPY . .
WORKDIR "/src/api-02"
RUN dotnet build "api-02.csproj" -c Release -o /app/build

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "api-02.dll"]

我不确定我在这里缺少什么! 我已经尝试了互联网上的大多数解决方案,但没有任何效果。

【问题讨论】:

  • 其他服务的位置在哪里配置?在 Docker 中,localhost 几乎总是意味着“这个容器”而不是另一个容器,即使它们在同一个物理系统上; Docker 文档中的Networking in Compose 描述了可用于连接容器之间的主机名。
  • @DavidMaze - 你是对的。如果我想从不同容器中的 API 调用 API,我需要使用 {DOCKER_IP} 而不是 localhost。

标签: docker asp.net-core docker-compose dockerfile docker-networking


【解决方案1】:

如果我想在两个不同容器中的两个 API 之间进行通信,我似乎需要使用 {DOCKER_IP} 而不是“localhost”。

在我将发帖请求更改为点击“http://{My_PC_IP_Address}:8082”后,请求成功。

感谢 David 将我重定向到正确的文档 https://docs.docker.com/network/bridge/

【讨论】:

    猜你喜欢
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    相关资源
    最近更新 更多