Как вытащить и запустить docker образ из репо - Docker - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть WebApi, созданный с использованием. Net Core. У меня есть .dockerfile в root моего решения:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:2.1-stretch AS build

WORKDIR /src
COPY ["Nuget.config", ""]
COPY ["Proyecto.WebApi/Proyecto.WebApi.csproj", "Proyecto.WebApi/"]
COPY ["Proyecto.Model/Proyecto.Model.csproj", "Proyecto.Model/"]
COPY ["Proyecto.Bl/Proyecto.Bl.csproj", "Proyecto.Bl/"]

RUN dotnet restore "Proyecto.WebApi/Proyecto.WebApi.csproj" --configfile "Nuget.config"
COPY . .

WORKDIR "/src/Proyecto.WebApi"
RUN dotnet build "Proyecto.WebApi.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Proyecto.WebApi.csproj" -c Release -o /app/publish

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

Я могу построить, запустить и запустить sh мой Api без проблем, используя эти команды:

docker build -t dockerlocal .
docker run -d -p 8080:80 --name myapp dockerlocal
docker tag <image_id> docker.nexus.example.com/dockerlocal
docker push docker.nexus.example.com/dockerlocal

Когда я тестирую мой API из браузера http://localhost: 8080 / api / values ​​, он работает отлично. Теперь мне нужно, загрузить образ из репозитория и запустить Api, поэтому я выполняю:

docker pull docker.nexus.example.com/dockerlocal
docker run -d -p 9090:90 --name mynexusapp docker.nexus.example.com/dockerlocal

По консоли все работает. Но когда я тестирую API http://localhost: 9090 / api / values ​​, я получаю в своем браузере: "localhost no envió ningún dato. ERR_EMPTY_RESPONSE"

В чем проблема? Почему я не могу запустить свой WebApi после docker команды извлечения.

1 Ответ

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

После обсуждения в комментариях проблема заключалась в том, что отображение портов было изменено с 8080: 80 в первой команде на 9090: 90 во второй команде. Переключение обратно на порт 80 для порта контейнера устраняет проблему, подтвержденную автором.

Теперь, чтобы объяснить, что здесь происходит: Отображение порта 8080: 80 означает, что вы отображаете порт 8080 в среде хоста на порт 80 на гостевой среде. Там, где гостевая среда является фактическим контейнером.

Часть отображения хост-порта может быть произвольно изменена - т. Е. Изменение ее с 8080 на 9090 работает - до тех пор, пока порт хоста не будет занят другим процессом. Однако то же самое не относится к гостевому порту, поскольку гостевой порт определяется процессом, который выполняется в контейнере. Поэтому, если контейнерное приложение прослушивает порт 80, переключение гостевого сопоставления на порт 90 (как это произошло в этом случае) не будет работать - потому что там ничего не прослушивается.

Также вполне возможно иметь несколько портов отображение, т. е. если в контейнере имеется порт 80, где ваше приложение слушает, и порт 90, где слушает консоль администратора, вы можете получить 2 сопоставления портов: скажем, 8080: 80 и 9090: 90.

Если вы хотите использовать несколько сред одновременно - порождать несколько контейнеров, то есть вы можете сделать что-то вроде:

docker run -d -p 8080:80 --name myapp1 dockerlocal
docker run -d -p 9090:80 --name myapp2 dockerlocal

Обратите внимание, что в итоге вы получите 2 отдельных контейнера, работающих независимо друг от друга.

...