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リポジトリの名称が変更になった模様。
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です。