簡體   English   中英

如何從存儲庫中提取和運行 docker 鏡像 - Docker

[英]How to pull and run a docker image from a repo - 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

當我從瀏覽器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。

以下評論中的討論:這里的問題是端口映射從第一個命令中的 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 個彼此獨立運行的獨立容器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM