コンテナ - .NET
概要
.NETコンテナには主に2つのタイプがある。
- .NETランタイムイメージ
- アプリケーションの実行専用で、必要最小限の軽量なイメージである。
- .NET SDKイメージ
- 開発やビルドに必要なツールを含む大きなイメージである。
実運用環境では、まずSDKイメージでアプリケーションをビルドして、その成果物をランタイムイメージにコピーする マルチステージビルド という手法が一般的である。
用途に応じて適切なベースイメージを選択することにより、効率的で安全なコンテナイメージを作成することができる。
.NETランタイム向けのコンテナファイル
ビルド済みのアプリケーションを実行するためのランタイムイメージを以下に示す。
このランタイムイメージは、.NET / ASP.NET Coreアプリケーションを実行するために必要な最小限のコンポーネントのみを含んでいる。
イメージサイズが小さく、セキュリティ面でも攻撃対象が少ないというメリットがある。
# .NET 8のランタイムイメージを使用
## 非ASP.NET Core向け
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS final
## ASP.NET Core向け
# FROM mcr.microsoft.com/dotnet/aspnet:8.0
# 作業ディレクトリを設定
WORKDIR /app
# ビルド済みのアプリケーションファイルをコピー
# このファイルは事前にローカルでビルドする必要がある
COPY ./publish /app
# アプリケーションが使用するポートを公開
EXPOSE 8080
# アプリケーションを起動
ENTRYPOINT ["dotnet", "YourApp.dll"]
.NET SDK向けのコンテナファイル
開発環境やコンテナ内でビルドを行う場合は、.NET SDKイメージを使用する。
.NET SDKイメージにはコンパイラや開発ツールが含まれているため、ソースコードから直接アプリケーションをビルドすることができる。
ただし、イメージサイズは大きくなる。
# .NET 8のSDKイメージを使用
FROM mcr.microsoft.com/dotnet/sdk:8.0
# 作業ディレクトリを設定
WORKDIR /src
# プロジェクトファイルをコピーして依存関係を復元
# この段階的なコピーにより、依存関係のキャッシュが効率的になる
COPY ["YourApp.csproj", "./"]
RUN dotnet restore "YourApp.csproj"
# ソースコードをコピー
COPY . .
# アプリケーションをビルド
RUN dotnet build "YourApp.csproj" -c Release -o /app/build
# アプリケーションを実行
WORKDIR /app/build
ENTRYPOINT ["dotnet", "YourApp.dll"]
マルチステージビルド (推奨)
実運用環境では、ビルドと実行を分離したマルチステージビルドが最も推奨される。
これにより、最終イメージを小さく保ちながら、コンテナ内でのビルドすることができる。
マルチステージビルドでは、最初に.NET SDKイメージでアプリケーションをビルドして、最終的にはランタイムイメージに必要なファイルのみをコピーする。
これにより、最終イメージから.NET SDKやビルドツールが除外されて、サイズとセキュリティの両面で最適化される。
# ビルドステージ
# .NET SDKイメージを使用してアプリケーションをビルド
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
# プロジェクトファイルをコピーして依存関係を復元
# この段階を分けることにより、ソースコードが変更されても依存関係のレイヤーはキャッシュされる
COPY ["YourApp/YourApp.csproj", "YourApp/"]
RUN dotnet restore "YourApp/YourApp.csproj"
# ソースコードをコピーしてビルド
COPY . .
WORKDIR "/src/YourApp"
RUN dotnet build "YourApp.csproj" -c Release -o /app/build
# パブリッシュステージ
# ビルド成果物を発行形式に変換
FROM build AS publish
RUN dotnet publish "YourApp.csproj" -c Release -o /app/publish /p:UseAppHost=false
# 実行ステージ
# 軽量なランタイムイメージに切り替え
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final
WORKDIR /app
# パブリッシュステージから成果物だけをコピー
COPY --from=publish /app/publish .
# ポートを公開
EXPOSE 8080
# アプリケーションを起動
ENTRYPOINT ["dotnet", "YourApp.dll"]
コンソールアプリケーション向けの調整
もし、コンソールアプリケーションやバックグラウンドサービス (非ASP.NET Core) を開発する場合は、ランタイムイメージを変更する。
# ASP.NET Coreの代わりに、基本的な.NETランタイムを使用
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
# ビルド部分は同様
# ...略
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "YourApp.dll"]
.NET 5から10までの各バージョンの指定方法
各.NETバージョンに対応する場合は、イメージタグを変更する。
# .NET 5 (サポート終了済み)
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS final
# .NET 6 (LTS - サポート終了済み)
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS final
# .NET 7 (サポート終了済み)
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS final
# .NET 8 (LTS - 2026年11月までサポート)
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final
# .NET 9 (2026年11月までサポート)
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS final
# .NET 10(2028年11月までサポート)
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS final