คอนเทนเนอร์ คืออะไร

DevOps

คอนเทนเนอร์ คืออะไร

มากกว่า 8 ปีที่ผ่านมา

2 min read

บทความนี้ผมได้นำมาจากบล็อกของ อ.ชาญวิทย์ แก้วกสิ ซึ่งผมเห็นว่ามีประโยชน์ แต่บล็อก อ. เข้าไม่ได้แล้ว หาก อ. ต้องการให้ลบ ส่ง 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 เปล่า ๆ ซักตัวนึงก็ทำแค่

docker run -p 80:80 nginx

หรืจะรัน wordpress ซักตัวนึงก็แค่

docker run --name mysql -e MYSQL_ROOT_PASSWORD=example -d mariadb
docker run --link mysql:mysql -p 80:80 -d wordpress

แล้วด้วยแนวคิดการไม่กวนกันของซอฟต์แวร์ ทำให้นักพัฒนาลดปัญหาใหญ่ไปได้อย่างนึงคือ

”พี่ครับ ตอนผมลองในเครื่อง dev มันรันได้จริง ๆ นะครับพี่”

มีการเรียกการใช้งาน Container ในขั้นตอน dev ว่าเป็นการ “Supercharge development environment”

Docker คืออะไร?

คำว่า Docker แทน 2 อย่าง

  1. คือชื่อบริษัท Docker Inc. และ

  2. ชื่อซอฟต์แวร์ก็คือคำสั่ง 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 ได้

ชักเริ่มอยากเอาไปใช้ แต่ยังไม่มั่นใจ? อ่านต่อที่นี่ ครับ

Tags:

Docker Container