มาเล่น Docker Swarm Visualizer กันเถอะ
สืบเนื่องจากเมื่อวันที่ 28 ม.ค. 2560 ผมได้มีโอกาสจัดคอร์สเทรนนิ่ง Docker กันภายในบริษัทซึ่งตัวเนื้อหาก็จะเป็นการเล่าพื้นฐานและมี Workshop ย่อยๆ ตามหัวข้อดังนี้
- Software Container คืออะไร
- การใช้งาน Docker เพื่อให้เข้าใจ Concept “Build, Ship, Run”
- การจัดการ Container หลาย ๆ ตัวด้วย Docker Compose
- Provisioning Docker-Host ด้วย Docker Machine
- สุดท้ายก็จบด้วยการสร้าง Cluster ด้วย Docker Swarm
จริงๆ ก็ไม่มีอะไรน่าตื่นเต้นครับ เพราะเนื้อหาเป็นแค่พื้นฐานเท่านั้น แต่ตอน Workshop ของ Docker Swarm นี่สิทำยังไงจะทำให้คนที่มาฟังเรา เข้าใจและเห็นภาพ เน้นว่า “เห็นภาพ” การทำงานของ Docker Swarm นี่มัน Thailand 4.0 แล้วนะ จะมัวมองแต่ Terminal ดำๆ ได้ไง 555+ พอดีไปเจอเจ้าตัวนี้: Docker Swarm Visualizer จึงเป็นที่มาของชื่อ Blog นี้ครับ
เข้าเรื่องกันดีกว่า Docker Swarm Visualizer คืออะไรชื่อมันก็บอกอยู่แล้วครับคือการทำ visualizer ให้กับตัว Docker Swarm จากที่คอยเคาะ Command บน Terminal เพื่อดูว่า Node ใน Cluster ของเราตอนนี้มีกี่ Node หรือ ตอนสั่ง Replicas Service เราก็อยากจะรู้ว่าแต่ล่ะ Task มันไปลงที่ Node ไหนก็ให้ภาพมันอธิบายซะเลยสิ จะได้เห็นกันชัดๆ ปั๊ดโถ๊วววววววว!!!
อ่านรายละเอียดเพิ่มเติม: https://github.com/ManoMarks/docker-swarm-visualizer
Note: This only works with Docker Swarm Mode in Docker Engine 1.12.0 and later. It does not work with the separate Docker Swarm project.
เริ่มด้วยการ Provisioning Docker Host ด้วย Docker Machine ผมใช้เป็น 1 Manager 3 Worker รวมเป็น 4 Nodes
(-d หรือ –driver มีหลายตัวนะครับเข้าไปดูเพิ่มเติมจากลิงค์นี้ครับ https://docs.docker.com/machine/drivers/ ในตัวอย่างผมใช้เป็น virtualbox)
$ docker-machine create -d virtualbox manager01 $ docker-machine create -d virtualbox worker01 $ docker-machine create -d virtualbox worker02 $ docker-machine create -d virtualbox worker03
ตรวจสอบให้แน่ใจว่าได้ 4 Nodes อย่างที่สร้างไว้หรือเปล่า:
$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS manager01 * virtualbox Running tcp://192.168.99.100:2376 v17.03.0-ce worker01 - virtualbox Running tcp://192.168.99.101:2376 v17.03.0-ce worker02 - virtualbox Running tcp://192.168.99.102:2376 v17.03.0-ce worker03 - virtualbox Running tcp://192.168.99.103:2376 v17.03.0-ce
ต่อด้วยสร้าง Cluster:
$ docker-machine ssh manager01 "docker swarm init --advertise-addr 192.168.99.100"
หรือ
$ eval $(docker-machine env manager01) $ docker swarm init --advertise-addr 192.168.99.100
หลังจากที่เราใช้คำสั่ง docker swarm init เราจะได้ Token สำหรับให้ node อื่นมา join cluster ประมาณนี้:
Swarm initialized: current node (r2tn81j7z9c619v5wm0df6u94) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-16c9xpw9m9f2o2tl5gn3qpdk8iss80ebj2zmha7tnajjhk3hgk-aegjp1uk82vzt6tw3rf8mky4s \ 192.168.99.100:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
แต่ยังไม่ต้องเอา Node อื่นมา Join Cluster นะ ให้รันคำสั่งเพื่อสร้าง Service ไอ้ Visualizer ที่ว่ามานั่นแหละก่อน
$ docker service create \ --name=viz \ --publish=8080:8080/tcp \ --constraint=node.role==manager \ --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \ manomarks/visualizer
จะได้เลข ID ของ Service ที่ชื่อว่า viz ใครทำตามแล้วได้เลขอื่น ไม่ต้องเครียดนะ ก็แล้วแต่ว่ามันจะ Generate อะไรให้ ตัวนี้เราไม่สนใจแค่อยากบอกเฉยๆ 555
0ajbpkqsujk6i6qcf2lw9l51b
เช็ค Service ดูซักหน่อยว่าพร้อมใช้งานแล้วหรือยัง
$ docker service ls ID NAME MODE REPLICAS IMAGE 0ajbpkqsujk6 viz replicated 0/1 manomarks/visualizer:latest
ถ้าลองเปิด Web Browser แล้วเข้าไปที่ IP ที่เป็นของ Manager ที่นี้ 192.168.99.100 ตามด้วย Port 8080 ตามที่ Map ไว้ในตอนสร้าง Service ก็ยังยังใช้งานไม่ได้ เพราะ REPLICAS ยังเป็น 0/1 ต้องรอให้เป็น 1/1 ก่อนเน้อ
$ docker service ls ID NAME MODE REPLICAS IMAGE 0ajbpkqsujk6 viz replicated 1/1 manomarks/visualizer:latest
พอ REPLICAS เป็น 1/1 แล้วก็เปิด Web Browser แล้วพิมพ์ 192.168.99.100:8080 (IP ท่านไม่จำเป็นต้องเหมือนผมนะครับ Manager ของท่านเป็น IP อะไรก็เอาตามนั้นอย่าเลียนแบบผม) กระแทก Enter ดัง ๆ ก็จะได้เจ้าตัว Visualizer ที่โม้มาแล้วจ้า สำหรับ Web Browser เปิดค้างไว้เลยเพราะมันแสดงผล (เกือบจะ) Real time
หลังจากนั้นเราก็เอา token ที่ได้จากการรัน docker swarm init ไปรันที่ worker01, worker02, worker03 ถ้าลืมไปแล้วก็รัน docker swarm join-token worker ที่ Manager (อยาก join ในส่วนของ Manager ก็เปลี่ยนจาก worker เป็น manager จอบอ):
$ docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-16c9xpw9m9f2o2tl5gn3qpdk8iss80ebj2zmha7tnajjhk3hgk-aegjp1uk82vzt6tw3rf8mky4s \ 192.168.99.100:2377
แล้ว Copy Command ที่มันบอกมาไปวางที่ Node: worker01, worker02, worker03
$ eval $(docker-machine env worker01) $ docker swarm join \ --token SWMTKN-1-16c9xpw9m9f2o2tl5gn3qpdk8iss80ebj2zmha7tnajjhk3hgk-aegjp1uk82vzt6tw3rf8mky4s \ 192.168.99.100:2377
จะได้ผลลัพธ์แบบนี้:
This node joined a swarm as a worker.
จากนั้นก็ไปเช็คที่ Node Manager ดูว่ามี Node Join เข้ามาหรือยัง
$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ol23e9qoopikf941f2eihqu6l worker01 Ready Active r2tn81j7z9c619v5wm0df6u94 * manager01 Ready Active Leader
กลับไปที่หน้าเว็บ Visualizer เราก็จะพบว่ามี Node ที่เป็น Worker Join เข้ามาแล้นนนนนนนนนนน
Node worker02, worker03 ก็ join แบบเดียวกับ worker01 นั่นแหละ ขอละไว้ในฐานที่เข้าใจ ถ้าเรา Join ครบแล้วจะได้หน้าตาประมาณนี้
ต่อไปเราจะสร้าง Service เพิ่มอีกซักตัวเพื่อดูว่ามันกระจาย Task กันยังไง (ต้องสร้างบน Node ที่เป็น Manager นะ)
$ docker service create --name web --replicas 1 -p 80:80 nginx xgm7z5zdmh8kba3sfx444njre
จะเห็นได้ว่ามี Service ที่ชื่อว่า web โพล่มาแล้ว
แค่นี้ถ้ายังไม่แจ่ม ลอง Scale Service web เป็น 5 ดู
$ docker service scale web=5 web scaled to 5
จากภาพที่เห็นมันแดงๆ เพราะมันกำลังไป pull image ลงมานะครับ รอครับรอ อย่ารีบ ทำเป็นวัยรุ่นใจร้อนไปได้ !!!
ลอง Scale Service web กลับมาเป็น 1 (ก่อนหน้านี้ Scale ไป 5 ทำม๊ายยยยยย!!!)
$ docker service scale web=1 web scaled to 1
สุดท้ายลบ Node ออกจาก Cluster (อยากลบ Node ก็แล้วแต่ท่านนะครับ)
$ eval $(docker-machine env worker03) $ docker swarm leave Node left the swarm. $docker node rm worker03 worker03
$ eval $(docker-machine env worker02) $ docker swarm leave Node left the swarm. $docker node rm worker02 worker02
คงจะเห็นภาพการทำงาน ของ Docker Swarm (แบบโคตรจะพื้นฐาน) กันนะครับเพราะผมแคปมาให้ดูแล้วตั้งหลายภาพ อิอิ
บทความนี้เป็นบทความแรกในชีวิตนะครับ ผิดพลาดตรงไหนต้องขออภัยไว้ ณ ที่นี้ด้วย เจอกันบทความหน้าครับ ^_^