Containers คืออะไร แตกต่างจาก VM อย่างไร ทำไมถึงเป็นที่นิยม?

11,681
11,681
          สวัสดีครับเพื่อน ๆ ชาว IT ในช่วง 4-5 ปี มานี้ หลาย ๆ คนคงจะเคยได้ยินชื่อของ Containers กันมาบ้างพอสมควร แต่อาจจะยังไม่เคยได้สัมผัสหรือทดลองใช้งานมาก่อน เดี๋ยววันนี้เราจะมาดูนิยาม, ความสามารถ และข้อดีที่เมื่อเทียบกับ Virtual Machine กัน แล้วอาจจะทำให้คุณเปลี่ยนใจมาใช้ Containers แทนได้เลยทีเดียว มาเข้าสู่เนื้อหากันได้เลยครับ!

Diagram of Virtual Machines vs Containers.

         ขอเกริ่นนำกันก่อนในเรื่องของเทคโนโลยี Virtualization ซึ่งเป็นสิ่งที่เข้ามาแทนที่ระบบ Server แบบเดิม ๆ ที่เป็น Bare-metal หรือ Physical Server เนื่องจากผู้คิดค้นระบบต้องการให้สามารถใช้ Resource ของ Server ให้มีประสิทธิภาพสูงสุด จากที่แต่ก่อนจะต้องติดตั้ง App หรือ Database แยก Server กัน จึงทำให้เกิดการทำ Virtual Machines ขึ้นมานั่นเองครับ

Infrastructure ที่ต้องเตรียมก่อนที่จะสร้าง Virtual Machine จะประกอบไปด้วย
    • Infrastructure – โครงสร้างพื้นฐาน หรือ Physical Server นั่นเอง
    • Host Operating System – เป็น Operating System ที่ติดตั้งบน Server เพื่อรองรับการติดตั้งของ Hypervisor ต่อไป
    • Hypervisor – เป็น Software ที่ติดตั้งบน Host OS ซึ่งหลังจากติดตั้งแล้วจะทำให้สามารถสร้างและจัดการ Virtual Machines ได้นั่นเอง
*  บางผู้พัฒนาจะพัฒนา Software ของตัวเองให้รวมเอาทั้ง Host OS และ Hypervisor เข้าด้วยกันเลย เรานิยาม Software แบบนี้ว่า Type -1 Hypervisor ที่นิยมใช้กันในไทยก็มี VMware ESXi, Microsoft Hyper-V , Nutanix AHV และ KVM เป็นต้น
ส่วน Type-2 Hypervisor ก็จะต้องติดตั้งตามโครงสร้างที่ได้กล่าวไปเบื้องต้นครับ ชื่อที่คุ้นเคยกัน ได้แก่ VirtualBox และ VMware Workstation
    • Virtual Machine – เปรียบเสมือน Server เสมือนที่สามารถใช้งานได้เทียบเท่ากับ Physical Server แบบเดิม ๆ เลย ส่วนประกอบมีดังนี้
      • Guest OS –  เป็นระบบปฏิบัติการทั่วไปที่ติดตั้งบน Server เช่น Windows หรือ Linux
      • Binary/Library – เป็นชุดข้อมูลที่อาจจะเป็นไฟล์ภาพ,ไฟล์เสียง หรือไฟล์ที่ใช้ในการรันโปรแกรม
      • Application – เป็น Software หรือ โปรแกรมที่ออกแบบให้ End user ใช้งาน เช่น Web Browser และ Spreadsheet เป็นต้น
         ด้วยการที่เราสามารถสร้าง VM หลาย ๆ ตัวเพื่อ Run บน Physical Server เครื่องเดียวกันได้ ทำให้เราได้ประโยชน์ในกรณีที่เราอยากติดตั้ง Operating System ที่แตกต่างกัน เช่น อยากได้ Windows Server ไว้ทำ Active Directory และอยากได้ Linux ไว้ติดตั้ง PostgreSQL เป็นต้น โดยที่แต่ละ VM ก็จะมี OS และ Bins/Libs เป็นของตัวเอง อีกทั้งยังมีประโยชน์ในการทำ Disaster Recovery เนื่องจาก DR Site ไม่จำเป็นต้องมี Hardware เหมือนกันต้นทางก็ได้ ถ้าเป็น VM

