Я играюсь с Docker и пытаюсь его изучить. Моя цель — создать настройку микросервиса с несколькими основными API .net и интерфейсом Angular.
Я начал с 1 API. Я создал файл dockerfile и файл docker-compose.
мой докер-файл:
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER app
WORKDIR /app
EXPOSE 8080
EXPOSE 8081
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["Api/Api.csproj", "Api/"]
RUN dotnet restore "./Api/./Api.csproj"
COPY . .
WORKDIR "/src/Api"
RUN dotnet build "./Api.csproj" -c $BUILD_CONFIGURATION -o /app/build
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Api.dll"]
Мой файл для создания докера:
version: '3.4'
services:
todo.api:
image: todoapi
container_name: todo.api
build:
context: ./TestProject.Service.Todo
dockerfile: Api/Dockerfile
ports:
- "5000:5000"
- "5001:5001"
Всякий раз, когда я запускаю docker-compose, он запускается и без проблем создает контейнер, но когда я пытаюсь получить доступ к методу API «WeatherForecast», который добавляется по умолчанию в проект API, я не могу получить к нему доступ.
Когда я запускаю Visual Studio с опцией Docker, она также без проблем создает контейнер, и я могу без проблем получить доступ к методу API «WeatherForecast».
В настоящее время я не вижу, что не так с моей текущей базовой настройкой. Может ли кто-нибудь помочь мне обнаружить проблему?
Я погуглил эту проблему, но, похоже, не нашел рабочего решения моей проблемы.
Спасибо! В настоящее время у меня еще нет подключенного к нему интерфейса. Я просто хотел убедиться, что могу открыть API через браузер, но у меня появляется ошибка «Этот сайт недоступен».
Хорошо, но вы не говорите, как именно вы это делаете :-) http://??? Ваш URL?
Я захожу на localhost:5001/weatherforecast





Есть несколько вещей, которые могут вызвать это
Одна из проблем, с которой вы наверняка столкнулись, заключается в том, что доккеризованные приложения .NET 8 прослушивают порт 8080 на предмет HTTP-трафика. По умолчанию HTTPS не включен. Итак, вам нужно сопоставить порт 8080 вместо 5000 и 5001, как вы это сделали.
Другая проблема заключается в том, что Swagger по умолчанию доступен только в среде разработки (код, который его настраивает, находится в вашем файле Program.cs). Docker по умолчанию не считается разработкой, поэтому Swagger обычно недоступен.
Чтобы включить Swagger, вы можете либо изменить Program.cs, либо установить для переменной среды ASPNETCORE_ENVIRONMENT значение Development.
Если вы измените файл компоновки на
version: '3.4'
services:
todo.api:
image: todoapi
container_name: todo.api
build:
context: ./TestProject.Service.Todo
dockerfile: Api/Dockerfile
ports:
- "8080:8080"
environment:
- ASPNETCORE_ENVIRONMENT=Development
После этого вы сможете получить доступ к Swagger на http://localhost:8080/swagger и к API на http://localhost:8080/weatherforecast.
Потрясающе, это сработало, я действительно могу получить доступ к чванству! Большое спасибо. Однако дополнительный вопрос: если мне нужно несколько API .net 8, всем им нужен порт 8080, как это должно работать? Невозможно ли определить собственные порты для каждого API?
Вы можете сопоставить каждый контейнер с другим хост-портом. Если вы используете "8081:8080" для своего второго контейнера, он будет внутренне прослушивать порт 8080 (который не конфликтует с другими контейнерами), но для доступа к нему вы будете использовать порт 8081 на хосте.
круто, ты сделал мой день. Также это задокументировано здесь — Learn.microsoft.com/en-us/dotnet/core/compatibility/containers/…
Привет, добро пожаловать. Как вы вызываете свой API? Где ваш код интерфейса?