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

目次
  1. 動作環境
  2. Dockerイメージの作成
  3. プロジェクトの新規作成
  4. APIサーバを起動する
  5. 動作確認
  6. 参考

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/