ลองเล่น Docker Swarm Visualizer บน localhost สำหรับ windows 10 กัน
Docker swarm คืออะไร มันเป็นเหมือนตัวช่วยรวบรวม vm docker ตัวอื่นๆให้อยู่ในระบบ host เดียวกันได้ ถ้าตัวใดตัวหนึ่งตายไป ก็จะแบ่ง load balance ไปยังตัวที่เหลือ ก็อาจจะมีทั้งโอกาสที่ตัว manager ตายหรือตัว worker ตาย นอกจากประโยชน์เรื่อง load balance แล้วยังมีข้อดีในเรื่องการ scale ระบบด้วย แบบมี service web nginx อยู่แต่ต้องการเพิ่มให้รองรับคน 100 คนก็สเกลเท่ากับ 100 ไปเลย สะดวกมาก
ในขั้นตอนเริ่มต้นการลง docker บน windows 10 จะมีลง package manager ช่วยที่ชื่อ chocolately และ virtualbox สามารถดูได้จากบทความก่อนหน้าอันนี้ได้
ทีนี้นอกจาก chocolately และ virtualbox แล้วจะต้องติดตั้ง docker-machine ด้วยคำสั่ง choco install -y docker-machine
ทีนี้เรามาเริ่มกันเลยดีกว่า.. สร้าง docker-machine ตัวแรกขึ้นมาใช้คำสั่ง
docker-machine create -d virtualbox docker03 (docker03 คือตั้งชื่อเครื่อง)
copy บรรทัดที่เข้นเส้นใต้สีแดงไว้ในหน้าจอ terminal ตัวเองมารัน
แล้วก็ copy บรรทัด token สีแดงที่ลากไว้มารันอีกที แล้วลองเช็คเครื่องที่กำลังทำงานอยู่ด้วยคำสั่ง docker-machine ls จะเห็นว่ามีเครื่องหมาย * ที่คอลลัมน์ active เพื่อแสดงว่าตอนนี้เรากำลังใช้ docker host ตัวนี้นะ
ทีนี้การจะสร้าง docker swarm เราต้อง ssh เข้าไปใน vm เครื่องนั้นก่อนด้วยคำสั่ง
docker-machine ssh docker03
จากนั้นทำการสร้าง node ตัวแรกขึ้นมา ซึ่ง node ตัวแรกจะได้รับสถานะเป็น manager เสมอ ใช้คำสั่ง docker swarm init — advertise-addr 192.168.99.105:2377
ตรง ip ไปเปลี่ยนเป็นเครื่องตัวเองเอานะ ดู ip ของเครื่องได้จาก docker-machine ls จะเห็นว่าในรูป docker03 ได้รับ ip เป็น 192.168.99.105:2376 คือ port 2376 เป็นของ docker daemon แต่ port 2377 จะถูกสงวนไว้ให้ใช้กับ docker sworm และเมื่อทำการ init เสร็จเราจะได้รับ token manager ออกมาสำหรับสร้าง woker ไว้ join
ทีนี้เราจะขอทำตัว manager ให้เสร็จก่อน เราจะสร้างหน้าเว็บดูการทำงานของ cluster และ sevice ต่างๆในระบบเรา ในที่นี้ใช้ dockersamples/visualizer ใช้คำสั่ง docker run -it -d -p 5001:8080 -v /var/run/docker.sock:/var/run/docker.sock dockersamples/visualizer
ทดสอบเปิด browser ขึ้นมา ในที่นี้เรา map ไว้ที่ port 5001 และ ip เครื่องนี้คือ 192.168.99.105 ก็เป็น 192.168.99.105:5001
จะเห็นว่ามีหน้ามอนิเตอร์ไฟสีเขียวแสดงว่า docker03 กำลังรันอยู่และเป็น manager
ทีนี้ลอง create service ให้กับ manager เป็น web nginx ใช้คำสั่ง
docker service create — name=web — publish=80:80 nginx
มันค่อนข้าง realtime คือเปิดหน้าเว็บอีกทีไม่ได้ refresh เว็บ จะเห็นว่าด้านล่างมี service web เพิ่มขึ้นมาแล้ว ทีนี้มาลอง scale เพิ่ม service web เราเป็นสองตัวใช้คำสั่ง docker service scale web=2 (web อันนี้เอาจากชื่อ name ที่เราตั้งนะ)
ในรูปจะเห็นว่ามี web เพิ่มเป็น 2 ตัวแล้วหรือเช็คว่าตอนนี้มี service กี่อันรันอยู่ได้ด้วยคำสั่ง docker service ls
ทีนี้มาลองสร้าง worker ให้กับ manager นี้กัน ก็ exit ไปสร้าง docker machine ตัวใหม่ (คนละ vm) สมมติ docker ตัวใหม่เราตั้งชื่อว่า docker04 ก็ใช้คำสั่งว่า
docker-machine create -d virtualbox docker04
แล้วก็ไล่ตามคำสั่งเดิมเหมือนตอนแรกที่สร้าง docker03 ที่พิมพ์ว่า
docker-machine.exe env docker04 เพื่อไปเอาคำสั่งเรียกใช้ token
ทีนี้เราต้องการให้ docker04 เป็น worker เราก็เอา token ที่ได้จากตอน init manager ตอนแรกมา join ตามรูปจะได้ผลลัพธ์ว่า This node joined a swarm as worker.
พอได้ worker แล้วเราก็ออก กลับมา ssh เข้าเครื่อง manager docker03 ของเรา แล้วลองเช็คว่าตอนนี้มี node กี่อันที่เชื่อมอยู่ด้วยคำสั่ง docker node ls
จะเห็นว่าตัว manager จะมีสถานะขึ้นว่า leader แต่ woker ไม่มี
จะเห็นว่ามี worker docker04 เพิ่มขึ้นมา และ service web ถูกกระจายไป ทีนี้เราลอง exit ออกไป ทดสอบหยุดการทำงาน worker ดูว่าจะเกิดอะไรขึ้นใช้คำสั่ง
docker-machine stop docker04
web service ถูกดึงกลับไปอยู่กับตัว manager แทน
ในกรณีที่ลืม token ของ manager หรือ worker สามารถใช้คำสั่งเรียกดูได้เพื่อใช้ในการ join ครั้งต่อไป
กรณี manager: docker swarm join-token manager
กรณี worker: docker swarm join-token worker
เรื่องควรรู้คือ docker swarm จะทำงานโดยใช้ driver network overlay เมื่อกำลังทำงานอยู่จะมี network ชื่อ ingress เพิ่มขึ้นมา สามารถเช็ค network โดยใช้คำสั่ง
docker network ls
docker swarm ยังมีวิธีเล่นอื่นๆอีกเช่น stack ซึ่งต้องเขียนสคริป เหมือน docker-compose คือใช้สกุล .yml
vi เป็นคำสั่งสร้างไฟล์และเขียนไฟล์ กดปุ่ม insert เพิ่มเขียนและ save พร้อมออกจากไฟล์ด้วย :wq ทุกคนสามารถดูวิธีการแบบละเอียดการใช้ stack และ script ได้จาก
ทดสอบผลลัพธ์ให้ใช้ ip ของ vm docker เครื่องของเรา อย่างอันนี้ลองเล่น stack ในเครื่อง docker02 ใช้คำสั่ง docker-machine ls เช็ค ip เครื่องจะเห็น192.168.99.104