演習 - 独自の Web アプリを実行するために Docker イメージをカスタマイズする

完了

Dockerfile には、カスタム Docker イメージを構築するための手順が含まれています。

Docker を使用して、組織の Web アプリのいずれかをデプロイすることにします。 ホテル予約 Web サイトの Web API を実装するシンプルな Web アプリを選択します。 Web API によって、顧客の予約を作成して取得する HTTP POST および GET 操作が公開されます。

Note

このバージョンの Web アプリでは、予約が実際には保存されず、クエリがダミー データを返します。

この演習では、何も含まれていないアプリの 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
    

    Note

    既定では、メモ帳コマンドによってテキスト ファイルが開かれます。 ファイルの種類がすべてのファイルで、拡張子なしで保存していることを確認してください。 確認するには、エクスプローラーで 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 コマンドでは、Web サイトの実行可能ファイルが新しいフォルダーにコピーされ、すべての中間ファイルが削除されます。 その後、このフォルダー内のファイルを Web サイトにデプロイできます。

  8. Dockerfile の下部に次のコマンドを追加します。

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

    最初のコマンドではコンテナーのポート 80 を開きます。 2 番目のコマンドでは、発行済みバージョンの 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 は、16 進数の長い文字列を返します。 コンテナーは、UI なしでバックグラウンドで実行されます。 コンテナーのポート 80 は、ホスト コンピューター上のポート 8080 にマップされます。 コンテナーの名前は reservations となります。

    docker run -p 8080:80 -d --name reservations reservationsystem
    
  2. Web ブラウザーを起動し、http://localhost:8080/api/reservations/1 に移動します。 次の出力と同様に、予約番号 1 のデータを含む JSON オブジェクトが表示されます。

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

    localhost URL の末尾にある "1" を別の予約番号 (2 や 20 など) に置き換え、対応する予約の詳細を表示します。

  3. コンテナーの状態を表示するには次のコマンドを実行します。

    docker ps -a
    

    出力には、使用可能なすべてのコンテナーについて以下が一覧表示されます。

    • CONTAINER ID
    • イメージ
    • COMMAND
    • CREATED time
    • 状態
    • PORTS
    • NAMES

    コンテナーの STATUSUp であることを確認します。

    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. 次のコマンドを入力して、reservations コンテナーを停止します。

    docker container stop reservations
    
  5. ローカル レジストリから reservations コンテナーを削除します。

    docker rm reservations
    
  6. ローカル レジストリの reservationsystem はそのままにしておきます。 このイメージは次の演習で使用します。

おめでとうございます。 これで Web アプリのイメージが作成され、Docker コンテナーを使用してそれを実行しました。