[บันทึกความเข้าใจ] การควบคุม Environment ของ Software กับเทคโนโลยี Container
สวัสดีครับ บทความนี้ผมจะมาเล่าเกี่ยวกับสิ่งที่ผมได้เรียนรู้มา เกี่ยวกับการใช้งาน เทคโนโลยี Container กับความสำคัญของการควบคุม Environments กันครับ ซึ่งโดยภายในบทความนี้จะเป็นการเขียนที่มาจากการศึกษา และทำความเข้าใจออกมาในรูปแบบของตัวเองดูครับ
ในการพัฒนาโปรแกรม เคยเจอปัญหาแนว ๆ นี้กันบ้างไหมครับ
โปรแกรมใช้งานเครื่องตัวเองได้ แต่บนเครื่องของเพื่อนร่วมงานกลับพังซะงั้น!
โค้ด Build ผ่านบ้าง ไม่ผ่านบ้างไม่รู้ว่าผิดที่ตรงไหน?
ทุกอย่างสามารถทำงานได้เป็นปกติ ยกเว้นบน Production
เผลอไปทำการ Update Version ของ Database จากนั้นระบบก็ใช้งานไม่ได้
แล้วหลังจากผ่านไป วันแล้ววันเล่าก็พบว่าปัญหามาจาก
“ความต่าง Environments ของ Software” เช่น
Version Java ของเครื่องเราใหม่เกินไป , Database ใช้คนละ Version หรือ หนักกว่านั้นเลยคือ ทีมเราพัฒนาและทดสอบบน Windows แต่ตอนลงเครื่องให้ลูกค้าใช้งานจริงเป็น Linux !!
ความต่างเหล่านี้อาจจะทำให้เกิดปัญหาได้ หากเราละเลยที่จะใส่ใจกับมัน
ซึ่งจริง ๆ แล้วคำว่า Environment นั้นไม่ใช่แค่เพียงส่วนของ Version โปรแกรม ที่เกี่ยวข้องกับระบบของเราเท่านั้น แต่รวมถึงเหล่า Infrastructure ทั้งหลายด้วย Version/Patch ของระบบปฏิบัติการ จนลึกถึงขั้น Hardware เลยก็เป็นได้
ในยุคก่อน ๆ ที่การทำงานแบ่งเป็นช่วง ปัญหาที่ผมพูดมาก่อนหน้านี้มักจะเจอตอนช่วงท้ายก่อนที่จะส่งงาน หรือว่า Deadline นั่นเอง ซึ่งแน่นอนว่าปัญหาต่าง ๆ ยิ่งตรวจเจอได้ช้า ค่าใช้จ่ายในการแก้ไขไม่ว่าจะเป็นแรงในการที่ต้องหาข้อผิดพลาด เวลาที่ต้องเสียไปก็ย่อมสูงขึ้นตามด้วย จึงส่งผลเกิดเป็นแนวคิดที่ว่า
งั้นเราก็ส่งงานกันบ่อย ๆ สิ จะได้เจอปัญหาได้เร็ว
เราจะตรวจรับงานกันทุก 1–2 อาทิตย์บนเครื่องเหมือนกับเครื่อง Production จริง
คุ้น ๆ กันไหมครับ ?
โดยแนวคิดด้านบนที่ว่า เป็นการจัดการกับความเสี่ยง ซึ่งจริง ๆ แล้วการทำงานเป็นรอบนี่ มันเกิดขึ้นมาก่อนพวก Container ที่ผมกำลังจะพูดถึงเสียอีก ซึ่งในยุคก่อนการที่จะจำลองเครื่องที่เหมือนกับ Production ได้ก็เริ่มจากสั่งเครื่องเซิฟเวอร์มาสองเครื่องที่สเปคเดียวกันแล้วตั้งค่าให้เหมือนกันมากที่สุด จากนั้นก็เริ่มมีเทคโนโลยี Virtual Machine จำลองเครื่องได้ ทำ Image ที่เหมือนกับเครื่องที่เราต้องการไว้ใช้ได้ จนมาถึงเทคโนโลยี Container ที่มีขนาดเล็กและความสามารถอื่น ๆ มากมายในปัจจุบัน เพื่อช่วยในการจัดการ Environment และเป็นส่วนช่วยในการพัฒนาและส่งมอบ Software ที่ใช้กันแพร่หลายในปัจจุบัน
ตัวอย่างความสามารถการใช้เทคโนโลยี Container อย่างเช่น
- นักพัฒนาสามารถจำลองเครื่อง Production ไว้บนเครื่องของตัวเองเพื่อใช้ทดสอบ เพียงในเวลาไม่กี่วินาที
- Environment สามารถทำ Reversion ได้ง่าย (ทำ Version ของ Environment แล้วย้อนกลับไปเลือก Version ที่เราต้องการได้)
- System Engineer สามารถสร้างเครื่องไว้ให้ Tester ทดสอบระบบได้ในไม่กี่นาที
- สนับสนุนการทำ Automation Deployment
- ทำการ Scale ได้สะดวกสุด ๆ
ก่อนหน้านี้ผมมองพวกเครื่องมืออย่างเช่น Docker เป็นแค่เครื่องมือในการทำงานอย่างหนึ่งเท่านั้น คิดแค่ว่า มันทำมาให้ใช้งานง่าย ให้ใช้งานสะดวก แต่พอเมื่อลองศึกษาหลาย ๆ เรื่องดู เครื่องมือที่เกิดขึ้นในปัจจุบันล้วนเกิดมาเพื่อแก้ไขปัญหาบางอย่าง การได้รู้เรื่องเหล่านี้ทำให้เข้าใจและสามารถใช้เครื่องมือได้ตามวัตถุประสงค์ของการสร้างได้มากขึ้น
If It Hurts, Do It More Frequently, and Bring the Pain Forward