เมื่อ Container และ Kubernetes ได้รับความนิยมมากขึ้นเรื่อยๆ ทาง Google เองก็ได้ออกมาแนะนำถึงหลัก 7 ประการในการสร้าง Container ให้ดี ซึ่งทางทีมงาน TechTalkThai เห็นว่าเป็นเนื้อหาที่เป็นประโยชน์ จึงนำมาสรุปเป็นภาษาไทยให้อ่านกันได้ง่ายๆ ดังนี้ครับ
1. มี 1 Application ต่อ 1 Container เท่านั้น
ใน Container หนึ่งๆ นั้นควรจะมี Application เดียวที่มี Parent Process ร่วมกันเท่านั้น ตัวอย่างเช่น ไม่ควรใช้งานทั้ง PHP และ MySQL ใน Container เดียวกัน เพราะจะทำให้แก้ปัญหาได้ยาก, ไม่สามารถจัดการ Linux Signal ได้ดี และไม่สามารถ Scale ระบบเฉพาะส่วนได้
2. จัดการกับ PID 1, Signal Handling และ Zombie Process ให้ดี
Kubernetes และ Docker นั้นอาศัยการส่ง Signal เข้าไปเพื่อหยุดการทำงานของ Application ใน Container โดย Signal ดังกล่าวจะถูกส่งไปยัง Process ที่มี PID 1 ดังนั้นหากต้องการให้ Application หยุดการทำงานได้ทันทีที่ต้องการ ก็ต้องออกแบบ Container ให้สามารถรับ Signal เหล่านี้ให้ได้ดีๆ
3. ใช้ Docker Build Cache ให้มีประสิทธิภาพ
Docker นั้นสามารถทำการ Cache ข้อมูลใน Layer ต่างๆ ภายใน Image เพื่อช่วยให้การ Build ภายหลังทำได้เร็วขึ้น แต่การจะใช้ความสามารถนี้ก็จำเป็นต้องมีความรู้ความเข้าใจในการเขียน Dockerfile อยู่บ้าง เช่น การใส่ Source Code ของเราลงไปนั้นควรใส่เป็นบรรทัดท้ายๆ เท่าที่จะทำได้ เพื่อให้ Base Image และ Dependency ต่างๆ ถูก Cache ให้มากที่สุด เป็นต้น
4. เอาเครื่องมือที่ไม่จำเป็นออกไปจาก Image
การลดความเสี่ยงที่อาจทำให้ Host ถูกโจมตีให้เหลือน้อยที่สุดนั้นเป็นสิ่งที่ควรทำเป็นอย่างยิ่ง ดังนั้นจึงควรกำจัดสิ่งที่ Application ของเราไม่ได้ใช้ออกไปจาก Container ให้มากที่สุด หรือจะใช้ Distroless (https://github.com/GoogleContainerTools/distroless) ซึ่งเป็น Image เปล่าๆ ที่ไม่มี Package Manager, Shell หรือโปรแกรมอื่นๆ อยู่เลยในการสร้าง Image ก็ได้เช่นกัน และทาง Google ก็แนะนำให้กำหนดค่า Filesystem ให้เป็นแบบ Read-only เท่านั้น เพื่อให้ปลอดภัยสูงสุด
5. สร้าง Image ให้เล็กที่สุดเท่าที่จะเป็นไปได้
การทำ Image ให้มีขนาดเล็กนั้นนอกจากจะประหยัดพื้นที่แล้ว จะยังช่วยลดเวลาที่ต้องใช้ในการ Download Image ลง และยังลดเวลาในการบูทให้น้อยลงอีกด้วย
6. ทำการ Tag Image ที่ใช้ให้เรียบร้อย
การ Tag นั้นจะทำให้ผู้ใช้งานสามารถเลือกใช้ Image ในรุ่นที่ต้องการได้ง่าย ซึ่งไม่ว่าจะใช้การ Tag แบบ Semantic Versioning หรือ Git Commit Hash ก็ตาม ก็ควรที่จะต้องเขียนลงเอกสารให้ชัดเจนพร้อมคำอธิบายเพื่อให้ผู้ใช้งานเลือกใช้งาน Image ได้ถูกรุ่น ที่สำคัญคือ Image รุ่นใดที่ถูก Tag แล้วต้องไม่มีการถูกแก้ไขภายใน Tag เดิมอีก เพื่อไม่ให้ผู้ใช้งานสับสน
7. พิจารณาให้ดีก่อนจะเลือกใช้ Public Image ใดๆ
ถึงแม้การใช้ Public Image จะทำให้ง่ายต่อการทำงานในหลายๆ ครั้ง แต่ Public Image เองก็อาจไม่ได้ถูกปรับแต่งมาให้ใช้ทรัพยากรน้อยหรือปลอดภัยก็เป็นได้ ดังนั้นการสร้าง Image เองสำหรับทุกๆ ส่วนของระบบ Software เองก็จะช่วยให้มั่นใจในประเด็นเหล่านี้ได้ดีขึ้น อย่างไรก็ดี ต้องเลือกให้ดีว่ากรณีไหนควรจะใช้ Public Image และกรณีไหนควรจะสร้าง Image เอง
ผู้ที่สนใจรายละเอียดเชิงลึก สามารถอ่านเนื้อหาฉบับเต็มได้ที่ https://cloudplatform.googleblog.com/2018/07/7-best-practices-for-building-containers.html ครับ