自訂 Docker 映像以執行您自己的 Web 應用程式

已完成

Docker Hub 是您開始建置專屬容器化應用程式的絕佳映像來源。 您可以下載提供基本所需功能的映像,然後將您自己的應用程式「堆疊」在其頂層,建立新的自訂映像。 您可以撰寫 Dockerfile,自動化執行此程序的步驟。

在線上服飾店情節中,該公司已決定 Docker 為未來的發展方向。 下一個步驟是決定您 Web 應用程式容器化的最佳方式。 公司計劃使用 ASP.NET Core 建置許多應用程式。 您已注意到 Docker Hub 包含有此架構的基礎映像。 您想要開始使用此基礎映像,並新增其中一個 Web 應用程式的程式碼以建立新的自訂映像,來證明此概念。 您也希望此流程可輕鬆重複,以便每當您發行 Web 應用程式的新版本時,此流程就會自動執行。

在本單元中,您將了解如何建立自訂的 Docker 映像,以及如何撰寫 Dockerfile 以自動化此程序。

使用 Dockerfile 建立自訂映像

為了建立包含您應用程式的 Docker 映像,您通常會從識別「基礎映像」開始,而您要在此基礎映像中新增檔案和設定資訊。 識別適當基礎映像的流程通常會從 Docker Hub 上搜尋映像開始。 您想要一個映像,其中已包含應用程式架構,以及 Linux 發行版本 (例如 Ubuntu 或 Alpine) 的所有公用程式和工具。 例如,如果您有想要封裝至容器的 ASP.NET Core 應用程式,Microsoft 會發佈稱為 mcr.microsoft.com/dotnet/core/aspnet 的映像,其已包含 ASP.NET Core 執行階段。

您可以啟動具有基礎映像的容器,並對其進行變更,以自訂映像。 變更通常會涉及一些活動,例如將從本機檔案系統的檔案複製到容器中,以及執行各種工具和公用程式來編譯程式碼。 當您完成後,您會使用 docker commit 命令將變更儲存到新的映像。

以手動方式完成上述程序,既耗時又容易發生錯誤。 您可以使用 Bash 等指令碼語言來撰寫程序的指令碼,但 Docker 提供更有效率的方式,透過 Dockerfile 自動化映像的建立流程。

Dockerfile 是純文字檔案,包含建立映像所需的所有命令。 Dockerfile 是以專為建置和設定映像所設計的最小指令碼語言撰寫而成。 其會記載建置映像所需的作業,從基礎映像開始。

下列範例示範的 Dockerfile 會建置 .NET 6.0 應用程式並將它封裝至新的映像。

FROM mcr.microsoft.com/dotnet/sdk:6.0
WORKDIR /app
COPY myapp_code .
RUN dotnet build -c Release -o /rel
EXPOSE 80
WORKDIR /rel
ENTRYPOINT ["dotnet", "myapp.dll"]

在此檔案中,會發生下列作業:

Command 動作
FROM 下載指定的映像,並根據此映像建立新的容器。
WORKDIR 設定容器中的目前工作目錄;由後續命令所用。
複製 將主機電腦中的檔案複製到容器。 第一個引數 (myapp_code) 是主機電腦上的檔案或資料夾。 第二個引數 (.) 指定檔案或資料夾的名稱,作為容器的目的地。 在本例中,目的地是目前的工作目錄 (/app)。
RUN 在容器中執行命令。 RUN 命令的引數是命令列命令。
EXPOSE 在新映像中建立設定,此映像會指定在容器執行時,要開啟哪些連接埠。 如果容器正在執行 Web 應用程式,這對 EXPOSE 連接埠 80 很普遍。
ENTRYPOINT 指定容器啟動時應該執行的作業。 在此範例中,此命令會執行新建置的應用程式。 您指定想要執行的命令,以及其每一個作為字串陣列的引數。

依照慣例,要封裝為 Docker 映像的應用程式通常在其原始程式碼的根目錄中已經有 Dockerfile,幾乎一律名為 Dockerfile

docker build 命令會執行 Dockerfile 以建立新的映像。 此命令的語法有數個參數:

  • -f 旗標指出要使用的 Dockerfile 名稱。
  • -t 旗標會指定要建立的映像名稱,在此範例中為 myapp:v1
  • 最後一個參數 .,會針對 COPY 命令提供原始程式檔的「建置內容」:在建置程序期間需要的主機電腦檔案集。
docker build -t myapp:v1 .

在幕後,docker build 命令會建立容器、在容器中執行命令,然後認可新映像的變更。