วันนี้เราลองมาทำ Windows Container เล่นก้นดูหน่อยดีกว่าครับ เนื่องจากว่าไม่ค่อยมีใครใช้งาน WC(Windows Container) กันเลย ทำใมกันนะ….

จากที่เคยลองทำมาตัว WC เองจะค่อนข้างมีขนาดใหญ่มากครับ ดังนั้นควรที่จะมีพื้นที่บน Hard disk เอาไว้อย่างน้อยๆ 40–60 GB เอาไว้จะดีกว่าครับ น้อยกว่านี้ไม่แนะนำครับ และอีกเหตุผลหนึ่งเหมือนว่าจะทำการ scale ยากกว่าการใช้ LC (Linux Container) ครับ (แต่อันนี้ผมยังไม่ได้ลองครับ)

ก่อนอื่นผมจะสร้างโฟลเดอร์เอาไว้ประมาณนี้ก่อนนะครับ

  • HelloWorld-MVC จะเป็นตัวโปรเจคที่เราจะนำมาใช้งานในบทความนี้ครับ
  • S1 จะเป็นวิธีทำวิธีแรก
  • S2 จะเป็นวิธีทำวิธีที่สอง

มาเริ่มกันด้วยการสร้างโปรเจค HelloWorld-MVC กันก่อนโดยจะใช้ .NET Framework 4.8 ครับ

Create HelloWorld-MVC project

ส่วน Template ก็จะเลือกเป็นแบบ MVC ตามนี้

Project Template

ส่วนประกอบต่างๆ ของโปรเจคก็จะมีดังนี้

Project structure

จากนั้นก็ให้ลองรันโปรเจคดูว่าทำงานได้หรือเปล่าก่อนนะครับอันนี้คือหน้าตาของเว็บที่เราพึ่งสร้างครับ

HelloWorld Webpage

ส่วนขั้นตอนการทำ WI (Windows Image) นั้นมี 2 วิธีให้เลือกครับ แล้วแต่ว่าถนัดแบบไหนครับ

  • วิธีแรก คือ Publish Code เอาไว้ก่อน แล้วค่อยเอามาทำ WI

เริ่มแรกก็ทำการ publish โปรเจคเอาไว้ในโฟลเดอร์ S1\published กัน โดยคลิ๊กขวาที่โปรเจค และเลือก publish

จากนั้นจะมาหน้าต่างขึ้นมาให้เราเลือกว่าจะ publish โปรเจคไปที่ไหน ให้เลือกเป็นแบบ Folder แล้วคลิกที่ Next

หลังจากนั้นให้กำหนดโฟลเดอร์ไปที่โฟล์เดอร์ S1\published แล้วคลิกที่ Finish

และจะปรากฎหน้าจอ Publish ขึ้นมา ให้คลิกที่ปุ่ม publish ได้เลย

รอจนกระทั่ง publish จนเสร็จแล้ว ก็เปิดโฟลเดอร์ S1 ขึ้นมา

ในโฟลเดอร์ตอนนี้จะมีโฟลเดอร์ที่เราเก็บโค๊ดที่พร้อมใช้งานแล้ว ดังภาพ

จากนั้น เราก็จะมาสร้าง Dockerfile ด้วย VSCode กัน ซึ่งคำสั่งภายใน Dockerfile จะมีดังนี้

FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8

COPY ./published/ /inetpub/wwwroot #copy publish to wwwroot

คำสั่งมีแค่นี้จริงๆ ครับ ==”

ต่อากนั้นเราก็จะมาทำการ Build image กันเลยครับ แต่ก่อนอื่น อย่าลืมเปลี่ยน Docker ไปเป็น Windows Container กันก่อนนะครับ โดยการคลิกขวาที่ Docker และเลือกที่ Switch to Windows containers…

ถ้าเกิดว่าเจอหน้าต่างนี้ก็อย่าลืมไปเปิด Hyper-V ก่อนนะครับ หรือจะใช้คำสั่งในภาพกับ Powershell เลยก็ได้ครับ

PS> Enable-WindowsOptionalFeature -Online -FeatureName $(“Microsoft-Hyper-V”, “Containers”) -All

แล้วจากนั้นต้อง Restart เครื่องก่อนถึงจะทำงานต่อได้นะครับ

หลังจากนั้นก็กลับไปที่ VSCode และกดปุ่ม Ctrl + Shift +~ เพื่อเปิด CLI ขึ้นมา และพิมพ์คำสั่ง

c:> docker build -t <ตั้งเอาเองได้เลยครับ>.

ห้ามลืมว่าต้องมี “.” ปิดท้ายคำสั่ง docker build นะครับ ซึ่งจะเป็นการระบุ build context ว่าเราจะใช้ที่ไหน ต่อจากนั้นก็กด Enter แล้วรอครับ

จากนั้นก็ทดลองสั่งรัน WI ของเรากัน ด้วยคำสั่ง

c:> docker run -p 89:80 <docker image name>

หลังจากกด Enter ไปแล้วก็ลองเปิดหน้า browser ไปที่ http://localhost:89 ก็จะเห็นหน้าเว็บของเราที่ถูกสั่งรันขึ้นมาจาก docker แล้วครับ

  • วีธีที่สอง คือ ทำตั้งแต่ publish Code และทำการ Deploy ลง Base Image\

เริ่มต้นเราจะ copy โปรเจค HelloWorld-MVC ไปใส่ไว้ใน S2 ดังภาพ

จากนั้นเราก็จะไปสร้าง Dockerfile กันต่อเลยครับ สำหรับคำสั่งภายใน Dockerfile ก็จะมีดังนี้

# Set base image to publish source code
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS build
# Set work directory
WORKDIR /app
# Copy solution file to work directory
COPY [“HelloWorld-MVC.sln”,”.”]
# Copy project to work directory
COPY [“HelloWorld-MVC/”, “HelloWorld-MVC/”]
# Restore nuget package
RUN nuget restore
# publish project and set output to /app/publish
RUN msbuild HelloWorld-MVC/HelloWorld-MVC.csproj /p:Configuration=Release /p:OutputPath=/app/publish

# Set base image to run
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8 AS runtime
# Set direcory to deploy publish project
WORKDIR /inetpub/wwwroot
# Copy publish project from previous stage
COPY — from=build /app/publish/. .

หลังจากนั้น เราก็จะใช้คำสั่งเพื่อ build image กัน

c:> docker build -t <image name> .

อย่าลืม “.” ต่อท้ายด้วยนะครับ

จากนั้นก็นั่งรอไปสักพักจนเสร็จ

แล้วหลังจากนั้น เราก็จะมาทดสอบ image ของเราด้วยคำสั่ง

c:> docker run -p 90:80 <image name>

หลังจากกด Enter ไปแล้วก็ลองเปิดหน้า browser ไปที่ http://localhost:90 ก็จะเห็นหน้าเว็บของเราที่ถูกสั่งรันขึ้นมาจาก docker แล้วครับ

เสร็จกันไปแล้วครับ สำหรับการทำ WC ทั้ง 2 แบบ ตอนนี้เราก็จะไปดูขนาดไฟล์ ของ Image ทั้ง 2 ตัวกันครับ

สำหรับบทความนี้ก็ขอจบเพียงเท่านี้ครับ หากผิดพลาดประการใดก็ขออภัยมา ณ ที่นี้ด้วยนะครับ

Source Code :=> https://github.com/VatthanachaiW/windowscontainer-101