ใช้งาน Docker swarm ภายใน 5 วินาที

ใน Docker 1.12 คุณสมบัติใหม่ที่น่าสนใจของ Docker คือ Swarm Mode ซึ่งเจ้า Swarm นี่เป็นเครื่องมือที่ช่วยเป็นตัวจัดการเครื่องที่รัน Docker หลาย ๆ เครื่องให้อยู่ในสภาพแวดล้อมเดียวกัน และ Swarm Mode ที่มาใหม่นี้ก็จะมาช่วยในการจัดการในเรื่องของ Service Orchestration ให้ใช้งานได้ง่ายขึ้น ลดความซับซ้อนลง โดยไม่ต้องไปอาศัยพวก Kubernetes ทีมีความซับซ้อนในเรื่องระบบการทำงานพอสมควร

SWARM Mode architecture
SWARM Mode architecture

ในบล็อกนี้เราจะมาลองเล่น Docker Swarm ด้วย Swarm Mode กันดูนะครับ ซึ่งก่อนหน้านี้เวลาเราจะสร้าง Docker Swarm ขึ้นมานั้นจะมีขั้นตอน

  1. สร้าง Master node
  2. สร้าง Token ที่ Master node
  3. เปิด Agent ที่ Worker node
  4. นำ Worker node เข้าสู่ Cluster

แต่ใน Docker 1.12 นั้นมันจะง่ายกว่ามาก ๆ ขั้นตอนก็ไม่เยอะอีกต่อไปจะมีแค่

  1. ที่ Master node สร้าง Initial Swarm cluster
  2. นำ Worker node เข้าสู่ Cluster ด้วยคำสั่งเพียงแค่คำสั่งเดียว

มาลองเล่นกันดีกว่า

สภาพแวดล้อม

  1. Master node : 10.128.0.2
  2. Worker-01 node: 10.128.0.3
  3. Worker-02 node: 10.128.0.4

ทั้งหมดทำงานอยู่บน Ubuntu 16.04 LTS

สิ่งที่ต้องการ (Prerequire)

  1. ทั้ง 3 เครื่องต้องติดตั้ง Docker engine เวอร์ชั่น 1.12
$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
$ echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list
$ sudo apt update
$ sudo apt install -y docker-engine
$ sudo systemctl start docker.service

เมื่อตรวจสอบเวอร์ชั่นของ Docker ดูจะต้องได้ version 1.12

$ sudo docker version

ผลที่ได้

Client:
Version: 1.12.1
API version: 1.24
Go version: go1.6.3
Git commit: 23cf638
Built: Thu Aug 18 05:33:38 2016
OS/Arch: linux/amd64

Server:
Version: 1.12.1
API version: 1.24
Go version: go1.6.3
Git commit: 23cf638
Built: Thu Aug 18 05:33:38 2016
OS/Arch: linux/amd64

เมื่อเตรียมทุกอย่างพร้อมแล้ว มาเล่น Docker swarm mode กัน

ที่ Master node ให้ทำการสร้าง swarm ขึ้นมา

$ sudo docker swarm init --advertise-addr 10.128.0.2
Swarm initialized: current node (9b2jbohlnc1v66e6owd68g4hf) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join \
--token SWMTKN-1-5btqy10qeeail85twv7lpmfkpsglb76khqbii00vkeh2yf9yew-bnrp6fvqd3tj2or41y6b5e3xy \
10.128.0.2:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

ที่เครื่อง worker-01 และ worker-02 ให้พิมพ์คำสั่งที่ได้มาจากเครื่อง Master เมื่อสักครู่นี้

$ sudo docker swarm join \
> --token SWMTKN-1-5btqy10qeeail85twv7lpmfkpsglb76khqbii00vkeh2yf9yew-bnrp6fvqd3tj2or41y6b5e3xy \
> 10.128.0.2:2377

This node joined a swarm as a worker.

