การ deployment เป็นหนึ่งในขั้นตอนการทำงานที่ dev ทุกคนต้องเจอไม่ว่าจะเป็นองค์กรขนาดเล็กหรือขนาดใหญ่ แต่สิ่งที่แต่ละองค์กรไม่เหมือนกันคือความยุ่งยากซับซ้อน ระยะเวลาในการ deploy ที่ต่างกัน ขึ้นอยู่กับ process และเครื่องมือที่ใช้ ซึ่ง Docker ก็เป็นหนึ่งในเครื่องมือยอดนิยมที่จะช่วยให้การ deployment รวดเร็วมากยิ่งขึ้น ในบทความนี้เราจะมาดูกันว่า Docker คืออะไร? มีที่ไปที่มายังไงบ้าง
Docker คืออะไร?
Docker คือ เครื่องมือแบบ open-source ที่ช่วยจำลองสภาพแวดล้อม (environment) ในการรัน service หรือ server ตามหลักการสร้าง container เพื่อจัดการกับ library ต่างๆ อีกทั้งยังช่วยจัดการในเรื่องของ version control เพื่อง่ายต่อการจัดการกับปัญหาต่างๆ ที่เกิดขึ้น ซึ่งในปัจจุบันในโลกของการพัฒนา software มีรูปแบบการทำงานแบบ agile ที่เน้นความรวดเร็วในการส่งมอบงานในแต่ละขั้นตอน Docker จึงเป็นที่รู้จักในวงกว้างและเริ่มเข้ามามีบทบาทอย่างมากในโลกของการพัฒนา software อีกทั้งยังเป็นเครื่องมือที่จำเป็นสำหรับการทำ DevSecOps (อ่านเพิ่มเติมเกี่ยวกับ DevSecOps ได้ที่นี่)
ทำไมต้องใช้ Docker?
ทำไม Docker ถึงเป็นที่นิยม แล้วในอดีตการ Deploy แตกต่างจากในปัจจุบันอย่างไร ก่อนอื่นต้องทำความเข้าใจวิวัฒนาการของการ Deploy กันก่อน โดยความแตกต่างของการ Deploy แบ่งเป็น 3 ยุคง่ายๆ ดังนี้
- Traditional Deployment ในยุคที่เราใช้ Physical server 1 เครื่อง ในการ deploy และเพื่อความคุ้มค่า Physical server ที่เรามีจะถูกใช้ในการลง application หลายๆ อันพร้อมๆ กัน ซึ่งทำให้เกิดปัญหา element ของแต่ละ application ตีกัน เช่น application แต่ละตัวมีการลง JAVA ซึ่งเป็นในเครื่องเรามี JAVA หลายๆ เวอร์ชัน 1.5, 1.6, 1.8 ทำให้เวลา run มีปัญหาเกิดขึ้น ทั้งการ maintenance และปัญหาในการเลือกเวอร์ชัน
- Virtualized Deployment เป็นยุคที่มีการเกิดขึ้นของ software hypervisor ซึ่ง concept คือการจำลองเครื่อง Physical server ขึ้นมา เรียกว่า Virtual Machine ทั้ง CPU, memory, hard disk, hardware ต่างๆ ขึ้นมาเสมือนคอมพิวเตอร์เลย ปรับสเปคปรับความเร็วต่างๆ ได้ตามงบประมาณที่เรามี ซึ่งส่วนใหญ่ก็จะสร้าง VM ขึ้นมาหลายๆ เครื่อง ให้แต่ละเครื่องเพียงพอต่อการ run application แต่ละตัว แต่ปัญหาคือจะเกิดปัญหา Overhead ทั้งในเรื่องการจำลอง hardware ต่างๆ ทำให้ทำงานได้ช้าลง 2-5 เท่า รวมถึง Overhead ในกรณีที่เรามีการ run ใน environment ที่ใกล้เคียงกัน จะทำให้เปลือง resource ไปโดยใช่เหตุ
- Container Deployment ซึ่งในยุคนี้จะพูดถึงการสร้าง Container ขึ้นมาเพื่อขัง resource สร้างกำแพงขึ้นมาแบ่ง resource ทำให้เราสามารถใช้ resource ได้อย่างมีประสิทธิภาพมากขึ้น เลือก container ไปใช้กับแต่ละ application ได้ดียิ่งขึ้น ทำให้ปัญหา overhead ลดลง และเครื่องมือในการสร้าง Container ที่นิยมก็คือ Docker
Container แตกต่างจาก Virtual Machine อย่างไร?
เนื่องจาก Docker ทำงานอยู่บน Container เป็นหลัก จัดการเรื่องทรัพยาากรต่างๆ ของเครื่องต่อจาก OS อีกที ต่างจาก VM ที่แบ่งทรัพยากรและ OS อย่างชัดเจนเลยตั้งแต่แรก ถ้าสังเกตจากภาพด้านล่างจะเห็นว่า Docker จะรันบน OS แต่ถ้าเป็น VM จะรันบน Virtualization Hypervisor โดยตรงเลยแล้วค่อยรัน OS บน VM ซึ่งส่งผลให้การทำงานของ VM มี overhead มากกว่าการ run service ด้วย container รวมถึงในแง่ของการใช้ทรัพยากรอย่าง CPU, memory, disk อีกด้วย
ในการใช้งานจริง Docker อาจจะไม่ได้เหมาะกับ Software เก่าๆ หรือ Software ใหญ่ๆ ที่ไม่ได้ถูกสร้างมาเพื่อรันบน container เช่น ZAP ที่หมาะกับการใช้งานบน VM มากกว่า ทำให้ในบางทีจะมีการใช้ Docker และ VM คู่กันตามภาพ อีกทั้งเราไม่ควรรัน
ในโลกของ Docker hub จะคล้ายๆ กับ Github ที่เป็นสถานที่รวมไฟล์ต่างๆ ซึ่งในปัจจุบันมี images ที่ปล่อย public อยู่บน Docker Hub มากถึง 5,427,993 ไฟล์ แสดงให้เห็นถึงปริมาณการใช้ ความนิยมของ Docker และในปี 2018 มีการ Download Container ไปแล้วถึง 37 ล้านครั้ง รวมทั้งยังมีตำแหน่งงานใน LinkedIn กว่า 15,000 ตำแหน่งในปี 2018 และยังเป็นเครื่องมือในการ Deploy ที่เป็นนิยมเป็นอันดับ 2 รองจาก Linux (อ้างอิงจาก Stackoverflow Survey ในปี 2020)
ตัวอย่างขององค์กรที่ใช้ Docker
ADP บริษัทในตลาดหุ้น NASDAQ เป็นบริษัทที่ให้บริการเกี่ยวกับการทำธุรกรรมขององค์กร และช่วยแก้ปัญหาทางธุรกิจให้กับองค์กรด้วยข้อมูล โดย ADP ได้มีการใช้ Docker เพื่อรองรับลูกค้ามากถึง 600,000 คน คำนึงถึงเรื่อง security และ scalability
Spotify เป็นผู้บริการ streaming เพลงรวมถึง podcast ต่าง ได้ใช้ docker บน server มากถึง 300 เครื่อง โดยทำงานแบบ CI/CD มีการ build และ test บน container ตั้งแต่วันแรกของบริษัท
ING มีการใช้ docker เพื่อทำ Continuous delivery สำหรับการ build, provisioning library, การทำ test, deploy automate เพื่อลดความยุ่งยากซับซ้อนในการทำงาน ลดต้นทุนที่ต้องใช้ และเพิ่มประสิทธิภาพในการส่งมอบงานแต่ละงาน
ข้อดี และข้อเสียของ Docker
ข้อดีของ docker
- Portability ทดสอบ container ที่เดียวสามารถ deploy ได้ทุกที่ที่มี docker รันอยู่โดยไม่ต้องกลัวว่าจะไม่สามารถรันได้
- Performance เนื่องจาก container ไม่ได้มีการบรรจุ OS เข้าไปด้วย นั่นหมายความว่า docker นั่นจะมีขนาดเล็กกว่า VM ทำให้ขนาดเล็ก, build ได้เร็วกว่า รวมถึงการรันได้มีประสิทธิภาพดีกว่าด้วย
- Agility ด้วย portability และ performance ช่วยให้เหมาะสมกับการทำ agile process รวมถึงเหมาะกับการทำ CI/CD อีกด้วย ช่วยให้ compile, build, test ได้ดียิ่งขึ้น
- Scalability เราสามารถสร้าง container ใหม่ ได้ตามความต้องการของ application ที่ scale ได้ โดยใช้เวลาอันสั้น
ข้อเสียของ docker
- เนื่องจากการรัน docker ไม่ได้รัน OS ใหม่ทั้งหมดเป็นเพียงแค่การจำลอง env ทำให้อาจเกิดการโจมตีที่ OS หลักผ่านทาง docker ได้และอาจกระทบกับ container ตัวอื่นๆ
- ตอนเริ่มแรกที่ docker ถูกสร้าง มันถูกออกแบบมาเพื่อรองรับการรันบน linux เท่านั้น ที่เราสามารถรัน docker บน window,mac ได้นั้นเพราะ เมื่อเราลง docker ใน window,mac จะมีการสร้าง VM ที่เป็น linux เพื่อมารัน docker อีกที ทำให้ประสิทธิภาพการทำงานอาจจะไม่สามารถทำได้สูงสุดเท่ารันบน linux
- Docker ไม่เหมาะกับการจัดการ resource บนเครื่องใหญ่ๆ หรือไม่เหมาะกับโปรแกรมที่ออกแบบมาเพื่อทำงานบน VM
- Learning curve ที่สูง เนื่องจากเป็นการทำงานเกี่ยวกับ OS, network รวมถึงการจัดการทรัพยากรต่างๆ ทำให้ต้องอาศัยเวลาการเรียนรู้ที่ค่อนข้างสูง แต่ทาง docker ก็มี tool ใหม่ๆ ออกมาช่วยเหลือให้ใช้งานได้ง่ายยิ่งขึ้น แต่การที่จะใช้งาน docker ได้อย่างช่ำชองจำเป็นต้องเรียนรู้ tools อื่นเพื่อใช้ในการประกอบด้วย
แล้วทำไม Docker ต้องเป็นปลาวาฬ
เนื่องจาก Docker เป็นเครื่องมือในการจัดการ container ที่บรรจุ software ต่างๆ สำหรับทำการ deploy ในโลกของ Software Development ทีมออกแบบจึงเปรียบเทียบ Docker เป็นปลาวาฬกำลังว่ายน้ำอยู่ในมหาสมุทรแปรซิฟิกที่กำลังขน container และส่งมอบแต่ละ container ให้ถึงจุดหมายอย่างปลอดภัย
นี่เป็นเพียงส่วนหนึ่งของความสามารถของ docker เท่านั้น ยังมีประโยชน์และเทคนิคอื่นๆ อีกมาก หากต้องการรู้เพิ่มเติมเกี่ยวกับ docker เพื่อพัฒนา software ให้เร็วขึ้นสองเท่า รวมถึง concept build ship run โดยคุณเดียร์ จิรายุส ผู้เชี่ยวชาญที่ได้รับการรองรับ Certified Kubernetes Administrator (CKA) & Certified Kubernetes Security Specialist (CKS) คนแรกของประเทศไทย เราขอแนะนำเป็นคอร์ส Introduction to Docker ที่คุณจะได้เรียนรู้ตั้งแต่ทฤษฎีเบื้องต้นของ Docker จนสามารถนำ application ของคุณมาแปลงเป็น Container และ Docker Compose เพื่อใช้งานได้ทันที