Run dotnet core ด้วย Docker
ในปัจจุบันการ run dotnet core ด้วย container นั้นง่ายกว่าการ run ผ่าน command line(dotnet cli) ที่ติดตั้งลงในเครื่องมากๆ เพราะการ run ผ่าน container นั้นมีข้อดีต่างๆ ดังนี้
- เราสามาถเลือกได้ว่าจะ run ใน dev environment หรือ production
- เราจะมั่นใจเวลา deploy ขึ้นไปบน server เพราะเราก็จะเอา container ที่ run ตอน test นี่แหละไป run บน server จริง
- สามารถนำไป deploy ลงไปใน kubernetes cluster ต่อได้ง่าย
- สามารถเลือก version ของ dotnet core ที่จะนำมา run ได้หลากหลาย
ลองมาดูขั้นตอนการนำ dotnet core web api เข้าไป run ใน docker container ตามนี้ได้เลย
สร้าง Web api project ขึ้นมาใหม่ โดยใช้ dotnet cli
- เปิด .NET Core Command-line ขึ้นมา
- สร้าง Project โดยใช้คำสั่งนี้
dotnet new webapi -o Weather.Api
- เปิด Project ด้วย VS Code
- ติดตั้ง Extensions ใน VS Code 2 ตัวคือ
- Plugin Docker
- Plugin C#
- 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 มาให้
- Dockerfile: ใช้สำหรับการ Build Container บน Docker ซึ่งสารมารถปรับเปลี่ยน Version ของ .Net Core ได้
- Docker-compose.yml และ Docker-compose.debug.yml: ใช้สำหรับการรวม Container หลาย ๆ ตัวเข้ามาไว้ด้วยกัน
- .dockerignore ใช้ระบุว่า ไฟล์ไหนไม่ต้องเอาเข้าไปใน container
- .vscode: จะประกอบด้วยสองไฟล์คือ launch.json และ tasks.json ซึ่งจะไว้สำหรับการ launch ผ่าน Docker Command ได้
ASP.Net จะมีการ Run แบบ Multi-stage การทำงานดังนี้
การ build docker image แบบ multi-stage(container mage ที่ build กับ container image ที่ใช้ในการ run เป็นคนละตัว) จะช่วยให้มี container ของเรามีความปลอดภัยมากขึ้น เพราะใน container ของเราจะมีแค่ code ที่ต้องใช้ในการ run เท่านั้น
ใน dotnet core จะมีวิธีการสร้าง image ดังนี้
- กำหนดว่าจะใช้ 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
- ใช้ dotnet core sdk มา build ไฟล์ .dll (mcr.microsoft.com/dotnet/sdk:7.0) โดยใน block นี้จะมีอยู่ 2 ขั้นตอนคือ
- run dotnet restore เพื่อ install dependencies ต่างๆ
- 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
- 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
- ทำการ 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 container ด้วย docker command
การ Run Container ด้วยวิธีนี้ จะใช้คําสั่งที่ค่อนข้างยาว Run Container ได้แบบที่ละตัว และยุ่งยากในการตั้งค่า Environment Variables
- ใช้คําสั่ง Docker
docker build -t weatherapi:1.0 .
- Run Image ขึ้นมาเป็น Container ด้วยคำสั่งนี้
docker -d -p 8000:8000 –name weatherapi weatherapi:1.0
- จะได้ Server อยู่ที่ port:8000
- สามารถเเข้าดู API ผ่าน URL: http://localhost:8000/WeatherForecast
การตั้งค่า Environment Variable เป็น Development สำหรับใช้ Swagger อ่านและทดสอบ API
- Run Image ขึ้นมาเป็น Container ด้วยคำสั่ง
docker -d -p 8000:8000 –name weatherapi \
-e ASPNETCORE_ENVIRONMENT=Development weatherapi:1.0
- สามารถเข้าดู API ผ่าน URL: http://localhost:8000/swagger
วิธีที่ 2 Build container ด้วย docker-compose
การใช้งานผ่าน docker-compose ง่ายกว่ามากๆ นอกจากการตั้งค่า Environment Variable แบบนี้แล้ว ยังสามารถเพิ่มองค์ประกอบอื่น ๆ เข้ามาใน docker-compose ได้ด้วย
- ใช้คําสั่ง docker-compose
docker-compose up -d
- สามารถเเข้าดู API ผ่าน URL: http://localhost:8000/WeatherForecast
การตั้งค่า Environment Variable เป็น Development สำหรับใช้ Swagger อ่านและทดสอบ API
- ใช้คําสั่ง
docker-compose -f docker-compose.debug.yml up -d
- สามารถเข้าดู Open API ผ่าน URL: http://localhost:8000/swagger