mac docker c# aspの環境を作成する

# mac docker c# aspの環境を作成する

## table of contents

0. dotnet cliを利用できるdocker環境を作成する
0. dotnet cli を利用して、applicationを準備する
0. Host OSのブラウザからアクセスする

## 1. doctnet cliを利用できるdocker環境を作成する

[microsoft/dotnet](https://hub.docker.com/r/microsoft/dotnet)で複数のimageは、cliを利用を想定しているので、imageは、[.NET SDK](https://github.com/dotnet/dotnet-docker/blob/main/README.sdk.md)を利用する。

### 1-1. compose.yaml と dockerfileを作成する

現状のdirectoryは、何もないので `compose.yaml` と `dockerfile` を利用する。

```terminal
$ mkdir project
$ cd project
$ touch compose.yaml dockerfile
```

```compose.yaml
services:
  api_container:
    container_name: api_container
    build:
      context: .
      dockerfile: dockerfile
    tty: true
    restart: always
    volumes:
      - .:/app
    ports:
      - 8080:5291
```

```dockerfile
FROM mcr.microsoft.com/dotnet/sdk:8.0

WORKDIR /app
```

### 1-2. dockerを立ち上げる

```terminal
% docker compose up -d
[+] Building 0.0s (0/0)                                                                        docker:desktop-linux
[+] Running 1/0
 ✔ Container XXX  Running            0.0s
```

execも利用するので、Makefile を利用して作業を単純化する。

```terminal
% touch Makefile
```

```Makefile
compose := @docker compose -f compose.yaml
api_container_id = $(shell docker ps --format json --filter name=api_container | jq -r '.ID')

.PHONY: local.up

local.up:
	$(compose) up -d

local.up.build:
	$(compose) up -d --build

local.api.exec:
	@docker exec -it $(api_container_id) bash
```

```terminal
% make local.up
% make local.api.exec
```
現状のdirectory構成は以下。

```terminal
% tree . -L 2
.
├── Makefile
├── README.md
├── compose.yaml
└── dockerfile
```

## 2. dotnet cli を利用して、applicationを準備する

1 で作成した環境を利用して、applicationを作成します。

```terminal
% make local.api.exec
# dotnet --verson
8.0.406
```

[dotnet cli](https://learn.microsoft.com/en-us/dotnet/core/tools/)を利用してアプリケーションを立ち上げる。

```terminal
# dotnet new webapi -o MyWebApi
```

上記を実施すると、dotnetのsample applicationが作成されます。

```terminal
# tree . -L 2
.
├── Makefile
├── README.md
├── WebApi
│   ├── Makefile
│   ├── Program.cs
│   ├── Properties
│   ├── WebApi.csproj
│   ├── WebApi.http
│   ├── appsettings.Development.json
│   ├── appsettings.json
│   ├── bin
│   └── obj
├── compose.yaml
└── dockerfile
```

## 3. Host OSのブラウザからアクセスする

2で作成した環境を立ち上げて、HostOSからアクセスする。
docker container内に入り、debug runする。

```terminal
# cd WebApi
# dotnet watch
dotnet watch
dotnet watch ⌚ Polling file watcher is enabled
dotnet watch 🔥 Hot reload enabled. For a list of supported edits, see https://aka.ms/dotnet/hot-reload.
  💡 Press "Ctrl + R" to restart.
dotnet watch 🔧 Building...
  Determining projects to restore...
  All projects are up-to-date for restore.
  WebApi -> /app/WebApi/bin/Debug/net8.0/WebApi.dll
dotnet watch 🚀 Started
warn: Microsoft.AspNetCore.Hosting.Diagnostics[15]
      Overriding HTTP_PORTS '8080' and HTTPS_PORTS ''. Binding to values defined by URLS instead 'http://localhost:5291'.
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5291
dotnet watch 🌐 Unable to launch the browser. Navigate to http://localhost:5291
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /app/WebApi
```

ホストOSから、アクセスしてみる。

[localhost:8080/weatherforecast](http://localhost:8080/weatherforecast)にアクセスするとできない。
hostが0.0.0.0向けになっていないためなので、hostとportをとりあえず記載する。

```WebApi/Program.cs
using System.Net; // 追記

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

// ここから追記
// host and port
builder.WebHost.UseKestrel(options =>
{
    options.Listen(IPAddress.Parse("0.0.0.0"), 5291);
});
// ここまで追記
```

再度debug run を実施する

```terminal
# dotnet watch
```

[localhost:8080/weatherforecast](http://localhost:8080/weatherforecast)


![スクリーンショット 2025-03-09 17.46.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144543/60b19b52-ae78-4992-ae1e-47da62073f90.png)