Docker上でASP.NET CoreのWebAPIを動かす

ASP.NET CoreをDockerで動かしてみたいなーとなんとなく思ったので動かしてみました。 Visial Studioは使わず、VSCodeで動かす想定です。
動作環境
- OS: Windows10(20H2)
$ docker -v
Docker version 20.10.5, build 55c4c88
Dockerイメージの作成
Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:5.0
WORKDIR /project
EXPOSE 5000
なお、.NET 5.0からDockerリポジトリの名称が変更になった模様。
https://github.com/dotnet/dotnet-docker/issues/1939
Dockefileを書いたら、Dockerイメージをビルドします。
$ docker build -t dotnetsdk5.0 .
プロジェクトの新規作成
Dockerコンテナを起動し、コンテナ内でASP.NET CoreのWebAPIを新規作成します。
.NET SDKがWebAPI用のテンプレートを用意してくれているので、折角なので使っていきます。
$ docker run --rm -v $(pwd -W):/project -p 5000:5000 -it dotnetsdk5.0 bash
# テンプレートに"webapi"を指定
root@************:/project# dotnet new webapi
dotnet newを実行すると、WebAPIプロジェクトのテンプレートが作成されます。
テンプレートにはWeatherForecastControllerというコントローラが用意されており、既にAPIサーバを立ち上げることができるようになっているので今回はこれを使っていきます。
WeatherForecastController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace project.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
}
http://localhost:5000/WeatherForecastへのGETリクエストを受けたら、ランダムな天気情報の配列をレスポンスする内容になっています。
APIサーバを起動する
root@************:/project# dotnet run --urls http://0.0.0.0:5000
Dockerコンテナでサーバを立てて、外部のクライアントからリクエストする場合は、--urls http://0.0.0.0:5000で5000番ポートの外部アクセスを明示的に許可しないとリクエストが通りません。
動作確認
Chromeからhttp://localhost:5000/WeatherForecastにアクセスして動作確認してみます。
[
{"date":"2021-03-21T05:11:03.6108145+00:00","temperatureC":-4,"temperatureF":25,"summary":"Balmy"},
{"date":"2021-03-22T05:11:03.6109901+00:00","temperatureC":0,"temperatureF":32,"summary":"Cool"},
{"date":"2021-03-23T05:11:03.6109922+00:00","temperatureC":2,"temperatureF":35,"summary":"Hot"},
{"date":"2021-03-24T05:11:03.6109924+00:00","temperatureC":13,"temperatureF":55,"summary":"Sweltering"},
{"date":"2021-03-25T05:11:03.6109925+00:00","temperatureC":33,"temperatureF":91,"summary":"Balmy"}
]
天気情報の配列が返ってきたらOKです。
参考
https://mseeeen.msen.jp/asp-net-core-3-allow-access-to-kestrel-from-outside-in-development-mode/