如何从存储库中提取和 运行 docker 图像 - Docker
How to pull and run a docker image from a repo - Docker
我有一个使用 .Net Core 创建的 WebApi。我的解决方案的根目录中有一个 .docker 文件:
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 拉命令后我不能 运行 我的 WebApi。
以下评论中的讨论:这里的问题是端口映射从第一个命令中的 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 个单独的容器 运行 彼此独立。
我有一个使用 .Net Core 创建的 WebApi。我的解决方案的根目录中有一个 .docker 文件:
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 拉命令后我不能 运行 我的 WebApi。
以下评论中的讨论:这里的问题是端口映射从第一个命令中的 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 个单独的容器 运行 彼此独立。