นิยามของ Containers เปรียบเสมือนตู้ Container ที่อยู่บนเรือที่สามารถยกเข้า/ยกออกได้ สำหรับ Infrastructure ที่ต้องเตรียมสำหรับรองรับ Container จะประกอบไปด้วย
    • Infrastructure – โครงสร้างพื้นฐาน หรือ Physical Server นั่นเอง
    • Host Operating System – เป็น Operating System ที่ติดตั้งบน Server อาจะเป็น Windows หรือ Linux ก็ได้
    • Container Runtime – หรือที่หลาย ๆ คนรู้จักกันในชื่อ Container Engine เป็น Software ที่ใช้รองรับการสั่งงานผ่าน Command Line สำหรับ Brand ที่นิยมใช้กันคือ Docker ครับ แต่บางรายอาจจะพัฒนา container platform ขึ้นมาใช้เอง
    • Binary/Library – เป็นชุดข้อมูลที่อาจจะเป็นไฟล์ภาพ,ไฟล์เสียง หรือไฟล์ที่ใช้ในการรันโปรแกรม
    • Application – เป็น Software หรือ โปรแกรมที่ออกแบบให้ End user ใช้งาน เช่น Web Browser และ Spreadsheet เป็นต้น
สังเกตได้ว่า Containers จะติดตั้งอยู่ Host OS ที่อยู่เหนือ Infrastructure โดยแต่ละ Containers จะใช้ OS ร่วมกัน ทำให้มีขนาดไม่ใหญ่มากเมื่อเทียบกับ VM ทำให้ประหยัด Resource รวมไปถึงการที่มี OS เดียวทำให้ดูแลเรื่องปัญหาการแก้ Bug, การ Patch และอื่น ๆ ทำงานได้ง่าย ซึ่ง Concept ก็คล้าย ๆ กับของ Hypervisor แต่ดูแลน้อยกว่าและเสียหายได้ยากกว่าเนื่องจากไม่ต้องใช้ OS แยกในการ Run Application
จากที่ได้นิยามความหมายไป Containers เหมาะกับการสร้างเพื่อรองรับและทดสอบ Application  ที่สามารถใช้งานได้จากหลายช่องทาง ไม่ว่าจะเป็น Laptop, On-Premise Server หรือแม้กระทั่งบน Cloud

ประโยชน์ของ Containers มีอะไรบ้าง?
    • ใช้ Resource น้อยกว่า เนื่องจากโครงสร้างของ Containers ไม่จำเป็นต้องมี Operating System image เหมือนกับ VM ทำให้ใช้งาน Resources ไม่ได้มากเท่า
    • เพิ่มช่องทางในการ Run Application เนื่องจาก Application ที่ Run อยู่บน Containers สามารถ Deploy ไปบน OS และ Hardware อะไรก็ได้ (อาจไม่ Support ทั้งหมด แต่ Support เป็นส่วนใหญ่)
    • Operation ทำงานได้อย่างราบรื่น เพราะ Application ที่อยู่บน Containers จะทำงานได้เหมือนเดิม ไม่ว่าจะ Deploy ไปไว้บนไหนก็ตาม
    • ให้ประสิทธิภาพการทำงานดี เพราะว่าสามารถ Deploy ได้ไว Update Patch ได้ง่ายไม่กระทบการทำงานส่วนอื่น และยัง Scale ได้ง่าย หาก Resource ไม่เพียงพอ
Used Case ของ Container Server มีอะไรบ้าง? องค์กรส่วนใหญ่ที่ใช้ Container จะนิยมใช้งานเพื่ออะไร?
    • Lift & Shift existing applications ย้าย Application เดิมที่มีอยู่ด้วย Containers ไปยัง Infrastructure ที่ใหม่หรือดีกว่าเดิม แม้ว่าแนวทางนี้จะใช้ประโยชน์จาก Operating System ที่เป็นแบบ Virtual แต่การทำแบบนี้จะไม่ได้ใช้ประโยชน์จากความสามารถของ Container จริง ๆ ที่สามารถทำงานแยกส่วนของแต่ละ App ได้ เป็นเพียงแค่การ Migrate Application ธรรมดา
    • Refactor existing applications ปรับปรุง Application เดิมให้สามารถทำงานบน Container ได้ แน่นอนว่ายากกว่าการทำแบบ Lift & Shift แต่การทำแบบนี้จะทำให้ได้ใช้ประโยชน์จากความสามารถของ Container จริง ๆ
    • Develop new container-native applications พัฒนา Application ใหม่บน Container เลย ประโยชน์เหมือนข้อ 2
    • Better support for Microservices หากมี Application หลาย ๆ ตัว การที่ใช้งาน Containers จะสะดวกเพราะสามารถ Run อยู่ด้วยกันได้ โดยที่ไม่กระทบการทำงานของกันและกัน อีกทั้งยังสะดวกในการ Deploy
    • Provide DevOps support for continuous integration & deployment (CI/CD) Support DevOps ด้วยการ Build, Test และ Deploy จาก Container images เดียวกัน
    • Provide easier deployment of repetitive jobs & tasks ใช้ Deploy เพื่อรองรับ Process ที่ส่วนใหญ่ Run เป็น Background เช่น พวก Batch jobs หรือ ETL Functions
