コンテナとDocker Hubへのデプロイ - C#でサンプルAPIを構築するコース
.NET CoreアプリケーションをDockerコンテナにデプロイすることは、現代の開発者にとって重要なスキルです。 コンテナは、不変のインフラストラクチャ、容易な配布、軽量な実行環境を提供します。 この詳細なガイドでは、サンプルAPIをDockerコンテナにデプロイし、Tim Coreyの包括的なビデオチュートリアルで実演された手順に従ってDocker Hubにプッシュする手順を説明します:"Deploying to a Container and Docker Hub - Building a Sample API in C#".
それでは、簡単にフォローできるように、特定のタイムスタンプを参照しながら、ステップ・バイ・ステップでプロセスを探っていきましょう。 このガイドには、dotnet publish、docker runコマンド、ベースイメージ、ランタイムイメージ、コンテナイメージのような用語など、Dockerを使用して.NETアプリケーションをデプロイするための重要な概念が含まれています。
サンプルAPIの作成と理解
ビデオの冒頭で、ティムはウェブ開発を学ぶ際のサンプルアプリの有用性を強調しています。 このアプリは、/courses や /health のようなエンドポイントを含み、ヘルスチェックの劣化のような現実世界の問題をシミュレートし、ローカルマシンとリモートサーバーの両方で実行できるように設計されています。
これは.NET Coreアプリ(正確にはASP.NET Core最小API)であり、Dockerコンテナを通して簡単に実行し、テストすることができます。
ローカルでDockerをセットアップする
Tim氏は、Docker Desktopを使用して、Dockerがローカルマシンにインストールされていることを確認します。ローカルにDockerがインストールされていなくても、Docker Hubに直接パブリッシュすることは可能ですが、デモのためにローカルへのデプロイから始めます。
彼は、プリインストールされた2つのDockerイメージを示しています:
字幕用パーソナルツール
- Microsoftの公式ASP.NET Coreベースイメージ:mcr.microsoft.com/dotnet/aspnet
このベースイメージは約328MBで、コンテナイメージの基盤として機能します。 MicrosoftはこれらのイメージをMCR(Microsoft Container Registry)でホストしており、LinuxコンテナとWindowsコンテナの両方をサポートしています。 このプロジェクトでは、Linuxが対象となるオペレーティングシステムです。
コンテナへのローカルパブリッシング
TimはAPIプロジェクトフォルダに移動し、コマンドラインで次のコマンドを実行します:
dotnet publish -p:PublishProfile=DefaultContainerdotnet publish -p:PublishProfile=DefaultContainerこのコマンドは、.NET 8と.NET 9のビルトインコンテナサポートを使用するため、Dockerfileの必要性がなくなります。発行プロセスは適切なランタイムイメージを選択し、自己完結型のコンテナイメージを構築します。
以下は、その内容です:
プロジェクトファイル(.csproj)は、APIを構築するために使用されます。
依存関係は、dotnet restoreコマンドを使用して復元されます。
出力はパブリッシュフォルダ
- DLLファイルを作成し、コンテナに埋め込みます。
出来上がった画像は約333MB(ベースより5MBだけ大きい)。
Dockerでイメージを実行する
イメージが作成されると、ティムはDocker Desktopを使ってコンテナを実行します。 内部的には、アプリはポート8080でリッスンします。Timは、ポート・コンフィギュレーションに0を入力することで、これをランダムなホスト・ポートにマッピングします。
コンテナはランダムな名前(elegant_hooverなど)で起動し、ブラウザを開くと、デフォルトのレスポンスとして "Hello World "を持つ動作中のAPIが表示されます。
Timは、/coursesと/healthをブラウズすることで、APIが機能していることを確認します。 ヘルスチェックエンドポイントは、本番環境のシナリオをシミュレートするのに便利です。
実行中のコンテナを表示するには、CLI で docker ps コマンドを使用できます。 Tim は、クリーンアップを実演するために、実行中のコンテナとイメージを後で削除します。
Docker Hubリポジトリの作成
次に、ティムはクラウド・デプロイメントのパートに移ります。 彼はDocker Hubアカウントにログインし、thesampleapiという名前のパブリックリポジトリを作成します。
Dockerイメージはここでプッシュされ、他の人がそれを使ってプルできるようになります:
docker pull timcorey/thesampleapi:latestdocker pull timcorey/thesampleapi:latestプロジェクトをDocker Hub用に設定する
APIのプロジェクトファイル内に、TimはDockerイメージをどこでどのように公開するかを定義するメタデータを追加します。 彼は次のコードブロックを追加します:
<ContainerRegistry>docker.io</ContainerRegistry>
<ContainerRepository>timcorey/thesampleapi</ContainerRepository>
<ContainerImageTags>1.0.0;latest</ContainerImageTags><ContainerRegistry>docker.io</ContainerRegistry>
<ContainerRepository>timcorey/thesampleapi</ContainerRepository>
<ContainerImageTags>1.0.0;latest</ContainerImageTags>ContainerRegistry:ターゲットレジストリとしてDocker Hubを指定します。
ContainerRepository:Docker Hubリポジトリへのパス。
- ContainerImageTags:バージョン管理と最新リリースのために画像にタグを付けます。
これは、将来的に多段階のビルドフローに対応するためのイメージの準備ですが、ティムは今のところ物事をシンプルに保っています。
Dockerハブに公開する
ティムはもう一度同じpublishコマンドを実行します:
dotnet publish -p:PublishProfile=DefaultContainerdotnet publish -p:PublishProfile=DefaultContainer最初は、.csprojファイルを保存し忘れたため、プッシュに失敗します。保存してコマンドを再実行すると、イメージはDocker Hubに正常にアップロードされました。
Docker Hubでは、最新と1.0.0の両方のタグがthesampleapiリポジトリの下に表示されます。 これらのタグを使用することで、特定のバージョンを引き出す際に柔軟性を持たせることができます。
Dockerハブからイメージをプルする
Timは、Dockerがインストールされたマシンからイメージを引き出す方法を示します:
docker pull timcorey/thesampleapi:latestdocker pull timcorey/thesampleapi:latestDockerレイヤーキャッシングのおかげで、イメージのほとんどはベースイメージからすでに存在しているため、イメージはすぐにダウンロードされます。
イメージを実行するには
docker run -p 0:8080 timcorey/thesampleapi:latestdocker run -p 0:8080 timcorey/thesampleapi:latestこれは、ランダムなホスト・ポートを内部ポート8080にマッピングします。
新しいバージョンの画像を作成する
バージョン管理を示すために、Timは.csprojファイルを次のように編集します:
<ContainerImageTags>1.0.1;latest</ContainerImageTags><ContainerImageTags>1.0.1;latest</ContainerImageTags>そして、publishコマンドを再実行します:
dotnet publish -p:PublishProfile=DefaultContainerdotnet publish -p:PublishProfile=DefaultContainer現在、Docker Hubリポジトリには3つのタグが表示されています:
1.0.0
1.0.1
- 最新版(現在は1.0.1を指しています)
ティムは、複数のタグがあるにもかかわらず、Dockerは重複したレイヤーを保存せず、個別のレイヤーによってディスク使用量を最適化すると説明しています。
ローカル開発のためのDockerイメージの使用
Tim氏は、一度Docker Hubにイメージをアップすれば、いつでもどのマシンでも実行できることを強調しています:
docker pull timcorey/thesampleapi:latestdocker pull timcorey/thesampleapi:latest次に、docker run コマンドを使ってそれを起動します。終了したら、次のコマンドでクリーンアップしてください:
docker ps # Get container ID
docker stop <id> # Stop the container
docker rm <id> # Remove the container
docker rmi <image> # Remove the imagedocker ps # Get container ID
docker stop <id> # Stop the container
docker rm <id> # Remove the container
docker rmi <image> # Remove the imageこのため、ローカルマシンを肥大化させることなく、オンデマンドの開発やテストに最適だと説明しています。
次は何?
ティムは次のステップとして、この同じAPIを仮想専用サーバー(VPS)にデプロイすることに言及して締めくくった。 彼は、ドメインをマッピングし、一般にアクセスできるようにコンテナを設定する手順を説明します。
結論ローカル ビルドからクラウド展開へ
ティム・コーリーのビデオガイドを使用しました:
dotnet new consoleを使用した.NET Core APIの構築
dotnet restoreとdotnet publishを使用してビルドとデプロイを行う。
サンプルDockerfileなしでDockerコンテナを作成
Docker Hubにコンテナイメージをアップロード。
docker run を使用してコンテナをプルし、実行しました。
管理されたタグと明確なイメージレイヤー
- バージョン管理されたイメージを使用する本番環境用に準備
Dockerと.NETを中心としたこのワークフローは、スケーラブルでテスト可能、共有可能なアプリケーションの構築に最適です。

