AI
น้องๆ เคยสงสัยมั้ยว่า Docker มันรัน Container ได้ยังไง? ใครเป็นคนจัดการเบื้องหลัง? นั่นแหละครับ Container Runtime เข้ามามีบทบาทตรงนี้ สำคัญสุดๆ เพราะมันคือตัวที่ทำให้ Container ทำงานได้จริง ไม่ใช่แค่ไฟล์ Image สวยๆ ที่เรา Build ขึ้นมา
สมัยผมทำร้านเน็ตฯ นะ (SiamCafe.net Since 1997) สมัยนั้นยังไม่มี Docker เลยด้วยซ้ำ ต้องมานั่ง Setup Virtual Machine เอง กว่าจะลงโปรแกรมแต่ละตัวเสร็จ ปวดหัวสุดๆ Container นี่แหละช่วยชีวิตไว้เยอะ ทำให้ Deploy อะไรๆ ง่ายขึ้นเยอะเลย
Container มันก็เหมือนกล่องๆ นึง ที่ข้างในมีโปรแกรมและ Dependencies ที่โปรแกรมนั้นต้องใช้ในการรัน ถูก Package มาอย่างดี ทำให้เรามั่นใจได้ว่าไม่ว่า Container จะไปรันที่ไหน มันก็จะทำงานได้เหมือนกันเป๊ะๆ เหมือนเราย้ายเกมจากเครื่อง PC ไปลง Notebook แล้วมันเล่นได้เหมือนเดิมนั่นแหละ
Image ก็คือพิมพ์เขียวของ Container เป็นเหมือน Template ที่บอกว่า Container นี้ต้องมีอะไรบ้าง ตั้งแต่ OS, Library, ไปจนถึง Source Code ของโปรแกรมเรา เวลาเราสั่งให้รัน Container เราก็ต้องบอกก่อนว่าจะใช้ Image ไหน
Container Runtime นี่แหละคือพระเอกตัวจริง มันคือ Software ที่รับหน้าที่จัดการทุกอย่างตั้งแต่ดึง Image มาสร้าง Container, Start/Stop Container, จัดการ Network และ Storage ให้ Container รวมถึงจัดการ Resource ต่างๆ เช่น CPU และ Memory ด้วย
เอาล่ะ มาถึงขั้นตอนการใช้งานกันบ้าง ผมจะยกตัวอย่างการใช้งาน Containerd นะ เพราะเป็น Container Runtime ที่ได้รับความนิยมมากๆ ตัวนึง
ก่อนอื่นเราต้องติดตั้ง Containerd ก่อน วิธีการติดตั้งจะแตกต่างกันไปตาม OS ที่เราใช้ ผมจะยกตัวอย่างบน Ubuntu นะ
sudo apt-get update
sudo apt-get install -y containerd
หลังจากติดตั้งเสร็จแล้ว เราต้อง Config Containerd นิดหน่อย โดยการสร้างไฟล์ Config
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
จากนั้น Restart Containerd Service
sudo systemctl restart containerd
ทีนี้เราก็พร้อมที่จะดึง Image มาสร้าง Container แล้ว ผมจะดึง Image "nginx" มาลองรันดูนะ แต่ก่อนอื่นเราต้องใช้ ctr ซึ่งเป็น CLI tool ของ Containerd ก่อน
sudo ctr image pull docker.io/library/nginx:latest
sudo ctr run --rm --net-host docker.io/library/nginx:latest my-nginx
คำสั่งแรกคือการ Pull Image "nginx" จาก Docker Hub ส่วนคำสั่งที่สองคือการสร้างและรัน Container ชื่อ "my-nginx" จาก Image ที่เราเพิ่ง Pull มา
ง่ายใช่มั้ยล่ะ? แต่ถ้าอยากใช้ Docker ล่ะ? Docker ก็แค่เอา Containerd มาเป็น Container Runtime อีกทีนึง Docker จะมี Feature เพิ่มเติมที่ทำให้ User ใช้งานง่ายขึ้น เช่น Docker Compose, Docker Swarm เป็นต้น
Container Runtime ไม่ได้มีแค่ Containerd นะ ยังมีตัวอื่นๆ อีก เช่น CRI-O และ Docker Engine (ซึ่งจริงๆ ก็ใช้ Containerd อยู่เบื้องหลัง) แต่ละตัวก็มีข้อดีข้อเสียแตกต่างกันไป
CRI-O ถูกออกแบบมาสำหรับ Kubernetes โดยเฉพาะ ทำให้ Optimize ในเรื่อง Performance และ Security ได้ดีกว่า ส่วน Docker Engine ก็เน้นเรื่อง User Experience ทำให้ใช้งานง่าย เหมาะสำหรับ Developer ที่ต้องการ Deploy Application แบบ Standalone
| Container Runtime | จุดเด่น | ข้อเสีย | เหมาะกับใคร |
|---|---|---|---|
| Containerd | Performance ดี, Lightweight, ใช้ใน Kubernetes เยอะ | Config ยากกว่า Docker Engine | คนที่ต้องการ Performance สูง และใช้ Kubernetes |
| CRI-O | Optimize สำหรับ Kubernetes, Security ดี | ใช้งานยากกว่า Docker Engine | คนที่ใช้ Kubernetes เป็นหลัก |
| Docker Engine | ใช้งานง่าย, มี Feature เยอะ, Community ใหญ่ | กิน Resource เยอะกว่า Containerd/CRI-O | Developer ที่ต้องการ Deploy Application แบบ Standalone |
สรุปคือ เลือกใช้ Container Runtime ให้เหมาะสมกับ Use Case ของเรา ถ้าใช้ Kubernetes ก็แนะนำ CRI-O หรือ Containerd แต่ถ้า Deploy Application แบบ Standalone ก็ Docker Engine นี่แหละง่ายสุด
สมัยผมทำร้านเน็ตฯ นะ (SiamCafe.net Since 1997) ถ้ามี Container Runtime แบบนี้ตั้งแต่แรก ชีวิตคงง่ายขึ้นเยอะเลย ไม่ต้องมานั่งปวดหัวกับการ Config VM เอง
หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ นะครับ ถ้ามีคำถามอะไรเพิ่มเติม ถามมาได้เลย หรือจะลองเข้าไปดู Blog ของ SiamCafe Blog ก็ได้ เผื่อมี Tips & Tricks เกี่ยวกับ IT ที่น่าสนใจอีกเยอะเลย
เอาล่ะน้องๆ มาถึงหัวใจสำคัญของการใช้ Container Runtime กันแล้ว สมัยผมทำร้านเน็ตนี่ ลองผิดลองถูกมาเยอะ เจ็บมาเยอะกว่าจะคลำทางเจอ Best Practices ที่เวิร์คจริง มาดูกันว่ามีอะไรบ้าง
เหมือนเลือกร้านเกมส์ให้เหมาะกับเด็กแต่ละกลุ่มนั่นแหละ! Containerd เหมาะกับ Production ที่เน้นความ Stable และ Performance ส่วน CRI-O เกิดมาเพื่อ Kubernetes โดยเฉพาะ ถ้าไม่ได้ใช้ K8s ก็อาจจะไม่คุ้มที่จะใช้ CRI-O
สมัยผมทำร้านเกมส์ ต้องดูว่าเด็กชอบเล่นเกมส์อะไร เด็กผู้ชายชอบ CS:GO, Dota ก็ต้องลงเกมส์ให้พร้อม เด็กผู้หญิงชอบ Audition, Pangya ก็ต้องเตรียมไว้ให้พร้อม Container Runtime ก็เหมือนกัน เลือกให้เหมาะกับ workload ของเรา
ร้านเกมส์ที่ดีต้องมีกล้องวงจรปิด มี Log Server ไว้ดูว่าใครทำอะไรบ้าง Container Runtime ก็เหมือนกัน ต้อง Monitor การทำงานของ Container อย่างใกล้ชิด ดู CPU, Memory, Disk I/O และ Logging ก็สำคัญไม่แพ้กัน เอาไว้ Debug เวลา Container มีปัญหา
# ตัวอย่างการ Monitor CPU Usage ของ Container ด้วย cAdvisor
docker stats
สมัยก่อนร้านผมโดนเด็กแฮกบ่อยมาก ต้องคอย Monitor Log File ตลอดเวลา Container ก็เหมือนกัน ต้องคอยดู Log ว่ามี Error อะไรเกิดขึ้นบ้าง
สมัยก่อนร้านเกมส์ผมโดนไวรัสลงบ่อยมาก ต้องลง Anti-Virus แทบทุกวัน Container ก็เหมือนกัน ต้อง Secure ตั้งแต่ Image ที่ใช้ จนถึง Runtime Environment
ใช้ Image ที่ Verified แล้วเท่านั้น! Update Image อยู่เสมอ และใช้ Security Contexts เพื่อจำกัดสิทธิ์การเข้าถึงของ Container
เด็กบางคนเล่นเกมส์ไม่รู้จักเวลา Container บางตัวก็กิน Resource ไม่รู้จักพอ กำหนด Resource Limits ให้ Container แต่ละตัวไว้ จะช่วยป้องกันไม่ให้ Container ตัวใดตัวหนึ่งกิน Resource จนหมด ทำให้ Container อื่นๆ ทำงานไม่ได้
# ตัวอย่างการกำหนด Resource Limits ใน Docker Compose
version: "3.9"
services:
web:
image: nginx:latest
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
สมัยก่อนผมเจอเด็กบางคนเปิดเกมส์หลายจอมาก กิน Resource เครื่องจนหมด ทำให้เครื่องอื่นเล่นไม่ได้ Container ก็เหมือนกัน ต้องจำกัด Resource ให้ดี
Software ทุกอย่างต้อง Update เสมอ Container Runtime ก็เช่นกัน Update ให้เป็น Version ล่าสุดอยู่เสมอ เพื่อให้ได้ Feature ใหม่ๆ และ Patch Security Vulnerabilities
สมัยก่อนผมขี้เกียจ Update Windows มาก แต่สุดท้ายก็ต้อง Update เพราะมี Patch Security ที่สำคัญ Container ก็เหมือนกัน อย่าขี้เกียจ Update
Docker คือ Platform ที่ครอบคลุมทุกอย่าง ตั้งแต่ Image Building, Registry, Runtime ส่วน Containerd คือ Runtime Component ที่ Docker ใช้จริงๆ พูดง่ายๆ คือ Docker คือรถ Containerd คือเครื่องยนต์
CRI-O เหมาะกับคนที่ใช้ Kubernetes เป็นหลัก เพราะ CRI-O ถูกออกแบบมาให้ทำงานร่วมกับ Kubernetes โดยเฉพาะ
ถ้าเน้น Production Grade และ Performance Containerd คือตัวเลือกที่ดี ถ้าใช้ Kubernetes ก็ควรใช้ CRI-O ถ้าเพิ่งเริ่มต้น อาจจะลอง Docker ดูก่อนก็ได้
Container Runtime เป็นหัวใจสำคัญของการใช้ Container เลือกให้เหมาะกับงาน Monitor ให้ดี Secure ให้แน่น กำหนด Resource ให้พอดี และ Update อยู่เสมอ ทำตามนี้ รับรองว่า Container ของน้องๆ จะทำงานได้อย่างราบรื่นแน่นอน!
อย่าลืมไปลองเล่น iCafeForex นะน้องๆ และแวะมาอ่านบทความอื่นๆ ที่ SiamCafe Blog ได้เลย