Azure мультиконтейнер службы приложений - HTTP-запрос к внутреннему контейнеру (docker compose) - PullRequest
0 голосов
/ 26 февраля 2020

Я развернул службу приложений с несколькими контейнерами в Azure, используя docker compose file (preview).

Веб-приложение предоставляет порт 80, так что если я go - https://myproj.azurewebsites.net/ отображается веб-приложение (это единственный доступный порт c).

Что я хотел бы сделать сейчас, так это уметь отправлять http-запрос из Интернета на мой API, который другой контейнер размещен внутри. Я пробовал разные URL, но не могу сделать успешный запрос. Контейнер API успешно запускается, поэтому в этом нет ничего плохого, я просто не знаю, какой адрес использовать.

OrderApi Dockerfile

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

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["MyProj.OrderApi/MyProj.OrderApi.csproj", "MyProj.OrderApi/"]
COPY ["nuget.config", "MyProj.OrderApi/"]
RUN dotnet restore "v.OrderApi/MyProj.OrderApi.csproj" --configfile "MyProj.OrderApi/nuget.config"
RUN rm "MyProj.OrderApi/nuget.config"
COPY . .
WORKDIR "/src/MyProj.OrderApi"
RUN dotnet build "MyProj.OrderApi.csproj" -c Release -o /app/build

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

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

Docker файл составления, используемый в производстве (Azure)

version: '3.4'

services:
web:
    image: myproj.azurecr.io/myproj/web
    ports:
    - '80:80'

orderapi:
    image: myproj.azurecr.io/myproj/orderapi

Проверенные конечные точки

https://localhost/orderapi/api - ERR_CONNECTION_REFUSED

http://localhost/orderapi/api - заблокировано политикой CORS (я уверен, что cors правильно настроен в API)

https://host.docker.internal/orderapi/api - ERR_CONNECTION_TIMED_OUT

orderapi / api - добавляет текущий сайт как baseurl .. пытается отправить запрос на https://mysite.azurewebsites.net/orderapi/api

http://host.docker.internal/orderapi/api - этот запрос был заблокирован ; контент должен обслуживаться через HTTPS

host. docker .internal / orderapi / api - добавляет текущий сайт в качестве baseurl. Пытается отправить запрос на https://mysite.azurewebsites.net/host.docker.internal/orderapi/api

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

К сожалению, веб-приложение Azure для контейнеров может предоставлять Inte rnet только один контейнер. Это означает, что при развертывании нескольких контейнеров в веб-приложении вы можете получить доступ только к одному контейнеру из Inte rnet. См. Подробности о Как узнать, какой контейнер inte rnet доступен в Мульти-контейнер с Docker Compose .

Обновление:

Когда вы устанавливаете службу таким образом в вашем docker -компонентном файле:

redis:
  image: redis
  container_name: rediscache

Далее приведен пример кода для подключения контейнера redis:

[Route("api/[controller]")]
[ApiController]
public class NewsController : ControllerBase
{
    // GET api/values
    [HttpGet]
    public async Task<ActionResult<IEnumerable<string>>> Get()
    {
        ConnectionMultiplexer connection = await ConnectionMultiplexer.ConnectAsync("redis");
        var db = connection.GetDatabase();

        //code to parse the XML
    }
}
0 голосов
/ 26 февраля 2020

В файле docker, orderapi не раскрывает порт. Если никакой порт не выставляется, нет способа, которым он мог бы обрабатывать запросы.

Обычно браузер получает html и отправляет запрос непосредственно в API.

Возможно, orderapi должен выставлять другие порт (например, 88), чтобы браузер мог использовать данные из API, используя этот порт.

...