Docker vs VM vs LXC

ในขณะที่โลก devops กำลังตื่นเต้นกับ docker ผมก็พบว่ามันมีงานอะไรบางอย่างที่ docker อาจจะยังทำได้ไม่ดีนัก โดยเฉพาะเวลาที่ผมต้องการ 'ควบคุม' บางสิ่งบางอย่างในระดับลึกๆ และไม่ได้เกี่ยวข้องกับโปรแกรมนั้นๆ โดยตรง เนื่องจาก docker นั้นออกแบบมาเพื่อให้เรียกใช้งานโปรแกรมเพียงโปรแกรมเดียว และการที่มีคนหลายๆ คนพยายามที่จะหา 'ท่าแก้' ด้วยการเอามา run supervisord เพื่อให้มีหลายๆ process ใน docker ก็แสดงว่ามันยังมีงานบางอย่างที่จำเป็นต้อง run หลายๆ process อยู่ด้วยกัน และท่าแก้ต่างๆ ก็ยิ่งเพิ่มความซับซ้อนให้กับระบบขึ้นอีก

จากเรื่องข้างบนทำให้ผมนึกย้อนกลับไปถึงข้อถกเถียงระหว่าง monolithic kernel กับ microkernel โดยหลักการของ docker เทียบได้กับ microkernel คือพยายามแยกส่วนการทำงานออกเป็นส่วนย่อยๆ ที่เรียบง่าย และเมื่อจะติดต่อกับส่วนย่อยอื่นๆ ก็จะทำผ่าน inter-process communication (IPC) ซึ่งถ้าเรามองที่หน่วยย่อยๆ ของ microkernel จะเห็นถึงความเรียบง่าย แต่พอมองภาพรวมที่ทุกๆ หน่วยย่อยจะต้องทำงานร่วมกันโดยการคุยกันผ่าน IPC ก็จะเห็นว่าเราแค่เอาความซับซ้อนจากที่หนึ่งไปใส่ไว้อีกที่หนึ่งเท่านั้นเอง (แต่กลับทำให้ประสิทธิภาพบางอย่างลดลง)

ข้อถกเถียงระหว่าง monolithic kernel และ microkernel นั้นยืดเยื้อยาวนานมาก โดยหนึ่งในข้อถกเถียงที่น่าสนใจมากๆ คือการถกเถียงกันระหว่าง Linus Torvalds และ Andrew S. Tanenbaum ซึ่งอ่านเพิ่มเติมได้ที่https://en.wikipedia.org/wiki/Tanenbaum%E2%80%93Torvalds_debate

กลับมาที่เรื่องของ docker ผมมองว่ามันไม่ได้แตกต่างในแง่ของการยกเอาความซับซ้อนจากที่นึงไปไว้อีกที่นึง และอาจจะต้องดูกันยาวๆ ว่าในที่สุดแล้วใครจะเป็นผู้ชนะในสงครามนี้กันแน่ แต่ในระหว่างนี้มันมี container อีกแบบที่น่าสนใจและเหมือนจะเป็นอะไรที่อยู่กึ่งกลางระหว่าง VM กับ docker นั่นคือ Linux Containers ซึ่งเรียกย่อๆ ว่า LXC https://en.wikipedia.org/wiki/LXC

ถ้าจะพูดแบบง่ายๆ ให้คนที่เคยใช้ docker เข้าใจนั่นคือ LXC แทนที่จะเรียกใช้โปรแกรมตัวใดตัวหนึ่งที่เราต้องการ แต่มันจะเรียกใช้ /sbin/init ซึ่งนั่นคือโปรแกรมแรกที่ Linux เรียกใช้ตอน boot ขึ้นมานั่นเอง ดังนั้นเมื่อ LXC ทำงาน มันจะเหมือนกับเรา boot Linux VM ขึ้นมาทั้งเครื่องจริงๆ แต่จะใช้เวลา boot น้อยมากเพราะมันข้ามขั้นตอนการเรียกใช้และติดตั้ง driver สำหรับ hardware ต่างๆ ไปหมด

ข้อดีของ LXC คือ boot เร็ว shutdown เร็ว และได้ระบบเสมือน VM ทั้งตัว มี root มี syslog มี process controller มี sysvinit หรือ systemd เป็นของตัวเองหมดไม่ต่างจาก VM นอกจากนั้น kernel รุ่นใหม่ๆ ของแต่ละ distro ยังใช้เป็น host ให้กับ container ที่เป็น distro อืนๆ ได้ด้วย เช่น host เป็น CentOS หรือ Fedora สามารถ boot Ubuntu container ได้ และ LXC ยังมีการ integrate กับ libvirt เป็นอย่างดีและทำให้เราใช้ virsh หรือ virt-manager ช่วยบริหารจัดการ container ได้อย่างสมบูรณ์อีกด้วย

ติดตั้ง gitlab บน Ubuntu 14.04 ที่เป็น LXC container บน host ที่เป็น Fedora 21 โดยใช้ virt-manager คอย monitor ทรัพยากรต่างๆ

โพสต์ยอดนิยมจากบล็อกนี้

เปรียบเทียบ SDHC class 10 กับ 4

Google Apps ไม่ฟรี หนีซบ Microsoft