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 นั่นเอง

ทำการ 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

docker-web-01

ต่อไปถ้าเอามา Scale พวก Microservice น่าจะง่ายดีนะ
และมีคำถามมากมายจาก Slide เรื่อง What’s New in Docker 1.12 ?
ไว้ศึกษากันต่อไป มันเยอะจริง ๆ

Code ตัวอย่างอยู่ที่ Github::Up1