.NETCoreのWebAPIをDockerで実行する

# はじめに

昔使ってた.NETCoreを使って、WebAPIでDockerを動かしてみたいと思いました。ちなみに私、.NET環境触るの久しぶりだったり、Docker初心者なので、間違ってる〜とか今はこんなのが主流だよ〜とかあったらご指摘いただけると嬉しいです:relaxed:

また、Docker良く分からないけど、なんか動かしてみたい〜っていうMSフレンズも実際にやってもらえたら嬉しいです。

# TL;DR

- C#やWindowsServerを使っている方、.NETCoreやDockerを検討している方向けです。
- この記事を読むと、.NETCoreのWebAPIをDockerコンテナで実行できるようになります。

# 準備

- 環境
  - macOS Mojave バージョン 10.14.6  
※Windows でも適宜読み替えればできると思います。

## .NETCoreをインストール

[.NETCore SDK](https://dotnet.microsoft.com/download)からダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/945f1336-6fe6-e1e7-880e-7a8ff581548b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/91f58bb4-9dda-7b10-0bb8-060e2fe05c71.png)

バージョンを確認すると...

```console
dotnet --version
--version3.1.100
```

正常に.NETCore SDKのインストールが完了しました。

# WebAPIのサンプルプロジェクトを作成

続いて、今回試すAPIのプロジェクトを作成します。

```console
# プロジェクト作成 （my_docker_api は任意のプロジェクト名）
dotnet new webapi -o my_docker_api
```

### 動作確認

```console
# プロジェクトに移動してlocalhost起動
cd my_docker_api/
dotnet run
```

サンプルとして用意されている`WeatherForecast`に
`https://localhost:5001/WeatherForecast` でアクセスすると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/9a831939-ba71-43a5-5c55-86374f9a9fa6.png)

`Command + C` でlocalhostシャットダウン

## Dockerイメージをビルド

### 準備

※Dockerをインストール（この記事では割愛）

```console
docker --version
Docker version 19.03.5, build 633a0ea
```

#### VSCode拡張機能インストール（任意）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/81e3a8b9-b76a-1860-b681-0fca7925cb9a.png)

### Dockerfile作成

`Command + Shift + P` でコマンドパレットを開き
`Docker: Add Docker Files to Workspace...` を選択
`ASP.NET Core` > `Linux` を選択すると自動で `Dockerfile` が作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/6bedc87f-3a13-52e5-ab13-1912c8810219.png)

### Dockerイメージをビルド

`my_docker_api_image` は任意のイメージ名でOKです。

```console
docker build -t my_docker_api_image -f Dockerfile .
```

数分かかりますが、最終的に `Successfully` が出ていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/9e61c161-9b39-02fd-16f7-b546a6316eb9.png)

#### Dockerイメージの確認

```console
docker images
```

4つのイメージが作成されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/11526e9a-622f-0df4-1233-be2dcac87f23.png)

### コンテナーを実行する

```console
docker run --rm -p 5000:80 my_docker_api_image my_docker_api
```

`--rm`: このコンテナー実行後に自動的にコンテナを削除してくれます。不要なコンテナが残り続けるとストレージを圧迫します。 
`-p 5000:80`:　ローカル端末の5000番ポートをDockerコンテナー内の80番ポートに接続します。

実行後に`http://localhost:5000/WeatherForecast`にアクセスすると、Docker内のAPIを実行できることを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/8ba61695-7053-4654-ae6d-1247d0123941.png)

先程、`dotnet run` でローカル実行したときと同様のことがDockerコンテナで実行できることが分かります。

# 感想

これだけではDockerの旨味は感じられにくいが、Dockerで開発することができれば、そのままAWS ECS/Fargateを使ってデプロイできるみたい。（でも今は、.NETCore2系まで対応で3系はまだかな？）  マイクロサービスやサーバーレスアプリケーションを作成するなら使いたい技術だと感じました。

〜後日談〜
Dockerには様々な使い方があります。例えば、開発環境をメンバー全員で揃えたいとか、サービス運用を楽にしたいとか。つまり、**解決したい課題を明確にして自分がどのようにDockerを使いたいか把握する**ことが大事なんだと気づきました。

# 参考にした記事
  - [Docker で ASP.NET Core ウェブアプリケーションを動かす](https://qiita.com/Nossa/items/8b38cc5ea819dd85c51e) @Nossa さん
  - [チュートリアル: NET Core アプリのコンテナー化](https://docs.microsoft.com/ja-jp/dotnet/core/docker/build-container)
  - [チュートリアル: ASP.NET Core で Web API を作成する](https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/first-web-api?view=aspnetcore-3.1&tabs=visual-studio)

# 私たちのチームで働きませんか？
![alt](https://brides.a-tm.co.jp/wp-content/uploads/2019/11/ATEAM_BRIDES.jpg)
[エイチーム](https://www.a-tm.co.jp/)は、インターネットを使った多様な技術を駆使し、幅広いビジネスの領域に挑戦し続ける**名古屋の総合IT企業**です。
そのグループ会社である**株式会社エイチームブライズ**では、一緒に働く仲間を募集しています！

- [ハナユメ サイト開発グループ](https://jobs.qiita.com/employers/brides-a-tm/development_teams/138)
- [HIMARI開発チーム](https://jobs.qiita.com/employers/brides-a-tm/development_teams/147)
- [技術開発部](https://jobs.qiita.com/employers/brides-a-tm/development_teams/148)

上記求人をご覧いただき、少しでも興味を持っていただけた方は、まずは**チャットでざっくばらんに話**をしましょう。
技術的な話だけでなく、私たちが大切にしていることや、お任せしたいお仕事についてなどを詳しくお伝えいたします！

[Qiita Jobs](https://jobs.qiita.com/)よりメッセージお待ちしております！