Coding Gun

Run dotnet core ด้วย Docker


ในปัจจุบันการ run dotnet core ด้วย container นั้นง่ายกว่าการ run ผ่าน command line(dotnet cli) ที่ติดตั้งลงในเครื่องมากๆ เพราะการ run ผ่าน container นั้นมีข้อดีต่างๆ ดังนี้

ลองมาดูขั้นตอนการนำ dotnet core web api เข้าไป run ใน docker container ตามนี้ได้เลย

สร้าง Web api project ขึ้นมาใหม่ โดยใช้ dotnet cli

  1. เปิด .NET Core Command-line ขึ้นมา
  2. สร้าง Project โดยใช้คำสั่งนี้
dotnet new webapi -o Weather.Api 
  1. เปิด Project ด้วย VS Code
  2. ติดตั้ง Extensions ใน VS Code 2 ตัวคือ
    • Plugin Docker
    • Plugin C#
  3. Add Docker files โดยกด Short Key “Ctrl+Shift+P”
    • เลือก Add Docker Files to Workspace
    • เลือก Application Platform เป็น .NET: ASP.NET Core
    • เลือก Operating System เป็น Linux
    • Port(s) สำหรับการ Run Docker Container(ค่าเริ่มที่ระบบตั้งค่ามาให้คือ Port 5000 เป็นต้นไป)
    • เลือก Include Docker Compose files? ตอบ Yes

VS Code จะสร้าง Dockerfile และ Docker compose file มาให้

ASP.Net จะมีการ Run แบบ Multi-stage การทำงานดังนี้

การ build docker image แบบ multi-stage(container mage ที่ build กับ container image ที่ใช้ในการ run เป็นคนละตัว) จะช่วยให้มี container ของเรามีความปลอดภัยมากขึ้น เพราะใน container ของเราจะมีแค่ code ที่ต้องใช้ในการ run เท่านั้น

ใน dotnet core จะมีวิธีการสร้าง image ดังนี้

  1. กำหนดว่าจะใช้ container image ตัวไหนในการ run dotnet จากในตัวอย่างเราต้องการ run asp.net เราเลยใช้ “mcr.microsoft.com/dotnet/aspnet:7.0
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app

# ค่านี้จะขึ้นอยู่ที่เราตอบคำถามในขั้นตอนที่ 5 default จะเป็น 5000
EXPOSE 8000 
  1. ใช้ dotnet core sdk มา build ไฟล์ .dll (mcr.microsoft.com/dotnet/sdk:7.0) โดยใน block นี้จะมีอยู่ 2 ขั้นตอนคือ
  2. run dotnet restore เพื่อ install dependencies ต่างๆ
  3. build ไฟล์ “.dll” ด้วยคำสั่ง dotnet build

เราจะ deploy dotnet core version ไหนให้ใช้ sdk version นั้นในการ build

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["Docker.Dotnet.csproj", "./"]
RUN dotnet restore "Docker.Dotnet.csproj"
COPY ..
WORKDIR "/src/."
RUN dotnet build "Docker.Dotnet.csproj" -c Release -o /app/build
  1. publish Docker.Dotnet.dll และ dependencies ต่างๆไปไว้ที่ /app/publish
FROM build AS publish
RUN dotnet publish "Docker.Dotnet.csproj" -c Release -o /app/publish /p:UseAppHost=false
  1. ทำการ Copy Docker.Dotnet.dll จาก /app/publish เข้าไปไว้ใน base image ที่เราเขียนไว้ในข้อที่ 1
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENDPOINT ["dotnet", "Docker.Dotnet.dll"]

วิธีการ Build Container

การ build container ออกมาใช้งาน มีอยู่ 2 ทางเลือกคือ

  1. build ด้วย docker command
  2. build ด้วย docker-compose

วิธีที่ 1 Build container ด้วย docker command

การ Run Container ด้วยวิธีนี้ จะใช้คําสั่งที่ค่อนข้างยาว Run Container ได้แบบที่ละตัว และยุ่งยากในการตั้งค่า Environment Variables

  1. ใช้คําสั่ง Docker
docker build -t weatherapi:1.0 .
  1. Run Image ขึ้นมาเป็น Container ด้วยคำสั่งนี้
docker -d -p 8000:8000 –name weatherapi weatherapi:1.0
  1. จะได้ Server อยู่ที่ port:8000
  2. สามารถเเข้าดู API ผ่าน URL: http://localhost:8000/WeatherForecast

การตั้งค่า Environment Variable เป็น Development สำหรับใช้ Swagger อ่านและทดสอบ API

  1. Run Image ขึ้นมาเป็น Container ด้วยคำสั่ง
docker -d -p 8000:8000 –name weatherapi \
       -e ASPNETCORE_ENVIRONMENT=Development weatherapi:1.0
  1. สามารถเข้าดู API ผ่าน URL: http://localhost:8000/swagger

วิธีที่ 2 Build container ด้วย docker-compose

การใช้งานผ่าน docker-compose ง่ายกว่ามากๆ นอกจากการตั้งค่า Environment Variable แบบนี้แล้ว ยังสามารถเพิ่มองค์ประกอบอื่น ๆ เข้ามาใน docker-compose ได้ด้วย

  1. ใช้คําสั่ง docker-compose
docker-compose up -d
  1. สามารถเเข้าดู API ผ่าน URL: http://localhost:8000/WeatherForecast

การตั้งค่า Environment Variable เป็น Development สำหรับใช้ Swagger อ่านและทดสอบ API

  1. ใช้คําสั่ง
docker-compose -f docker-compose.debug.yml up -d
  1. สามารถเข้าดู Open API ผ่าน URL: http://localhost:8000/swagger
Phanupong Permpimol
Follow me