บทความนี้ผมได้นำมาจากบล็อกของ อ.ชาญวิทย์ แก้วกสิ ซึ่งผมเห็นว่ามีประโยชน์ แต่บล็อก อ. เข้าไม่ได้แล้ว หาก อ. ต้องการให้ลบ ส่ง email ที่ด้านล่างมาได้ครับ
คอนเทนเนอร์ คืออะไร?
Container จะเรียกให้ถูกต้องเป๊ะ ๆ คือ Software Container เป็น concept ของการสร้างสภาพแวดล้อมเฉพาะให้ซอฟต์แวร์ทำงานได้โดยไม่กวนกับซอฟต์แวร์ตัวอื่นบนระบบปฏิบัติการเดียวกัน โดยเฉพาะ Sun หรือ Linux นั้นมี concept ของ Container มานานแล้ว เช่น ใน Linux มี LXC เป็นตัวจัดการ container มาตั้งแต่ปี 2007-2008 หรือใน Solaris ก็มีระบบแบบเดียวกันมาตั้งแต่ปี 2004-2005
ปกติซอฟต์แวร์แต่ละตัวก็ไม่กวนกันอยู่แล้วไม่ใช่หรือ? ตัวอย่างการกวนกันของซอฟต์แวร์ที่ชัดเจน เช่น
- เครื่องลง PHP กับ Apache HTTPd ไว้ คราวนี้พอจะรัน Tomcat แล้ว port มันชนกัน
- ลงโปรแกรม Asterik ทำ VOIP ไว้ แต่ดันไป update dependency ของ server โปรแกรมเลยพัง
- PHP เวอร์ชันไม่ตรงกัน
- Ruby on Rails ตัว library ไม่ตรงกัน - update กันซักทีเหนื่อยแทบขาดใจ เป็นต้น
ปัญหาแบบนี้แก้ด้วยการหา Container มาห่อ ซอฟต์แวร์ของเราทั้งระบบ (ยกเว้น kernel) ก็จะทำให้ซอฟต์แวร์เลิกตีกันได้
แล้วทำไมไม่ใช้ Virtual Machine (VM) หล่ะ?
แน่นอนว่า VM ก็สามารถแก้ไขปัญหาการกวนของซอฟต์แวร์ได้เหมือนกัน แต่ VM มีจุดอ่อนใหญ่ ๆ อยู่ 3 จุด
- Spinning Time - กว่าจะ boot VM ตัวใหม่ขึ้นมาใช้เวลานานระดับหลายวินาที แต่การสร้างและรัน โปรแกรมใน Container ใช้เวลาประมาณ 100ms (0.1 วิ)
- Overhead - VM ใช้การจำลองทั้งเครื่อง ทั้ง OS ทำให้เสีย Overhead ประมาณ 5% - 10% ในขณะที่ระบบ Container มี Overhead น้อยกว่า 1%
- Image Size - Image ของ VM ใหญ่ระดับแถว ๆ 1GB แต่เราสามารถสร้าง Image ของ Container ที่รันเว็บเซิฟเวอร์ เช่น nginx ได้ที่ขนาดราว ๆ 20MB (0.020 GB)
แต่ก็มีข้อจำกัดคือการทำงานของ Container เป็นระดับ OS ดังนั้นเราไม่สามารถเอา Windows container ไปรันบน Linux ได้ตรง ๆ เป็นต้น
มี Container มานานแล้วแต่ทำไมเพิ่งพูดถึงกันช่วงนี้?
เพราะประมาณในช่วงปี 2013 Docker เพิ่งคิดวิธีที่ทำให้การใช้ Container ง่ายขึ้น Image เล็กลง แยกเป็นชั้น ๆ สร้างแนวคิด build, ship, run ที่แต่ละรอบของการสร้าง Container เร็วขึ้นมาก จนทำให้ Container เป็นของที่นักพัฒนาทั่ว ๆ ไปใช้ในการพัฒนาซอฟต์แวร์ได้ด้วย
ง่ายยังไง?
ง่ายขนาดจะรัน server เปล่า ๆ ซักตัวนึงก็ทำแค่
หรืจะรัน wordpress ซักตัวนึงก็แค่
แล้วด้วยแนวคิดการไม่กวนกันของซอฟต์แวร์ ทำให้นักพัฒนาลดปัญหาใหญ่ไปได้อย่างนึงคือ
“พี่ครับ ตอนผมลองในเครื่อง dev มันรันได้จริง ๆ นะครับพี่”
มีการเรียกการใช้งาน Container ในขั้นตอน dev ว่าเป็นการ “Supercharge development environment”
Docker คืออะไร?
คำว่า Docker แทน 2 อย่าง
-
คือชื่อบริษัท Docker Inc. และ
-
ชื่อซอฟต์แวร์ก็คือคำสั่ง docker แต่ถ้าอ่านในเอกสารอาจจะเจอว่ามีการพูดถึง “Docker Engine” อันนั้นก็หมายถึงคำสั่ง docker
ส่วนชุดซอฟต์แวร์ของ Docker ก็มีหลายชิ้น
- Docker Engine เป็นตัวเอก
- Docker Machine เป็นซอฟต์แวร์สำหรับสร้าง หรือ เซ็ตอัพเครื่องให้พร้อมสำหรับ container
- Docker Swarm เป็นซอฟต์แวร์ที่เอา Engine หลาย ๆ ตัวมารวมกัน ให้เป็นตัวใหญ่ ๆ (cluster) ตัวเดียว
- Docker Compose เป็นซอฟต์แวร์ที่ใช้บอกว่า container แต่ละตัวทำงานกันยังไง เชื่อมกันยังไง หลัก ๆ ก็คงประมาณนี้
สรุปว่า container คล้าย ๆ VM แต่ เบากว่า Overhead น้อยกว่า รันได้เร็วกว่า และ Docker ทำให้เราใช้ Container ได้ง่ายขึ้นไปอีกจนทำให้เราหลอมทักษะการ Development กับ Operations เข้าด้วยกันเป็น DevOps ได้
ชักเริ่มอยากเอาไปใช้ แต่ยังไม่มั่นใจ? อ่านต่อที่นี่ ครับ