はじめに
ASP.NET Core アプリをコンテナ化したいけど、 .NET Framework の資産を捨てられないので、 ランタイムに .NET Framework を選択し、 Docker + Windows コンテナで行くことに。
手始めに、ASP.NET Core アプリをコンテナ化して、 Windows コンテナのプロセス分離モードで動かす実験を行ってみた。
最小の ASP.NET Core アプリ
今回の実験に使った最小の ASP.NET Core アプリが下記になる。
using Microsoft.AspNetCore; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; namespace HelloWCOW { public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>(); } public class Startup { public void ConfigureServices(IServiceCollection services) { } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.Run(async (context) => { await context.Response.WriteAsync("Hello WCOW!"); }); } } }
ASP.NET Core の「空」テンプレートで生成したアプリほぼそのまま。 このアプリをローカルのフォルダに発行しておく。 場所はデフォルトで。
Dockerfile
あらかじめ発行しておいた最小の ASP.NET Core アプリをもとに Docker コンテナを作りたいので、 Dockerfile を書いた。
FROM mcr.microsoft.com/dotnet/framework/runtime:4.8 WORKDIR /app EXPOSE 80 COPY ./HelloWCOW/bin/Release/net48/publish . ENTRYPOINT ["HelloWCOW.exe", "--urls", "http://*:80"]
--urls
で http://localhost:80
を指定するとダメで、
http://*:80
だと上手くいった。
Docker + Windows コンテナ + プロセス分離モードの情報が少なすぎて、
嵌ると抜け出すのにかなりの時間を費やしてツライ。
コンテナイメージをビルド
> docker build -t tnakamura/hellowcow:1.0 .
コンテナイメージが作成されたか確認。
> docker images
コンテナを起動
作成したコンテナイメージからコンテナを起動。 今回もプロセス分離モードを指定した。
> docker run --rm --it --isolation process -p 8000:80 --name hellowcow tnakamura/hellowcow:1.0
Web ブラウザからアクセス
Chrome で http://localhost:8000
にアクセス。
Hello WCOW!
と表示されたので実験成功。
おわりに
なんとか最小の ASP.NET Core アプリをコンテナ化して、 Windows コンテナのプロセス分離モードで動かすことに成功した。 実験はまだまだ続く。 たったこれだけでも、嵌って結構な時間が溶けしまったので、正直なところ先が思いやられるな。