演習 - 独自の Web アプリを実行するために Docker イメージをカスタマイズする
Dockerfile には、カスタム Docker イメージを構築するための手順が含まれています。
Docker を使用して、組織の Web アプリのいずれかをデプロイすることにします。 ホテル予約 Web サイトの Web API を実装するシンプルな Web アプリを選択します。 Web API によって、顧客の予約を作成して取得する HTTP POST および GET 操作が公開されます。
Note
このバージョンの Web アプリでは、予約が実際には保存されず、クエリがダミー データを返します。
この演習では、何も含まれていないアプリの 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
Note
既定では、メモ帳コマンドによってテキスト ファイルが開かれます。 ファイルの種類がすべてのファイルで、拡張子なしで保存していることを確認してください。 確認するには、エクスプローラーで 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
コマンドでは、Web サイトの実行可能ファイルが新しいフォルダーにコピーされ、すべての中間ファイルが削除されます。 その後、このフォルダー内のファイルを Web サイトにデプロイできます。Dockerfile の下部に次のコマンドを追加します。
EXPOSE 80 WORKDIR /app ENTRYPOINT ["dotnet", "HotelReservationSystem.dll"]
最初のコマンドではコンテナーのポート 80 を開きます。 2 番目のコマンドでは、発行済みバージョンの 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 は、16 進数の長い文字列を返します。 コンテナーは、UI なしでバックグラウンドで実行されます。 コンテナーのポート 80 は、ホスト コンピューター上のポート 8080 にマップされます。 コンテナーの名前はreservations
となります。docker run -p 8080:80 -d --name reservations reservationsystem
Web ブラウザーを起動し、
http://localhost:8080/api/reservations/1
に移動します。 次の出力と同様に、予約番号 1 のデータを含む JSON オブジェクトが表示されます。localhost URL の末尾にある "1" を別の予約番号 (2 や 20 など) に置き換え、対応する予約の詳細を表示します。
コンテナーの状態を表示するには次のコマンドを実行します。
docker ps -a
出力には、使用可能なすべてのコンテナーについて以下が一覧表示されます。
- CONTAINER ID
- イメージ
- COMMAND
- CREATED time
- 状態
- PORTS
- NAMES
コンテナーの
STATUS
が Up であることを確認します。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
次のコマンドを入力して、reservations コンテナーを停止します。
docker container stop reservations
ローカル レジストリから reservations コンテナーを削除します。
docker rm reservations
ローカル レジストリの reservationsystem はそのままにしておきます。 このイメージは次の演習で使用します。
おめでとうございます。 これで Web アプリのイメージが作成され、Docker コンテナーを使用してそれを実行しました。