docker
จากที่ไปลงเรียน Course การพัฒนา PHP บน Windows แบบ Build, Ship and Run anywhere
ซึ่งจัดการผ่าน Docker นั่นเอง
มีสิ่งหนึ่งที่น่าสนใจมาก ๆ คือ คำแนะนำสำหรับการใช้งาน Docker ที่ดี
จึงทำการสรุปมาไว้นิดหน่อยดังนี้

1. ในแต่ละ container ควรทำงานเพียงอย่างเดียว

หรือว่ามีเพียง service เดียวที่ทำงาน
หรือว่ามีเพียง process เดียวที่ start ขึ้นมา
เช่น
Container สำหรับ Web server  คือ nginx
Container สำหรับ Database server คือ MySQL

ดังนั้นอย่าพยายามที่จะ start หลาย ๆ process ขึ้นมาใน container เดียว
นั่นคือในแต่ละ image ที่สร้างจะมีเพียงงานเดียวเท่านั้น
เป็นหนึ่งในแนวคิด Separation of Concern (SoC)
ส่งผลให้เราสามารถจัดการ image ได้ง่ายขึ้น

ลองคิดดูเล่น ๆ สิว่า
ถ้าใน container หนึ่ง ๆ มีทั้ง web server, database server, monitoring server แล้ว
การจัดการจะลำบากเพียงใด

2. อย่าเก็บข้อมูลไว้ใน container นะจะบอกให้

โดยหลักการแล้วนั้นในแต่ละ container ควรเป็นแบบ stateless
และไม่ทำการเก็บข้อมูลไว้ใน container
ไม่เช่นนั้น container จะโตขึ้นเรื่อย ๆ
จนสุดท้ายจะทำให้ container มีปัญหา ซึ่งจัดการได้ยากมาก ๆ
ถ้า container นั้นถูก terminate ไป ข้อมูลหายหมดนะครับ !!

ลองคิดดูสิว่า ถ้าจะสร้าง container ขึ้นมาใหม่
จะต้องทำการ load ข้อมูลจำนวนมากเข้าออก
มันน่าจะไม่ใช่แนวทางที่ดีเลยนะ

ดังนั้นสิ่งที่ควรใช้คือ volume mapping นะ
เพื่อทำการจัดเก็บข้อมูลนอก container

3. Image ควรมีขนาดเล็ก และมีของเท่าที่จำเป็นเท่านั้น

เช่นถ้าใช้ Dockerfile แล้ว ก็ควรมีไฟล์ .dockerignore ด้วย
เพื่อไม่เอาไฟล์อื่น ๆ เข้าไปยัง image ด้วย
เช่น log, source code และ artifact อื่น ๆ ที่ไม่จำเป็น

4. อย่าสร้าง image จาก container ที่ทำงานอยู่ !!

เนื่องจากบ่อยครั้งจะพบว่า image เหล่านั้นไม่สามารถสร้างขึ้นมาใหม่ได้อีก
หรือไม่สามารถสร้างจาก Dockerfile หรือ จากการ run command line ให้เหมือนเดิมได้เลย
สิ่งที่แนะนำเลยก็คือ
ทำการแก้ไข Dockerfile หรือ command line
จากนั้นทำการลบ container
ปิดด้วยการสร้าง container จาก image ตัวใหม่

แต่ก็มีบางกรณีที่ต้องสร้าง image จาก container ที่ทำงานอยู่
ด้วยคำสั่ง docker commit ก็ให้ดูเป็นกรณีไป
แต่ไม่ค่อยแนะนำเท่าไรนะ

5. ในการอ้างถึง image ใด ๆ ก็ตามควรระบุ version ให้ชัดเจน

แนะนำว่าอย่าใช้ latest version ด้วยนะ
เนื่องจากอาจจะไม่ใช่ image version ล่าสุดก็ได้
หรืออาจจะได้ version เก่ามาอีกก็เป็นได้
ขึ้นอยู่กับความรอบคอบของผู้ดูแล image นั้น ๆ

6. อย่า publish port ทั้งหมดที่ใช้งานใน container ออกมานะ

publish port เท่าที่จำเป็นก็พอ
ดังนั้นให้ใช้ -p ก็พอนะ
อย่าใช้ -P นะ มันน่ากลัวมาก !!

7. แต่ละ container อย่าติดต่อกันผ่าน IP นะ !!

ในแต่ละ container จะมี IP เป็นของตัวเอง
ดังนั้นถ้ามีการติดต่อสื่อสารกันระหว่าง container
ห้ามใช้ IP โดยเด็ดขาด
เนื่องจากในโลกของ container นั้น
เราจะลบหรือสร้างมันได้ตลอดเวลา
ที่สำคัญแต่ละ container อาจจะได้ IP ใหม่มาอีกนะสิ !!

ลองคิดดูสิว่าถ้าเราใช้ IP ในการติดต่อสื่อสารกัน
จะต้องมานั่นแก้ไข IP ในไฟล์ configuration กันเหนื่อยเลยนะ
ซึ่งมันไม่คุ้ม และใช้งาน Docker ผิดวิธีแล้วนะ

ดังนั้นแนะนำให้ใช้ชื่อผ่านระบบ network หรือผ่าน Load balance แทนนะครับ

ปิดท้ายด้วย
ในแต่ละ environment เช่น Dev, Test, UAT, Stage และ Production
อย่าใช้ image ที่แตกต่างกันนะ

Tags: