credit : https://www.bmc.com/blogs/containers-vs-virtual-machines/

Docker เป็น Software ที่ใช้สำหรับ Control หรือเรียกง่ายๆ ว่าเอาไว้จัดการ Container เช่นการเรียกใช้งาน (Docker Container) หรือจัดการ Package ของโปรแกรม (Docker Image) ซึ่งในแต่ละ Container จะมี Environment หรือ Configuration ที่ไม่เหมือนกันก็ได้ โดยที่ไม่ยุ่งเกี่ยวกับ Host หรือเครื่องที่ติดตั้ง สำหรับตัวอย่างในการติดตั้งโปรเจคบน server ก็เช่น…

เรามี Web Application ตัวหนึ่งที่เราต้อง Deploy หรือติดตั้งบน Server และ Web Application ตัวนี้นั้น จำเป็นที่จะต้องติดตั้ง .NET Framework 3.5 ลงที่เครื่อง Server ตัวนั้นก่อน ถึงจะทำงานได้ (สำหรับตัวนี้ขอเรียกว่า Web A)

และหลังจากนั้นก็มี Web Application ตัวที่สอง (Web B) ดันจำเป็นต้องติดตั้ง .NET Core 2.1 บน Server อีก ที่นี้ Server ตัวนี้ก็จะมี .NET อยู่ 2 ตัว ก็ยังทำงานกันได้ปกติสุขไม่เกิดปัญหาอะไร แต่….

อยู่มาวันหนึง Microsoft บอก่า .NET Core 2.1 มันเก่าไปละ มีช่องโหว่ ทำให้ต้องจำใจไปอัพเกรด Web B เป็น .NET Core 3.1 ที่นี้ตัวเว็บไซต์เรา ต้องมีการติดตั้งบน Server ดูก่อนว่าสามารถทำงานได้ปกติหรือไม่ โดยการติดตั้ง .NET Core 3.1 เพิ่มเข้าไป ทีนี้เองก็จะเริ่มมีปัญหาละว่าบางฟังก์ชันไม่สามารถทำงานได้บน .NET Core 3.1 หรืออาจจะเป็นเพราะ Migrate ขึ้น version ใหม่ไม่ทัน หรือจะเป็นการ Config ที่ตัว server เองอีก ทำให้ปัญหาแก้ไม่จบสักที

ทีนี้เรามาลองดูว่าเราจะเอา Docker มาช่วยแก้ปัญหายังไง เรามาดูข้อดีของ Docker กันก่อนดีกว่า

- Environment ของแต่ละ Container แยกกันทำงาน โดยไม่มีผลกระทบกับ Container อื่น หรือ Host

- สามารถแยก Config ออกมาจากเนื้อโค๊ด และสามารถ Config ให้ได้ตั้งแต่ตอนสร้าง Container

- สามารถ Deploy โปรเจคใหม่ด้วยการ Restart

- ทำ Load-Balance ได้ (Docker-Compose)

- 1 Image สามารถนำไปสร้าง Container ได้มากกว่า 1 Container เหมาะสำหรับการทำการทดสอบต่างๆ

- สามารถทำ Image เป็น Backup version ได้ด้วยการใช้ Tag

- สร้าง Container จาก Image ได้ไวกว่าการสร้าง VM ใหม่ สำหรับการสร้าง Container สามารถมองเปรียบเที่ยบได้ว่าเป็น VM ตัวหนึ่ง แต่ต่างกันที่ VM เองจะต้องกำหนด Resource ต่างๆ และต้องติดตั้ง OS เพื่อให้ใช้งานได้ รวมถึงต้อง Config ค่าต่างๆ บน Server เพื่อให้สามารถทำงานกับโปรเจคเราได้ แต่สำหรับ Container จะข้ามขั้นตอนนี้ไป

คราวๆ ก็จะประมาณนี้ครับ แต่อาจจะมีมากกว่านี้ครับ ทีนี้เรามาดูข้อเสียกันหน่อยว่ามีอะไรบ้าง

- ต้องมีเวลาศึกษา เพราะ image แต่ละตัวที่เราเอามาใช้งาน จะมีวิธีใช้งานไม่เหมือนกัน

- ทำไม่ยาก แต่ท่ายากมันเยอะ … วิธีการทำ Image ของแต่ละคนอาจจะไม่เหมือนกัน เพราะ Docker ค่อนข้างจะเปิดกว้างสำหรับการใช้งาน

- อาจจะต้องใช้ Cost เกี่ยวกับ Hardware ขึ้นมาจากเดิมนิดหน่อย เพราะ Docker เองก็จำเป็นต้องใช้พื้นที่ในการ Build Image, จัดเก็บ Image และหน่วยความจำสำหรับการสร้าง Container เหมือนกัน

- ต้องแก้ไขโปรเจคให้รองรับกับการทำงานบน Environment ที่สามารถตายได้ทุกเวลา

- Container ไม่เหมาะกับการจัดเก็บไฟล์

สำหรับข้อเสียหลักๆ ก็ประมาณนี้ครับ

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