# 容器化ASP.NET Core應用
本文參考了[示例](https://docs.docker.com/engine/examples/dotnetcore/)。
## 最簡單的Web API應用
.net core作為微軟新一代的跨平臺開源環境,無論是官方還是社區都對其的容器化有極大的熱情。
首先,我們利用dotnet CLI工具創建一個新的Web API應用,并在本地測試一下。
```PowerShell
# 新建項目
dotnet new webapi -o aspnetapp
# 切換目錄
cd aspnetapp
# 構建
dotnet build
# 運行
dotnet run
```
打開瀏覽器鍵入[http://localhost:5000/api/values](http://localhost:5000/api/values),我們可以看到返回的樣例。

顯然,和之前的python應用不同,.net core需要經過build才能運行。為了方便build,微軟官方也推出了一個build用的鏡像`microsoft/aspnetcore-build`。
這里,參考示例,我們利用`microsoft/aspnetcore-build`來build應用,并將輸出復制到`microsoft/aspnetcore`中來運行。
```Dockerfile
# build鏡像
FROM microsoft/aspnetcore-build AS build-env
WORKDIR /app
# 還原Nuget包
COPY *.csproj ./
RUN dotnet restore
# 復制所有文件
COPY . ./
# 發布應用
RUN dotnet publish -c Release -o out
# 運行鏡像
FROM microsoft/aspnetcore
WORKDIR /app
# 從build鏡像中復制輸出
COPY --from=build-env /app/out .
# 設置入口
ENTRYPOINT [ "dotnet", "aspnetapp.dll" ]
```
然后,就是`docker build`了?不,在這里我們還要多加一步,因為之前我們已經在本地運行過了,.net core會在當前目錄下創建**/bin**和**/obj**來儲存二進制文件和中間文件,而這部分在我們構建鏡像時是不需要的,我們可以通過**.dockerignore**來忽略他們(就和**.gitignore**一樣)。
在當前目錄下,創建一個**.dockerignore**文件,鍵入以下內容。
```txt
/bin
/obj
```
最后,就是我們熟悉的`docker build -t demo:aspnetapp .`。但注意在build結束后,你會發現除了我們指定生成的demo:aspnetapp鏡像外還有一個`<none>:<none>`的dangling鏡像,這個鏡像就是我們在**Dockerfile**前半部分中用的build環境,如果覺得不再需要了,可以通過`docker image prune`來刪除所有dangling鏡像。
最后的最后,注意一個細節。。也不清楚microsoft/aspnetcore中的環境是怎么配置的,按照以上步驟生成的鏡像在運行時監聽的是80端口。所以,在啟動實例時,記得用`-p 80:80`來映射80端口。