はじめに
今回は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を定義する
# .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"]
コンテナを起動
ローカル側のポートを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!
が返ってくるようになります。