ในตอนนี้ เราก็จะขยับขึ้นไปอีก 1 level ใน hierachy ของ distributed application
Stack
Service (ในตอนนี้เราอยู่ที่นี่)
Container
Service 1 Service รันจาก 1 image โดยระบุ port ที่จะใช้ กำหนดจำนวน contrainer ที่จะรัน โดยที่เราสามารถเพิ่มจำนวน (Scale) service ให้รองรับโหลดมาก ๆ ได้ เราจะทำได้โดยการเขียน docker-compose.yml
เริ่มต้นโดยการสร้างไฟล์นี้ไว้ใน directory ว่าง
mkdir myservice cd myservice
สร้างไฟล์ชื่อ docker-compose.yml ด้วยเอดิเตอร์ vi ดังนี้
vi docker-compose.yml
คัดลอกเนื้อหาจากตัวอย่าง https://docs.docker.com/get-started/part3/#your-first-docker-composeyml-file
โดยแก้ไขในบรรทัด
image: username/repository:tag
ให้เป็น
image: woonpsu/docsdocker:part1
ดังนี้
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: woonpsu/docsdocker:part1
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
- webnet
networks:
webnet:
สำหรับสิ่งที่อยู่ในไฟล์ docker-compose.yml นั้น อธิบายอย่างคร่าว ๆ ก็คือจะบอกว่า ดึง image ที่เรา upload ไว้จากบทความในตอนที่แล้ว ซึ่งก็คือ woonpsu/docsdocker:part1 จะสร้าง container กี่อันจาก image นี้ และจะใช้ %CPU เท่าไร จะใช้ Port หมายเลขอะไร มี network อะไรสำหรับทำ load-balancing (a load-balanced overlay network)
สังเกตในไฟล์ Compose จะเห็นการกำหนดค่า version: เป็น “3” คือความหมายที่เกี่ยวกับเรื่อง compatibility สรุปอย่างสั้น ๆ คือ เราจะทำต่อไปยังตัวอย่างการใช้งาน docker swarm จึงใช้ค่า version เป็น 3
ตอนนี้ก็มารัน load-balancing กัน โดยเริ่มต้นสร้างหรือเข้าร่วม swarm
docker swarm init
หากไม่ run คำสั่งนี้ ก็จะพบ error “this node is not a swarm manager.”
ตั้งชื่อ app เช่น testlab เป็นต้น แล้วพิมพ์คำสั่งดังนี้
docker stack deploy -c docker-compose.yml testlab
ตรวจดูรายการ
docker stack ps testlab
ถึงตรงนี้ เราลองไปที่ http://server_ip แล้วกด F5 ซ้ำ ๆ จะเห็นว่า หน้าเว็บที่แสดงนั้นถูกดึงมาจาก container แต่ละตัว สังเกตที่หลังคำว่า Hostname จะเป็นเลข container ID ที่ให้บริการ
หากเราต้องการเพิ่มจำนวน replicas ก็เข้าไปแก้ไขไฟล์ docker-compose.yml แล้วรันคำสั่ง deploy อีกรอบ จะพบจำนวน container ที่เพิ่มขึ้น
หากต้องการเลิกใช้ app ชื่อ testlab ดังนี้
docker stack rm testlab
หากต้องการออกจาก swarm ด้วยคำสั่ง
docker swarm leave --force
ในตอนต่อไป เราจะได้เรียนรู้การใช้งานจริง ๆ กันหละ คือรัน app เป็น swarm บน cluster ของเครื่องมากกว่า 1 เครื่อง
ข้างล่างนี้คือบันทึก output ของคำสั่งที่ใช้
mama@ubuntu:~/myservice$ docker swarm init
Swarm initialized: current node (bph2py545b2uglv68vmy4qnno) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5h25g0ywnp87ohk1pav8mon72zdmotqbbunj4bu88fq7sxm2go-57cqncfd2mzapxg2525q14nug 192.168.6.22:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
mama@ubuntu:~/myservice$ docker stack deploy -c docker-compose.yml testlab
Creating network testlab_webnet
Creating service testlab_web
mama@ubuntu:~/myservice$ docker stack ps testlab
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
dqzbgtw1cv8b testlab_web.1 woonpsu/docsdocker:part1 ubuntu Running Running about a minute ago
il7xlem822wf testlab_web.2 woonpsu/docsdocker:part1 ubuntu Running Running about a minute ago
j1scjgeprrr2 testlab_web.3 woonpsu/docsdocker:part1 ubuntu Running Running about a minute ago
k1qclfcosako testlab_web.4 woonpsu/docsdocker:part1 ubuntu Running Running about a minute ago
o9plgp6ghv9f testlab_web.5 woonpsu/docsdocker:part1 ubuntu Running Running about a minute ago
mama@ubuntu:~/myservice$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ftg9wrcso3tnpimg5isj1hz6j * ubuntu Ready Active Leader
mama@ubuntu:~/myservice$ docker stack rm testlab
Removing service testlab_web
Removing network testlab_webnet
mama@ubuntu:~/myservice$ docker swarm leave --force
Node left the swarm.
mama@ubuntu:~/myservice$ docker node ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
References:
Get Started https://docs.docker.com/get-started/