はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】Dockerとminimal API(ASP.NET Core + .NET 8)を利用して最小構成のウェブサーバーを構築する

はじめに

今回はDockerとminimal API(ASP.NET Core + .NET 8)を利用して最小構成のウェブサーバーを構築してみたいと思います。

プロジェクトを用意する

まずはプロジェクトを作成します。minimal API用のテンプレートが用意されているので、それを利用していきます。

$ dotnet new web -o DockerTest -f net8.0


.NET 8がインストールされていれば無事にプロジェクトが作成されるはずです。

bin/
obj/
appsettings.Development.json
appsettings.json
DockerTest.csproj
Program.cs


Program.csは以下の通りです。一部app.Runの引数を指定しています。

// Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run("http://*:80");


これらを格納するプロジェクトフォルダにおいて、以下のコマンドを打ち込むとhttp://localhost/にアクセスするとHello World!が返ってくるようになります。

$ dotnet run
ビルドしています...
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://[::]:80

Dockerfileを定義する

docs.docker.jp

# .NET SDKのImage(https://mcr.microsoft.com/product/dotnet/sdk/about)を指定, .NET CLI + .NET runtime + ASP.NET Coreから成り立つ
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
WORKDIR /App

# 全てのファイルをコンテナにコピーする
COPY . ./

# csprojを見て依存関係を解決する
RUN dotnet restore

# ビルドしてpublishする
RUN dotnet publish -c Release -o out


# DockerTestの実行
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /App
COPY --from=build-env /App/out .
ENTRYPOINT ["dotnet", "DockerTest.dll"]

イメージをビルド

docs.docker.jp

$ docker build -t dotnet-docker .

コンテナを起動

docs.docker.jp

ローカル側のポートを8080、Docker側のポートを80に指定して、以下のコマンドを打ち込みます。

$ docker run -d -p 8080:80 --name dockertest dotnet-docker

ちなみに公衆Wifiに繋いでいる場合は、-p 127.0.0.1:8080:80のようにしないと外部からアクセスされる可能性があるらしいので↓のほうが無難かと。これはポートの公開範囲をローカルホストのみにする条件がついています。

$ docker run -d -p 127.0.0.1:8080:80 --name dockertest dotnet-docker

http://localhost:8080/にアクセスすると、Hello, World!が返ってくるようになります。