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