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

已完成

Dockerfile 包含建置自訂 Docker 映像的步驟。

您決定使用 Docker 部署您組織的其中一個 Web 應用程式。 您選取的簡單 Web 應用程式會實作旅館訂房網站的 Web API。 Web API 公開 HTTP POST 和 GET 作業,建立並擷取客戶的訂房記錄。

注意

在這個版本的 Web 應用程式中,不是真的保留訂房記錄,所以查詢會傳回虛擬資料。

在此練習中,您會為沒有 Dockerfile 的應用程式建立 Dockerfile。 然後,建置映像並在本機執行。

建立 Web 應用程式的 Dockerfile

  1. 如果尚未執行的話,請在電腦上啟動 Docker。

  2. 在本機電腦的命令提示字元視窗中,執行下列命令,下載 Web 應用程式的原始程式碼。

    git clone https://github.com/MicrosoftDocs/mslearn-hotel-reservation-system.git
    
  3. 輸入下列命令以開啟 src 目錄。

    cd mslearn-hotel-reservation-system/src
    
  4. src 目錄中,輸入下列命令建立一個名為 Dockerfile 的新檔案並在記事本中將其開啟:

    copy NUL Dockerfile
    notepad Dockerfile
    

    注意

    根據預設,記事本命令會開啟文字檔。 請確定您將其儲存為不帶檔案副檔名的檔案類型所有檔案。 若要確認,請在檔案總管中開啟 src 資料夾,然後選取 [檢視 > 顯示 > 副檔名]。 如有必要,請重新命名檔案,並從檔案名稱中移除 .txt

  5. 將下列代碼新增到 Dockerfile 中:

    FROM mcr.microsoft.com/dotnet/core/sdk:2.2
    WORKDIR /src
    COPY ["/HotelReservationSystem/HotelReservationSystem.csproj", "HotelReservationSystem/"]
    COPY ["/HotelReservationSystemTypes/HotelReservationSystemTypes.csproj", "HotelReservationSystemTypes/"]
    RUN dotnet restore "HotelReservationSystem/HotelReservationSystem.csproj"
    

    此代碼具有擷取包含 .NET Core Framework SDK 的映像的命令。 Web 應用程式 (HotelReservationSystem.csproj) 與程式庫專案 (HotelReservationSystemTypes.csproj) 的專案檔已複製到容器的 /src 資料夾。 dotnet restore 命令會從 NuGet 下載這些專案所需的相依性。

  6. 將下列代碼附加到 Dockerfile 的底部:

    COPY . .
    WORKDIR "/src/HotelReservationSystem"
    RUN dotnet build "HotelReservationSystem.csproj" -c Release -o /app
    

    這些命令會將 Web 應用程式的原始程式碼複製到容器,然後執行 dotnet build 命令來建置應用程式。 產生的 DLL 會寫入容器的 /app 資料夾。

  7. 在 Dockerfile 底部附加下列命令。

    RUN dotnet publish "HotelReservationSystem.csproj" -c Release -o /app
    

    dotnet publish 命令會將網站的可執行檔複製到新資料夾,並移除任何過渡檔案。 然後,此資料夾中的檔案會部署至網站。

  8. 將下列命令附加到 Dockerfile 的底部。

    EXPOSE 80
    WORKDIR /app
    ENTRYPOINT ["dotnet", "HotelReservationSystem.dll"]
    

    第一個命令會在容器中開啟連接埠 80。 第二個命令會移至包含 Web 應用程式已發行版本的 /app 資料夾。 最後一個命令指定當容器執行它時,應該執行命令 dotnet HotelReservationSystem.dll。 此程式庫包含 Web 應用程式的已編譯程式碼。

  9. 儲存檔案並關閉文字編輯器。 請確定您將其儲存為不帶檔案副檔名的檔案類型所有檔案

使用 Dockerfile 建置及部署映像

  1. 在命令提示字元中,執行下列命令以 Dockerfile 建置範例應用程式的映像。 不要忘記命令結尾的 .。 此命令會建置映像,並將它儲存在本機。 映像的名稱為 reservationsystem。 驗證映像是否建置成功。 程序完成時,會顯示檔案和目錄權限的相關警告。 基於本練習的目的,您可以忽略這些警告。 該映像可能需要一些時間來建置。

    docker build -t reservationsystem .
    
  2. 執行下列命令,驗證映像是否已建立並儲存在本機登錄中:

    docker image list
    

    映像的名稱會是 reservationsystem。 您也會有名為 microsoft/dotnet 的映像:

    REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
    reservationsystem   latest              d2501f0f2ced        About a minute ago   1.76GB
    

測試 Web 應用程式

  1. 輸入下列代碼,以使用 reservationsystem 映像執行容器。 Docker 會傳回長度為十六進位數字的字串。 容器會在背景中執行,而不需要任何 UI。 容器中的連接埠 80 會對應至主機電腦連接埠 8080。 容器名為 reservations

    docker run -p 8080:80 -d --name reservations reservationsystem
    
  2. 開啟網頁瀏覽器,並巡覽至 http://localhost:8080/api/reservations/1。 您應該看到一個 JSON 物件,其中包含 1 號保留的資料,類似於以下輸出:

    Screenshot of the hotel reservations system web app running in a browser.

    將 localhost URL 結尾的「1」取代為不同的保留號碼,例如 2 或 20,以檢視對應的保留詳細資料。

  3. 執行下列命令以檢視容器的狀態:

    docker ps -a
    

    輸出會列出所有可用容器的下列內容:

    • 容器識別碼
    • IMAGE
    • 命令
    • 建立時間
    • 狀態
    • 連接埠
    • NAMES

    確認容器的 STATUS 是否為開啟

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
    07b0d1de4db7        reservationsystem   "dotnet HotelReserva…"   5 minutes ago       Up 5 minutes        0.0.0.0:8080->80/tcp   reservations
    
  4. 輸入下列命令以停止保留容器:

    docker container stop reservations
    
  5. 刪除從本機登錄中的 reservations 容器。

    docker rm reservations
    
  6. 在本機登錄中保留 reservationsystem。 您將會在下一個練習中使用此映像。

恭喜! 您已建立 Web 應用程式的映像,並已使用 Docker 容器將其執行。