เตาะแตะไปกับ Docker ตอนที่ 4 Stacks

ในตอนที่แล้ว เราได้เรียนรู้แล้วว่าเราสามารถสร้าง swarm ที่เป็น cluster of machines ที่รัน Docker แล้ว deploy app เกิดเป็น container จำนวนหนึ่งที่กระจายอยู่ในเครื่อง 2 เครื่อง

ในตอนนี้ เราจะทำความเข้าใจในส่วนบนสุดใน hierachy ของ distributed applications คือ

Stack (ในตอนนี้เราอยู่ที่นี่)
Service
Container

Stacks คือ การนำ service หลาย ๆ อันที่ทำงานร่วมกัน เช่น จาก web page จะมีการนำข้อมูลไปใส่ใน database หรือ สร้าง web page ที่จะนำข้อมูลไป plot เป็น กราฟ เป็นต้น

ในตอนที่ 2 นั้นเราได้ใช้คำสั่งเกี่ยวกับ stack ไปบ้างแล้วเป็น single stack ที่รันอยู่บน single host ซึ่งไม่ค่อยเกิดขึ้นจริงใน production แต่เราอาจจะต้องทำ multiple services รันไปบน multiple machines ก็ได้ มาดูกันต่อไป

ตัวอย่างเช่น เราจะเพิ่ม service เกี่ยวกับการสร้างภาพ diagram ของ swarm ของเรา ทำดังนี้
1. ไปยังเครื่องที่มีไฟล์ docker-compose.yml ที่สร้างไว้แล้ว

cd ~/myservice

2. เปิดไฟล์ docker-compose.yml แล้วเพิ่ม service ชื่อ visualizer ดังนี้

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: woonpsu/docsdocker:part1
    deploy:
      replicas: 5
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
      - "80:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
networks:
  webnet:

ที่เพิ่มเข้ามา 1 service ก็คือ service ชื่อ visualizer เราจะได้เห็นว่ามีการใช้ key ต่าง ๆ เช่น volumes, placement และ constraints เพื่อเขียนเป็นข้อกำหนดตามที่ image ชื่อ dockersamples/visualizer:stable ต้องการให้ตั้งค่าเป็นอย่างนั้น

3. รันคำสั่งนี้ซ้ำ

docker stack deploy -c docker-compose.yml testlab

4. เปิดเว็บเพจ http://node_ip:8080 โดยแทนที่ node_ip ด้วย IP ของเครื่องที่อยู่ใน swarm cluster

ตัวอย่าง visualizer นี้เป็น standalone service ที่รันแบบไม่ได้ต้องใช้ service อื่นประกอบ ไม่ได้ขึ้นกับอะไรเลย ต่อไปเรามาสร้าง service ที่ต้องมีอันอื่นทำงานร่วมกัน (dependency) เราจะติดตั้ง database ชื่อ Redis เป็น service เพื่อเก็บ visitor counter ในทุกครั้งที่มีการเปิด web

ทำดังนี้

1. ตอนนี้เรายังอยู่ที่ directory ~/myservice
2. แก้ไขไฟล์ docker-compose.yml อีกครั้ง แล้วเพิ่ม service ชื่อ redis ดังตัวอย่าง

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: woonpsu/docsdocker:part1
    deploy:
      replicas: 5
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
      - "80:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
  redis:
    image: redis
    ports:
      - "6379:6379"
    volumes:
      - ./data:/data
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
networks:
  webnet:

ในการเขียนข้อกำหนดของ service redis คือ เราจะเก็บ data ไว้ที่ไหนนั่นเอง ด้วย key ชื่อ volumes เนื่องจาก redis จะรันที่ swarm manager เสมอ ดังนั้นจึงเก็บ data ไว้ใน filesystem ของเครื่อง host จะไม่เก็บไว้ใน container เพราะหากเราลบ container จะทำให้ data เราหายไป และวิธีการที่จะทำให้ container เข้าถึง data ใน filesystem ก็คือ เราสร้าง /data ไว้ใน container ในขณะเดียวกันเราก็สร้าง ./data ไว้ใน directory ที่เก็บไฟล์ docker-compose.yml นี้ ซึ่งจะทำให้เมื่อ container ทำการเก็บ data ข้อมูลจะถูกนำมาเก็บไว้ใน filesystem ของ host (swarm manager) เสมอ ที่ ~/myservice/data

