เตาะแตะไปกับ Docker ตอนที่ 2 Services (Scale and load-balancing)

ในตอนนี้ เราก็จะขยับขึ้นไปอีก 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/