ในบทความนี้เราพาจะทุกท่านมารู้จักเกี่ยวกับคำศัพท์ที่เรียกว่า Containers ถึงประวัติ นิยาม คุณสมบัติ และ ประโยชน์ในโลกแห่งการพัฒนาแอปพลิเคชัน
Containers คืออะไร?
Containers คือการแพ็กรวมชุดของซอฟต์แวร์ที่จำเป็นสำหรับรันในสภาพแวดล้อมต่างๆ หรือในมุมของผู้ให้บริการ Container ชื่อดังอย่าง Docker พวกเขานิยามให้ Container คือ ยูนิตมาตรฐานของซอฟต์แวร์ที่บรรจุเอาโค้ดทั้งหมด รันไทม์ การตั้งต่าต่างๆ ไลบรารีของระบบ และ Dependencies ของแอปที่จำเป็นเอาไว้
โดยกลไกที่ทำให้ Container สามารถไปทำงานได้ในสภาพแวดล้อมต่างๆได้เพราะไอเดียของการทำ Virtualization ระดับ OS ที่แตกต่างกันกับระดับของ Virtualization โดยทั่วไปที่เรารู้จักกับซึ่งมี OS เป็นของตัวเองที่จำลองฮาร์ดแวร์ต่างๆ (ตามภาพด้านล่าง)
Containers มีตัวตนขึ้นเมื่อไหร่
แม้ Containers เหมือนปรากฏขึ้นเมื่อไม่นานเท่าไหร่นักสำหรับหลายๆคน แต่อันที่จริงแล้วเทคโนโลยีนี้มีประวัติที่ต้องนับรวมเรื่อง Virtualization ด้วย ซึ่งในปี 1970 IBM คือผู้คิดค้นเทคโนโลยีนี้ขึ้นมา ผ่านมาอีก 12 ปี ‘chroot’ หรือ system call ใน UNIX ก็เริ่มฉายภาพลางๆที่ทำให้โปรเซสสามารถเปลี่ยนมือจาก Root directory ได้ และเมื่อปี 2000 FreeBSD ก็แล้วให้เห็นถึงอีกก้าวของศักยภาพใน chroot ที่เกิดการแบ่งแยกมากขึ้น ด้วยสิ่งที่เรียกว่า ‘jails’
แต่ก้าวสำคัญที่แท้จริงเป็นของ Google ในปี 2008 พวกเขาได้คิดค้นเรื่องของ cgroups(Control Groups) และ namespace โดยส่วนแรกคือฟีเจอร์ของ Linux Kernel ที่ช่วยจัดการและจำกัดทรัพยากรสำหรับโปรเซส เช่น ซีพียู หน่วยความจำ และ I/O เป็นต้น ในขณะที่ namespace เป็นฟีเจอร์สำคัญที่ทำให้เกิด Process Isolation ในมุมมองการใช้งานทรัพยากรได้อย่างแท้จริง โดย namespace มีหลายชนิด เช่น Process ID, Network ID, Mount Namespace(มองภาพของ filesystem ต่างกัน), UTS (hostname และ domain name) และอื่นๆ
เมื่อฟีเจอร์ของ OS พร้อมแล้ว จึงนำไปสู่ Linux Containers Runtime แต่ก็มีผู้ที่นำไปพัฒนาต่อยอดจนได้รับความนิยมมากกว่า โหมสะพัดให้หลายคนสับสนเมื่อพูดถึง Container โดยผู้ที่จุดกระแสผู้นั้นชื่อว่า ‘Docker’ ซึ่งพวกเขาไม่ใช่ตัวแทนของเทคโนโลยีนี้ เป็นเพียงผู้เล่นหนึ่งที่ได้รับความนิยมเท่านั้น
4 คุณสมบัติของ Containers
- Isolation – อย่างที่ทราบแล้วว่า Containers ที่หลายคนมักเปรียบเทียบกับตู้คอนเทนเนอร์ที่ภายในมีส่วนประกอบของซอฟต์แวร์ที่พร้อมรันได้ทันทีของแต่ละแอปพลิเคชัน โดยทำให้โฮสต์ตัวเดียวกันสามารถรันแอปพลิเคชันหลายๆตัวได้โดยไม่เกี่ยวข้องกัน
- Portability – แพ็กเกจแบบพร้อมใช้ยังสามารถนำไปรันได้ในสภาพแวดล้อมใดๆ โดยไม่ต้องปรับแก้เพราะมีทุกอย่างพร้อมแล้ว
- Efficiency – Containers ขอแชร์ทรัพยากรร่วมกับ OS ของโฮสต์ ซึ่งทำให้เข้าถึงทรัพยากรได้อย่างมีประสิทธิภาพมากกว่า VM ที่อยู่เลเยอร์ที่สูงกว่าต้องผ่าน OS อีกชั้นหนึ่ง
- Scalability – เราสามารถเพิ่มจำนวนของ Containers ได้อย่างรวดเร็วเพราะด้วยความที่มันมีขนาดเล็กไร้การผูกกับ OS ทำให้เหมาะอย่างยิ่งสำหรับงานแอปพลิเคชันที่ต้องการเพิ่มลดจำนวนเพื่อรองรับโหลดที่เข้ามา แต่ตรงจุดนี้ต้องอาศัยบริหารจัดการซึ่งจะนำไปสู่เรื่องของ Orchestrator ที่นำเสนอโดยหลายค่าย แต่ที่ได้รับความนิยมสูงสุดหนีไม่พ้นสิ่งที่เรียกว่า Kubernetes
กรณีศึกษาของการใช้งาน Containers
Containers มีคุณสมบัติที่ยืดหยุ่นที่กล่าวถึงได้ทั้งในแง่ของการอำนวยความสะดวกต่อแนวทางการพัฒนาซอฟต์แวร์อย่าง microservices ที่แบ่งฟังก์ชันของซอฟต์แวร์ออกเป็นส่วนๆ หรือ DevOps ที่ต้องการนำส่งแอปพลิเคชันอย่างต่อเนื่องรวดเร็ว หรือการสไตล์พัฒนาที่เรียกว่า cloud native (เราจะไม่ขอลงลึกเกี่ยวกับความหมายในบทความนี้ แต่ให้รู้ว่าพอพูดถึงศัพท์ข้างต้น ส่วนใหญ่มักจะเกี่ยวพันกับ containers ขึ้นมา แต่ก็ไม่เสมอไป)
หรือการให้บริการในเทคโนโลยีคลาวด์ที่เรียกกันว่า Serverless ก็อ้างอิงบนพื้นฐานของ Containers เช่นกัน แล้วแต่ว่าจะนำแนวคิดนี้ไปใช้อย่างไร หรือเมื่อไม่นานนี้ที่สะเทือนวงการการพัฒนา AI ทาง NVIDIA ก็ได้ออก Container ที่รวบรวมซอฟต์แวร์ในงาน AI ที่ตนถนัดสนับสนุนการนำ AI ไปใช้ได้ง่ายๆในอุตสาหกรรมต่างๆที่ ซ่งสิ่งนั้นเรียกว่า ‘NIM’
ที่มา :