Docker 101: Docker และ Containers คืออะไร​?

Docker 22 มิ.ย. 2020

Docker และ Container ถือได้ว่าเป็น Buzz Word ในวงการ IT มานานหลายปีมาก โดยความนิยมของการใช้ Docker และ Container ก็ยังได้รับการสนับสนุนอยู่ทุกๆปีจากผู้ให้บริการ Cloud Services และ Open-source project มากมายเช่น Cloud Service แบบ PaaS และ Kubernetes Project ที่ถูกพัฒนาโดย Google เพราะฉะนั้นเราจะมาอธิบายกันว่า Docker และ Container มันคืออะไรกันแน่

Containers

เรารู้กันว่าหน่วยย่อยที่สุดของโปรแกรมต่างๆคือ process เทคโนโลยีอย่าง Virtualization และ Containers นั้นถูกสร้างมาเพื่อจุดประสงค์ในการแยก Processes ที่อยู่ใน Infrastructure เดียวกันออกจากกัน วิธีปกติที่เรามักจะใช้กันก็คือการทำ Virtualization ที่ใช้ Hypervisor ในการจำลอง physical hardware ออกมาเป็น virtual hardware และนำไปสร้าง virtual machine ที่แต่ละตัวจะมี OS เป็นของตัวเอง เพื่อเอาไปใช้รันสิ่งที่เราต้องการ ไม่ว่าจะเป็น Web Server, Database และอื่นๆ

สิ่งที่ Containers ต่างไปจาก Virtualization คือแทนที่เราจะใช้ Hypervisor ในการจำลอง machine เครื่องใหม่ขึ้นมา เราจะใช้ Features 2 ตัวที่อยู่ใน Linux ก็คือ Namespaces และ Control Group

  • Namespaces เป็นตัวจัดการว่า process หรือ กลุ่มของ process สามารถที่มองเห็น resources อะไรได้บ้าง หรือในอีกนัยนึง namespaces จะเป็นตัวแยก processes ออกจากกัน โดยกำหนดว่าใครเห็นอะไรได้บ้าง
  • Control Group (cgroups) เป็นตัวจำกัด resources ที่ process หรือกลุ่มของ process นั้นจะใช้สามารถใช้งานได้

เมื่อเรารวม 2 อย่างที่เข้าด้วยกันสิ่งที่เราได้ก็คือการแยก process ใน Infrastructure เดียวกันออกจากกัน และเราสามารถกำหนดได้ด้วยว่าเราจะให้ resources หรือ ทรัพยากรแต่ละ process เท่าไหร ซึ่งชื่อ ซึ่งฟังดูแล้วก็เหมือนกับ Virtualization ที่เราสามารถทำได้คล้ายๆกัน แล้ว Containers มีดีกว่าตรงไหน

ถ้าเราดูจากรูปที่เปรียบเทียบระหว่าง Containers กับ Virtual Machine เราจะเห็นความแตกต่างดังนี้

  • แต่ละ Containers ไม่ต้องมี OS เป็นของตัวเอง แต่จะถูกจัดการด้วยซอฟต์แวร์จัดการ Containers ทำให้ Container แต่ละอันมีขนาดที่เล็กกว่า Virtual Machine มาก
  • เนื่องจากไม่จำเป็นต้องสร้าง Virtual Hardware หรือ Guest OS ทำให้ Containers มีระดับชั้นที่น้อยกว่า Virtual Machine (ตามรูป) ซึ่งทำให้การสร้าง Containers ใหม่ สามารถทำได้เร็วกว่าการสร้าง Virtual Machine มาก

โดยสรุปแล้ว Containers เป็นชื่อที่ตรงตัวมาก โดยเราสามารถมองได้ว่า แต่ละ Process ที่เราต้องการแยกมันออกจากกัน ถูกจัดบรรจุอยู่ใน Container ที่มีทรัพยาการที่เรากำหนดไว้ให้ และแต่ละ Container ก็จะมองเห็นแค่ข้างใน Container ของตัวเอง ไม่สามารถเห็นของคนอื่นได้ เปรียบเทียบได้กับตู้ container บนเรือขนส่งขนาดใหญ่ (เครื่องคอมเรานั้นเอง) โดยของข้างในตู้ container (application ที่เราต้องการใช้)  ก็จะไม่สามารถเข้าไปในตู้ container ของคนอื่นได้

What's about Docker?

ในการสร้าง Virtual Machine เราต้องมี Hypervisor ที่ใช้จัดการ VM ในโลกของ Containers เราก็ต้องมี software ตัวนึงที่ไว้ใช้จัดการเช่นกัน โดย Docker เป็น software ที่ใช้จัดการ container ที่เราต้องการสร้าง ใช้งาน รวมไปถึงการแชร์ให้คนอื่นไปใช้งานด้วย โดย Docker ได้รับความนิยมเป็นอย่างมากในการใช้งาน เนื่องจากว่ามันฟรี รวมไปถึงเราสามารถเก็บไฟล์  Container (คล้ายกับ Disk image ของ Virtual Machine แต่ขนาดเล็กกว่ามาก) ของเราไว้กับ Docker ได้ด้วย ผ่าน hub.docker.com ซึ่งไฟล์ Docker Container ถูกเรียกว่า Docker Image ซึ่งเราสามารถ Pull และนำไปใช้งานได้เลย

Docker, a silver bullet?

Docker และ Containers ทำให้เกิด Services ต่างๆมากมายเกิดขึ้นเช่น Kubernetes ที่ใช้จัดการ Containers จำนวนมาก เพื่อการทำงานในระบบที่ใหญ่และสามารถขยายหรือลดได้อย่างมีประสิทธิภาพ หรือการใช้ Docker Image เพื่อการ deploy บน Azure App Service ที่เราไม่ต้อง setup อะไรเลย แค่โยน Docker Image ให้ ตัว Azure ก็จะจัดการให้หมดทุกอย่าง

Feature หลายๆอย่างของ Docker และ Container อาจจะทำให้เราเกิดข้อกังขาสำหรับการมีอยู่ของเทคโนโลยีอย่าง Virtualization ที่เหมือนจะสามารถถูกทดแทนได้ด้วยการใช้ Container แต่ตัว Container นั้นไม่ได้ถูกสร้างมาเพื่อทดแทน Virtualization แต่มันถูกสร้างขึ้นมาเพื่อการใช้งานที่แตกต่างกันออกไป ในเรื่องของความยืดหยุ่นที่เราสามารถปรับแต่งอะไรก็ได้ การใช้ Virtualization ก็ยังคงเป็นทางเลือกที่เหมาะสมอยู่เช่นกัน

แท็ก

Sethanant Pipatpakorn

Innovation Engineer @ KLabs, KBTG CS20 SKN36