![docker-web-00]()
![docker-web-00]()
จาก 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
ต่อไปถ้าเอามา Scale พวก Microservice น่าจะง่ายดีนะ
และมีคำถามมากมายจาก Slide เรื่อง
What’s New in Docker 1.12 ?
ไว้ศึกษากันต่อไป มันเยอะจริง ๆ
Code ตัวอย่างอยู่ที่
Github::Up1