0

我有一个使用 .Net Core 创建的 WebApi。我的解决方案的根目录中有一个 .dockerfile:

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"]

我可以使用这些命令毫无问题地构建、运行和推送我的 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

当我从浏览器http://localhost:8080/api/values测试我的 api 时,它运行良好。现在我需要,从 repo 下载图像并运行 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”

问题是什么?为什么在 docker pull 命令后我无法运行我的 WebApi。

4

1 回答 1

1

以下评论中的讨论:这里的问题是端口映射从第一个命令中的 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 个彼此独立运行的独立容器。

于 2020-02-26T23:24:22.043 回答