【问题标题】:Multi-Container Docker Application - Internal Rest API Communication多容器 Docker 应用程序 - 内部 Rest API 通信
【发布时间】:2020-03-07 21:16:48
【问题描述】:

我创建了一个多容器 docker 应用程序,该应用程序托管在使用 docker compose 的 azure Linux 应用程序服务上,跨从 azure 容器注册表中提取的图像。

我的应用程序由一个 Web 应用程序前端以及目前的 3 个 API 项目组成。我已经部署了所有这些应用程序,但在让 Web 应用程序与 API 通信时遇到问题。由于我最近才部署了 Web 应用程序和其他应用程序,因此我一直在使用我的 localhost 端点进行 API 调用。这可以很好地使用我的前端测试 API 的功能,但是当我现在正在部署我的项目时,我需要与容器内的服务进行通信,但是我尝试的一切似乎都没有按预期工作,导致在 500 内部服务器错误中。

我的 docker-compose 文件如下:

version: "3.7"
services:

  webapp:
    image: {MyApp}.azurecr.io/{ProjectName}:dev
    ports:
      - "80:80"
    networks:
      {ProjectName}-net:
        ipv4_address: 172.28.1.1
    depends_on:
      - {App1}.api
      - {App2}.api
      - {App3}.api

  {App1}.api:
    image: {MyApp}.azurecr.io/{App1}api:dev
    container_name: {App1}
    ports: 
      - "2000:2000"
    networks:
      {ProjectName}-net:
        ipv4_address: 172.28.1.2
    depends_on:
      - xamlbuilder.api

  {App2}.api:
    image: {MyApp}.azurecr.io/{App2}:dev
    container_name: {App2}
    ports:
      - "3000:3000"
    networks:
      {ProjectName}-net:
        ipv4_address: 172.28.1.3

  {App3}.api:
    image: {MyApp}.azurecr.io/{App3}:dev
    container_name: {App3}
    ports: 
      - "4000:4000"
    networks:
      {ProjectName}-net:
        ipv4_address: 172.28.1.4

networks:
  {ProjectName}-net:
    ipam:
      driver: bridge
      config:
        - subnet: 172.28.0.0/16

DockerFile(网络应用):

FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
WORKDIR /source

COPY . .
RUN dotnet restore

RUN dotnet publish --output /app/ --configuration Release --no-restore

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
WORKDIR /app
COPY --from=build /app .

ENTRYPOINT ["dotnet", "{ProjectName}.WebApp.dll"]
EXPOSE 80

Dockerfile {App1}

FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
WORKDIR /source

COPY . .
RUN dotnet restore

RUN dotnet publish --output /app/ --configuration Release --no-restore

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
WORKDIR /app
COPY --from=build /app .

ENTRYPOINT ["dotnet", "{ProjectName}.{App1}.API.dll"]
EXPOSE 2000

(其他应用都是类似的dockerfile)

我最近的尝试是添加网络配置和静态 IP 地址,因为我们无法让它工作。我不知道这个问题是否与我的端点有关(我尝试用各种端点替换我的 localhost 端点 - URL/app1:portNumber/Methods、URL/app1/Methods、IPAddress:portNumber/Methods、IPAddress/Methods等)。

任何人都可以看到任何明显的东西吗?我只是使用了错误的端点还是 compose/dockerfile/config 问题?

非常感谢您的指导!

【问题讨论】:

  • 它在你的本地机器上运行成功了吗?
  • 不是在我尝试使用容器端点时。仅当我使用 localhost 并在本地运行服务时
  • 你的意思是它在本地运行良好,但当你部署到带有容器的 azure web 应用程序时就不好?
  • 是的,没错
  • 我尝试用各种端点替换我的 localhost 端点 哇...你知道 localhost 是计算机连接到自身的环回接口吗?在 Docker 中,您通常使用容器名称作为主机,因此 http://{App1}:{yourEXPOSEDport}/app1/Methods。暴露的端口不必与应用程序在容器中启动的端口相同,请参阅您的作曲家文件。 "4000:4000" 表示将容器端口 4000 重定向到外部端口 4000,因此您也需要在 URL 中调用它。或更改暴露的端口

标签: azure api docker asp.net-core docker-compose


【解决方案1】:

我从您提供的 docker-compose 文件中看到,您在其中设置了 networks 属性。但目前 Azure Web App for Container 不支持 networks 属性。使用它时可能会导致问题,但 Azure Web App 会忽略它。请参阅Docker Compose options 以了解哪些支持,哪些不支持。

此外,Azure Web App 仅支持将端口 80 或 443 公开给 Internet。您不能将文件中的其他端口(例如 3000 和 2000)暴露给 Internet。

你可以看看Create a multi-container (preview) app in Web App for Containers的例子。我觉得对你有帮助。

【讨论】:

    猜你喜欢
    • 2022-11-16
    • 1970-01-01
    • 2018-11-07
    • 2018-03-12
    • 2017-12-21
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    相关资源
    最近更新 更多