アプリケーションのDocker化
15 minutesこのワークショップの後半では、.NETアプリケーションをKubernetesクラスターにデプロイします。
しかし、どのようにそれを行うのでしょうか?
最初のステップは、アプリケーション用のDockerイメージを作成することです。これは
アプリケーションの「Docker化」として知られており、プロセスは Dockerfile の作成から始まります。
しかし、まず重要な用語を定義しましょう。
重要な用語
Docker とは何ですか?
「Docker は、コンテナと呼ばれる緩い分離環境でアプリケーションをパッケージ化して実行する機能を提供します。分離とセキュリティにより、指定されたホスト上で同時に多くのコンテナを実行できます。コンテナは軽量で、アプリケーションの実行に必要なすべてを含んでいるため、ホストにインストールされているものに依存する必要がありません。」
ソース: https://docs.docker.com/get-started/docker-overview/
コンテナとは何ですか?
「コンテナは、アプリのコンポーネントごとの分離されたプロセスです。各コンポーネントは…独自の分離された環境で実行され、マシン上の他のすべてのものから完全に分離されています。」
ソース: https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-a-container/
コンテナイメージとは何ですか?
「コンテナイメージは、コンテナを実行するためのすべてのファイル、バイナリ、ライブラリ、および設定を含む標準化されたパッケージです。」
Dockerfile
「Dockerfile は、コンテナイメージを作成するために使用されるテキストベースのドキュメントです。実行するコマンド、コピーするファイル、起動コマンドなどに関するイメージビルダーへの指示を提供します。」
Dockerfile の作成
/home/splunk/workshop/docker-k8s-otel/helloworld ディレクトリに Dockerfile という名前のファイルを作成しましょう。
ファイルの作成にはviまたはnanoを使用できます。viを使用した例を示します
新しく開いたファイルに以下の内容をコピー&ペーストします
以下のテキストを貼り付ける前に、vi で「i」を押して挿入モードに入ってください。
vi での変更を保存するには、
escキーを押してコマンドモードに入り、:wq!と入力してからenter/returnキーを押します。
これはすべて何を意味するのでしょうか?詳しく見てみましょう。
Dockerfile の詳細解説
この例では、マルチステージDockerfileを使用しており、Dockerイメージ作成プロセスを以下のステージに分けています
- Base(ベース)
- Build(ビルド)
- Publish(パブリッシュ)
- Final(最終)
マルチステージアプローチはより複雑ですが、デプロイメント用により 軽量なランタイムイメージを作成することができます。以下では、 これらの各ステージの目的を説明します。
ベースステージ
ベースステージでは、アプリを実行するユーザー、作業ディレクトリを定義し、
アプリにアクセスするために使用されるポートを公開します。
これはMicrosoftの mcr.microsoft.com/dotnet/aspnet:8.0 イメージをベースにしています
なお、mcr.microsoft.com/dotnet/aspnet:8.0 イメージには.NET runtimeのみが含まれており、
SDKは含まれていないため、比較的軽量です。これはDebian 12 Linux
distributionがベースになっています。ASP.NET Core Runtime Dockerイメージの詳細については
GitHubで確認できます。
Build ステージ
Dockerfileの次のステージはbuildステージです。このステージでは、
mcr.microsoft.com/dotnet/sdk:8.0 イメージが使用されます。これもDebian 12がベースになっていますが、
runtimeだけでなく完全な.NET SDKが含まれています。
このステージでは .csproj ファイルをbuildイメージにコピーし、その後 dotnet restore を使用して
アプリケーションが使用する依存関係をダウンロードします。
次に、アプリケーションコードをbuildイメージにコピーし、
dotnet build を使用してプロジェクトとその依存関係を
.dll バイナリのセットにビルドします
Publish ステージ
3番目のステージはpublishで、これはMicrosoftイメージではなくbuildステージイメージをベースにしています。このステージでは、dotnet publish を使用して
アプリケーションとその依存関係をdeployment用にパッケージ化します
Final ステージ
4番目のステージは最終ステージで、これはbase ステージイメージをベースにしています(buildとpublishステージよりも軽量)。publishステージイメージからの出力をコピーし、 アプリケーションのentry pointを定義します
Docker イメージのビルド
Dockerfile ができたので、これを使用してアプリケーションを含むDockerイメージを
ビルドできます
これは、現在のディレクトリの Dockerfile を使用して helloworld:1.0 のタグでイメージをビルドするようDockerに指示します。
以下のコマンドで正常に作成されたことを確認できます
Docker イメージのテスト
続行する前に、以前に開始したアプリケーションがインスタンス上で実行されていないことを確認してください。
Dockerイメージを使用して以下のようにアプリケーションを実行できます
注意:
--network=hostパラメータを含めて、Docker コンテナが インスタンス上のリソースにアクセスできるようにしています。これは後でアプリケーションが localhost 上で実行されているコレクターにデータを送信する必要がある場合に重要です。
Dockerコンテナが実行されていることを確認しましょう
以前と同様にアプリケーションにアクセスできます
おめでとうございます。ここまで到達したということは、.NETアプリケーションのDocker化に成功したということです。