ความแตกต่างของ VM และ Container Server มีอะไรบ้าง? 
จากนิยามที่ผมได้แนะนำไปในช่วงต้นของ Blog สิ่งที่แตกต่างจะสรุปออกมาได้ตามตารางนี้ครับ


แล้วเลือกใช้อะไรถึงจะเหมาะกับเรา?
          จริง ๆ ก็อยู่ที่คุณจะเลือกใช้ ถ้าต้องการแค่ Instance ตัวเล็ก ๆ ที่ย้ายง่าย ๆ หรือแค่จะสร้างไว้เพื่อ Test แนะนำให้ใช้ Containers เพราะสามารถย้ายไปที่ Physical Server, Private Cloud, Public Cloud หรือ Hybrid Cloud ก็ได้ Containers คือ Server ในอุดมคติที่เหมาะกับการใช้เอาไว้สำหรับรองรับการ Deploy app ที่เป็น Cloud-native app ที่มี Service ขนาดเล็ก ๆ หลาย ๆ ตัวทำงานร่วมกัน (Microservices) มีเงื่อนไขแค่อย่างเดียวคือ ต้องหา OS ที่ Support ในการติดตั้ง Containers ฉะนั้นใช้ทำอะไรดี?
      • สร้าง Cloud-native app
      • ทำ Microservices
      • Developer สามารถ Deploy ได้เอง สามารถทำ CI/CD ได้ง่ายขึ้น
      • สร้าง Project ใหม่ ๆ โดยไม่กระทบกับ Project อื่น ๆ โดยการ Share OS ร่วมกัน
สำหรับ Virtual Machines จะต้องใช้การดูแลมากกว่า ยืดหยุ่นน้อยกว่า Containers เนื่องจากจะต้องมีการติดตั้ง Operating System, Libraries ให้เหมาะกับ Application ที่จะใช้งาน ถ้าเทียบกับ Containers แล้ว VM จะเหมาะกับ
      • Workload แบบดั้งเดิม ใช้กันเฉพาะภายในองค์กร
      • แยก Instance เพื่อป้องกันความเสี่ยงเรื่องการพัฒนา Software หรือ Application
      • ต้องการใช้งาน OS ที่อยู่ภายใน OS อีกที เช่น Run UNIX บน Linux
แถมให้เพิ่มเติมอีกเรื่องนึงคือ การที่เรามี Instance อยู่เพียงแค่ไม่กี่ตัวการจัดการจะค่อนข้างทำได้ไม่ยากลำบากนัก แต่ถ้าเริ่มมีการใช้งานจำนวน Instance ที่มากขึ้น การจัดหมวดหมู่ของ Instance ก็ค่อนข้างสำคัญ เนื่องจากจะช่วยให้ Admin ทำงานได้ง่ายขึ้น ของ Containers ก็มี Tool ที่นิยมนำมาใช้งานกัน ได้แก่ Docker Swarm, และ Kubernetes (k8s) เป็นต้น สำหรับฝั่ง Hypervisor ของ Brand VMware ก็มี vCenter ที่ช่วยทำ Cluster ให้กับ ESXi ของ Hyper-V ก็ใช้ Hyper-V Manager แต่อาจจะทำ Cluster ด้วย Windows Clustering ซึ่งอาจจะยุ่งยากเล็กน้อย แต่ก็ช่วยลดความยุ่งยากในการจัดการ VM ลงไปได้เยอะ
เป็นอย่างไรบ้างครับ สำหรับ Blog นี้ก็จะเป็นการนิยาม Containers และเมื่อเปรียบเทียบกับ VM แล้ว อาจจะได้ทำให้ท่านได้ไอเดียนำไปปรับใช้กันได้นะครับ  หวังว่าจะเป็นประโยชน์สำหรับทุก ๆ ท่านนะครับ หากมีข้อมูลที่ผิดพลาดหรือตกหล่นประการใด ต้องขออภัยไว้ ณ ที่นี้ด้วย ท่านสามารถแนะนำหรือ Comment ได้ที่โพสด้านล่างนะครับ
ขอบคุณครับ
ถ้าท่านสนใจบริการ Virtual Machines สามารถติดต่อ Cloud HM ได้ผ่านช่องทางนี้นะครับ
— Cloud HM