2. สร้าง directory ./data

mkdir ./data

3. รันคำสั่งนี้ซ้ำ

docker stack deploy -c docker-compose.yml testlab

4. เปิดเว็บเพจ http://node_ip แทนที่ node_ip ด้วย IP ของเครื่องที่อยู่ใน swarm cluster คราวนี้เราจะเห็นเลขจำนวนของ visitor counter เปลี่ยนเพิ่มขึ้น

5. และเมื่อเช็คดู visualizer ด้วย โดยเปิดเว็บเพจ http://node_ip:8080 อีกครั้งจะเห็นว่าในภาพ diagram จะมี service ชื่อ Redis เพิ่มขึ้นมาด้วย

 

และทั้งหมดนี้ก็คือความหมายของคำว่า Stacks

 

จากที่ผมเขียนเล่าให้ฟังมาทั้ง 4 ตอน เราก็มี app ชื่อ testlab ที่รันด้วย docker ให้บริการแล้ว แต่เป็นการใช้งาน local machine ของเราเอง ซึ่งเราเลือกใช้ Docker CE รันบน Ubuntu server ก็ใช้งานได้ในระดับเริ่มต้นแล้วครับ ก็น่าพอใจอยู่นะครับ

สำหรับเรื่องราวลำดับถัดไปก็จะเป็นเรื่องเกี่ยวกับ Docker Cloud ซึ่งเป็นขั้นตอนต่อไปของการจัดการ app (Deploy your app) ที่อยู่บน local machine ของเราที่เตรียมไว้ไปยัง Cloud service providers ในลักษณะการทำงานแบบ Cloud นั่นคือ เครื่องบริการจะอยู่ในที่ต่าง ๆ ทั่วโลกได้นั่นเอง

ผมมีข้อมูลเบื้องต้นว่า Docker Software สำหรับทำ Docker Cloud จะมีให้เลือกใช้งาน 3 ชนิด คือ Docker CE (Cloud provider), Docker Enterprise (Cloud provider) และ Docker Enterprise (On-premise) ก็เพื่อเป็นทางเลือกที่เราจะต้องจ่ายเงินในการได้รับบริการมากน้อยนั่นเอง

การใช้ Docker Cloud เมื่อเลือก Software แต่ละชนิด ก็จะมีวิธีการเข้าใช้งานที่แตกต่างกัน เช่น Docker Enterprise จะมี software ชื่อ Docker Datacenter ซึ่งเป็นการจัดการที่ครบถ้วนและสะดวกรวดเร็วในการสร้าง “Dockerized App”

การใช้งาน Docker Cloud จะมีคู่มือการ setup ของ Software แต่ละชนิด และแยกเป็นของแต่ละ provider เราจะต้องศึกษาเพิ่มเติมอีกมาก โดยส่วนตัวในขณะที่เขียนบทความนี้ก็ยังไม่ได้สมัครขอใช้ Cloud service providers ใด ๆ รวมทั้งยังไม่ได้ลองใช้

ก่อนจบบทความในชุดนี้ อยากบอกว่ายังมีเรื่องราวอีกมากเลยเกี่ยวกับ Docker แต่ที่ได้แนะนำไปหน่อยนึงนี้ก็พอจะได้ไอเดียของ containers, images, services, swarms, stacks, scaling, load-balancing, volumes, and placement constraints จากที่ผมลองทดสอบและดัดแปลงเนื้อหาจาก Get Started ของ docs.docker.com ให้ทดสอบได้กับ Ubuntu server จำนวน 2 เครื่อง

ขอบคุณที่ติดตามอ่านจนจบ

 

References:
Get Started https://docs.docker.com/get-started/