如何从repo-docker中提取并运行docker映像



我有一个使用.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

当我从浏览器测试我的api时http://localhost:8080/api/values,它工作得很好。现在我需要从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_REPONSE">

问题出在哪里?为什么我不能在docker退出命令后运行我的WebApi。

在评论中进行了以下讨论:这里的问题是端口映射从第一个命令中的8080:80更改为第二个命令的9090:90。将映射切换回容器端口的端口80修复了作者确认的问题。

现在,我们来解释一下这里发生了什么:端口映射8080:80意味着您正在将主机环境上的端口8080映射到客户机环境中的端口80。其中来宾环境是实际的容器。

映射的主机端口部分可以任意更改,即将其从8080更改为9090即可,只要主机端口不被另一个进程占用即可。但是,对于来宾端口,情况并非如此,因为来宾端口是由容器上运行的进程决定的。因此,如果容器应用程序侦听端口80,那么将客户映射切换到端口90(在本例中发生的情况(将不起作用,因为没有任何东西在侦听。

也有可能有几个端口映射,即,如果在容器中,您的应用程序侦听的端口80和某个管理控制台侦听的端口90,那么您最终可能会有两个端口映射:比如8080:80和9090:90。

如果你想同时使用多个环境-生成多个容器,也就是说,你可以做一些类似的事情:

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

但是,请注意,最终会有两个独立的容器运行。

最新更新