กลับมาที่เครื่อง Master และตรวจสอบดูจะพบว่าทั้ง 3 Node ได้เข้าสู่ Cluster เดียวกันแล้ว

$ sudo docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
2c4b4aa4w5tk6te8qws8dri2c worker-02 Ready Active
9b2jbohlnc1v66e6owd68g4hf * master Ready Active Leader
a99r92yxae6hbsevnmm76obqc worker-01 Ready Active

มาลองเล่นของเล่นใหม่ที่ชื่อว่า Docker service กับ Swarm mode กันดูดีกว่า ซึ่งเจ้า service นี้จะช่วยในการ deploy application ของเราเขาไปยัง swarm โดยจะยกตัวอย่างในการนำ application ที่มีชื่อว่า my-nginx ซึ่งทำงานเป็นเว็ปเซิฟเวอร์ด้วย alpine เข้าไปอยู่ใน swarm

ที่เครื่อง Master สร้าง service ชื่อว่า my-nginx โดยให้ทำงาน 1 คอนเทนเนอร์และให้ expose port 8080 ให้ได้เข้าใช้งาน โดยใช้ docker image ที่มีชื่อว่า matripe/alpine-nginx:html

$ sudo docker service create --replicas 1 --name my-nginx -p 8080:80 matriphe/alpine-nginx:html

9r24ixi1qffa6xc0z33keefpw

หลังจากนั้นตรวจสอบการทำงานจะพบว่า my-nginx ได้เกิดขึ้นมาบนเครื่อง worker-02

$ sudo docker service ps my-nginx
ID                         NAME        IMAGE                       NODE        DESIRED STATE  CURRENT STATE           ERROR
364qqjdsjhvl97ey0824dm3vm my-nginx.1 matriphe/alpine-nginx:html worker-02 Running Running 1 minutes ago

เมื่อลองตรวจสอบ service ที่สั่งให้ทำงานก็จะพบว่ามันทำงานและมี container จำนวน 1 instance ในการรองรับงาน

$ sudo docker service inspect --pretty my-nginx
ID: 9r24ixi1qffa6xc0z33keefpw
Name: my-nginx
Mode: Replicated
Replicas: 1
Placement:
UpdateConfig:
Parallelism: 1
On failure: pause
ContainerSpec:
Image: matriphe/alpine-nginx:html
Resources:
Ports:
Protocol = tcp
TargetPort = 80
PublishedPort = 8080

มาลอง scale out service ที่ได้สร้างจาก 1 เป็น 5 instance

$ sudo docker service scale my-nginx=5
my-nginx scaled to 5

ตรวจสอบการทำงานของการ scale

$ sudo docker service ps my-nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
364qqjdsjhvl97ey0824dm3vm my-nginx.1 matriphe/alpine-nginx:html worker02 Running Running 9 minutes ago
32ri1ue0emngcjszlhard206t my-nginx.2 matriphe/alpine-nginx:html master Running Running 28 seconds ago
d8dhknajm254lis8vbday45kz my-nginx.3 matriphe/alpine-nginx:html worker01 Running Running 26 seconds ago
4eeuo4lftk5t7u8sa6wkhrzvg my-nginx.4 matriphe/alpine-nginx:html worker01 Running Running 26 seconds ago
80yor0lr1vsoqdbw5qmiy0vw4 my-nginx.5 matriphe/alpine-nginx:html worker02 Running Running 28 seconds ago

จะเห็นได้ว่า Docker 1.12 นั้นมีความสามารถในการทำ cluster และ orchestration ได้ดีมาก ทั้งนี้ยังสามารถทำการอัพเดทเซอร์วิสแบบค่อย ๆ ทยอยลดจำนวนเวอร์ชั่นเก่าลงและเพิ่มเวอร์ชั่นใหม่ขึ้นหรือที่เรียกว่า Rolling update ได้อีกด้วย และยังมี feature อีกเยอะ ให้ลองเล่นครับ หากใครสนใจก็ไปติดตามได้ที่ docker.com ได้เลย