จาก blog เรื่อง มาลอง Scale Elasticsearch ด้วย Docker Swarm Mode กันหน่อย
คำถามที่น่าสนใจสำหรับการเริ่มต้นใช้งาน Docker Swarm Mode คือ
- ถ้ามีหลาย ๆ container แล้วตอนทำงานจริง ๆ มันทำงานบน container ไหน ?
- ที่บอกว่ามี Load balance มันทำงานจริง ๆ หรือไม่ ?
- Load balance ทำงานแบบไหน ?
เริ่มด้วยการสร้างระบบ web application อย่างง่ายด้วยภาษา Go ขึ้นมา
โดยทำการแสดง Hostname หรือ ชื่อเครื่องออกมาเท่านั้นเอง เมื่ออยู่ใน Docker มันก็คือ container id นั่นเอง [gist id="9e00b841ece6447da36237646940bb41" file="hello.go"] ทำการ compile และทดสอบดูก่อนนะ ว่าทำงานตามที่คาดหวังหรือไม่ จากนั้นทำการสร้างไฟล์ Dockerfile ขึ้นมา เพื่อกำหนดขั้นตอนการทำงานต่าง ๆ ดังนี้ [gist id="9e00b841ece6447da36237646940bb41" file="Dockerfile"] สร้าง image ชื่อว่า web ด้วยคำสั่ง [code] $docker build -t web . [/code]ทำการ setup Swarm Mode กัน
[code] $docker swarm init [/code] เมื่อทุกอย่างพร้อมก็สร้าง service ใช้กันเลย โดย service ชื่อว่า hello-web [code] $docker service create --publish 8080:8080 --name hello-web web [/code] ลองทดสอบการทำงานผ่าน curl หรือเปิด browser ก็ได้ [code] $curl http://localhost:8080 ได้ผลการทำงานดังนี้ Hello world, I'm running on <container id> [/code]ทำการ Scale ให้ service ชื่อว่า hello-web มีสัก 10 เครื่อง ด้วยคำสั่ง
[code] $docker service scale hello-web=10 [/code] ต่อมาทำการยิงแบบรัว ๆ ผ่าน curl ได้ผลการทำงานเป็นดังรูป ซึ่งตอบคำถามได้หมดเลย เมื่อยิง request ไปยัง http://localhost:8080 พบว่า- แต่ละ request จะกระจายไปยัง container ต่าง ๆ
- แสดงว่า Load balance ทำงานจริง ๆ
- จากรูปด้านล่างจะพบว่า Load balance ทำงานแบบ Round-robin