ใน Docker 1.12 คุณสมบัติใหม่ที่น่าสนใจของ Docker คือ Swarm Mode ซึ่งเจ้า Swarm นี่เป็นเครื่องมือที่ช่วยเป็นตัวจัดการเครื่องที่รัน Docker หลาย ๆ เครื่องให้อยู่ในสภาพแวดล้อมเดียวกัน และ Swarm Mode ที่มาใหม่นี้ก็จะมาช่วยในการจัดการในเรื่องของ Service Orchestration ให้ใช้งานได้ง่ายขึ้น ลดความซับซ้อนลง โดยไม่ต้องไปอาศัยพวก Kubernetes ทีมีความซับซ้อนในเรื่องระบบการทำงานพอสมควร
ในบล็อกนี้เราจะมาลองเล่น Docker Swarm ด้วย Swarm Mode กันดูนะครับ ซึ่งก่อนหน้านี้เวลาเราจะสร้าง Docker Swarm ขึ้นมานั้นจะมีขั้นตอน
- สร้าง Master node
- สร้าง Token ที่ Master node
- เปิด Agent ที่ Worker node
- นำ Worker node เข้าสู่ Cluster
แต่ใน Docker 1.12 นั้นมันจะง่ายกว่ามาก ๆ ขั้นตอนก็ไม่เยอะอีกต่อไปจะมีแค่
- ที่ Master node สร้าง Initial Swarm cluster
- นำ Worker node เข้าสู่ Cluster ด้วยคำสั่งเพียงแค่คำสั่งเดียว
มาลองเล่นกันดีกว่า
สภาพแวดล้อม
- Master node : 10.128.0.2
- Worker-01 node: 10.128.0.3
- Worker-02 node: 10.128.0.4
ทั้งหมดทำงานอยู่บน Ubuntu 16.04 LTS
สิ่งที่ต้องการ (Prerequire)
- ทั้ง 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 ได้เลย