練習 - 自訂 Docker 映像以執行您自己的 Web 應用程式
Dockerfile 包含建置自訂 Docker 映像的步驟。
您決定使用 Docker 部署您組織的其中一個 Web 應用程式。 您選取的簡單 Web 應用程式會實作旅館訂房網站的 Web API。 Web API 公開 HTTP POST 和 GET 作業,建立並擷取客戶的訂房記錄。
注意
在這個版本的 Web 應用程式中,不是真的保留訂房記錄,所以查詢會傳回虛擬資料。
在此練習中,您會為沒有 Dockerfile 的應用程式建立 Dockerfile。 然後,建置映像並在本機執行。
建立 Web 應用程式的 Dockerfile
如果尚未執行的話,請在電腦上啟動 Docker。
在本機電腦的命令提示字元視窗中,執行下列命令,下載 Web 應用程式的原始程式碼。
git clone https://github.com/MicrosoftDocs/mslearn-hotel-reservation-system.git
輸入下列命令以開啟
src
目錄。cd mslearn-hotel-reservation-system/src
在
src
目錄中,輸入下列命令建立一個名為Dockerfile
的新檔案並在記事本中將其開啟:copy NUL Dockerfile notepad Dockerfile
注意
根據預設,記事本命令會開啟文字檔。 請確定您將其儲存為不帶檔案副檔名的檔案類型所有檔案。 若要確認,請在檔案總管中開啟 src 資料夾,然後選取 [檢視 > 顯示 > 副檔名]。 如有必要,請重新命名檔案,並從檔案名稱中移除
.txt
。將下列代碼新增到 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 下載這些專案所需的相依性。將下列代碼附加到 Dockerfile 的底部:
COPY . . WORKDIR "/src/HotelReservationSystem" RUN dotnet build "HotelReservationSystem.csproj" -c Release -o /app
這些命令會將 Web 應用程式的原始程式碼複製到容器,然後執行 dotnet build 命令來建置應用程式。 產生的 DLL 會寫入至容器的
/app
資料夾。在 Dockerfile 底部附加下列命令。
RUN dotnet publish "HotelReservationSystem.csproj" -c Release -o /app
dotnet publish
命令會將網站的可執行檔複製到新資料夾,並移除任何過渡檔案。 然後,此資料夾中的檔案會部署至網站。將下列命令附加到 Dockerfile 的底部。
EXPOSE 80 WORKDIR /app ENTRYPOINT ["dotnet", "HotelReservationSystem.dll"]
第一個命令會在容器中開啟連接埠 80。 第二個命令會移至包含 Web 應用程式已發行版本的
/app
資料夾。 最後一個命令指定當容器執行它時,應該執行命令dotnet HotelReservationSystem.dll
。 此程式庫包含 Web 應用程式的已編譯程式碼。儲存檔案並關閉文字編輯器。 請確定您將其儲存為不帶檔案副檔名的檔案類型所有檔案。
使用 Dockerfile 建置及部署映像
在命令提示字元中,執行下列命令以 Dockerfile 建置範例應用程式的映像。 不要忘記命令結尾的
.
。 此命令會建置映像,並將它儲存在本機。 映像的名稱為reservationsystem
。 驗證映像是否建置成功。 流程完成時,可能會顯示檔案和目錄權限的相關警告。 基於本練習的目的,您可以忽略此警告。 該映像可能需要一些時間來建置。docker build -t reservationsystem .
執行下列命令,驗證映像是否已建立並儲存在本機登錄中:
docker image list
映像的名稱會是
reservationsystem
。 您也會有名為 microsoft/dotnet 的映像:REPOSITORY TAG IMAGE ID CREATED SIZE reservationsystem latest d2501f0f2ced About a minute ago 1.76GB
測試 Web 應用程式
輸入下列代碼,以使用
reservationsystem
映像執行容器。 Docker 會傳回長度為十六進位數字的字串。 容器會在背景中執行,而不需要任何 UI。 容器中的連接埠 80 會對應至主機電腦連接埠 8080。 容器名為reservations
。docker run -p 8080:80 -d --name reservations reservationsystem
開啟網頁瀏覽器,並巡覽至
http://localhost:8080/api/reservations/1
。 您應該看到一個 JSON 物件,其中包含 1 號保留的資料,類似於以下輸出:將 localhost URL 結尾的「1」取代為不同的保留號碼,例如 2 或 20,以檢視對應的保留詳細資料。
執行下列命令以檢視容器的狀態:
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
輸入下列命令以停止保留容器:
docker container stop reservations
刪除從本機登錄中的 reservations 容器。
docker rm reservations
在本機登錄中保留 reservationsystem。 您將會在下一個練習中使用此映像。
恭喜! 您已建立 Web 應用程式的映像,並已使用 Docker 容器將其執行。