วันหยุดอ่านบทความเรื่อง Choosing the best Node.js Docker image
ทำการวิเคราะห์ว่า Docker Image ของ Node.js แต่ละตัวที่มีให้ใช้เป็นอย่างไร
ในแง่มุมต่าง ๆ ยกตัวอย่างเช่น
- Base image หรือ OS ที่ใช้งาน ว่าเป็นอย่างไร
- เรื่องการ maintain ต่าง ๆ
- เรื่องขนาดของ image
- เรื่องความปลอดภัย ทำการตรวจสอบผ่าน Image scanner
เริ่มจากสิ่งที่ไม่แนะนำคือ การเขียน Dockerfile แบบนี้
รวมทั้งไม่ใช้งาน latest tag ด้วยนะ !!
[gist id="c78905201e5ec18c50cf00a7f2dd7d15" file="Dockerfile"]ในบทความทำการสรุป Docker Image แต่ละตัวไว้ดังนี้
จากการสรุปนั้น node:alpine นั้นมีขนาดเล็ก มี dependency น้อย
แถมเจอปัญหาด้าน security น้อย
แต่ในความจริงคือ เครื่องมือตรวจสอบยังไม่สนับสนุน Alpine นั่นเอง
รวมทั้ง Alpine นั้นทำการ implement library ภาษา C ด้วย musl
ซึ่งแตกต่างจากตัวอื่น ๆ ที่ใช้งาน glibc
ผลที่ตามมาคือ ทำให้ระบบงานที่นำมา run บน Alpine เกิดปัญหาแปลก ๆ
หรือปัญหาที่ไม่ควาดฝันเยอะ
นั่นหมายความว่า เป็น image ที่ไม่ใช่ official nodejs runtime
ซึ่งไม่แนะนำให้ใช้บน production
ให้ใช้ในการพัฒนา หรือ ทดลองเท่านั้น
ส่วนที่ไม่แนะนำให้ใช้อีกคือ node:buster
เนื่องจากเป็น image ที่ใช้งาน Debian 10
ซึ่งสิ้นสุดการ maintain เมื่อเดือนสิงหาคม 2022 ที่ผ่านมา
ดังนั้นในทางเลือกที่ดีกว่า ควรใช้งาน node:bullseyes (Debian 11)
และแนะนำให้ใช้งาน node:bullseyes-slim
ทั้งเป็นตัวใหม่ และมีขนาดเล็กกว่า ปัญหาน้อยกว่า
เป็นตัวเริ่มต้นที่ดี
ส่วน image ที่มี tag LTS และ Current ไม่แตกต่างกันมากนัก
และอีกตัวที่แนะนำให้ใช้งานคือ Image จาก Google distroless
เนื่องจากมีขนาดเล็ก dependency น้อย ปัญหาน้อย
แถม update glibc และ node version ให้เองตลอด เนื่องจากใช้งาน Debian นั่นเอง
แต่จะไม่มี package manager หรือ เครื่องมือในการพัฒนาใด ๆ
เนื่องจากเป้าหมายคือ การ run Node.js app เท่านั้น
ตัวอย่างการใช้งาน
[gist id="c78905201e5ec18c50cf00a7f2dd7d15" file="Dockerfile2"]ดังนั้นลองพิจารณาดูกันนะครับ ในการเรื่อง Docker image ที่เหมาะสมกับเรา
โดยมองในมุมต่าง ๆ ทั้ง
- ขนาดของ image
- จำนวน dependency
- ปัญหาด้าน security
- การ maintain
- ประสิทธิภาพการทำงาน
Reference Websites