มาทำ Cluster WordPress ด้วย Docker Swarm mode ใน Docker 1.12 กัน

หลังจากที่ Docker 1.12 เปิดตัวเวอร์เต็มที่ไม่ใช้ rc ผมก็เลยถือโอกาสเล่น Swarm mode ที่เขาล่ำลือมาว่าดีมากๆ โดยผมก็คิดโจทย์ง่ายๆ คือ

  • ผมมี Server Cloud 4 ตัวของ DigitalOcean
  • ผมอยากติดตั่ง WordPress และติดตั่ง MariaDB ในเครื่องหลักและ Replicate ออกไปให้เครื่อง Server 3 ตัวที่เหลือ

มาเริ่มกันเลยครับ

 

Update:

ในตัวบทความผมทำ Load balance ที่ Database ซึ่งจริงๆ เราไม่ควรทำจากการทดลองคือมันจะได้ข้อมูลทับกัน และคนละ server ด้วย แนะนำให้ทำแค่ตัว server ที่เก็บโค้ดเราเท่านั่นครับ


Initial our server at DigitalOcean

ก่อนอื่นทำการสร้าง Server ขึ้นมา ผมสร้างมา 4 ตัวเป็น Ubuntu 14.04.4 วางไว้ที่สิงคโปร์ ที่สำคัญต้องให้อยู่ใน Private Network วงเดียวกันด้วยนะ กดเลือกตามเมนูข้างล่าง ถ้าไม่กดจะได้คนละวงนะครับ

Screenshot from 2016-07-30 20:23:54

หลังจากติดตั่งแล้วเราก็จะได้ 4 เครื่องมาตามนี้

1

 

Install Docker

ทำการ ssh เข้าไปที่ server ทุกตัวแล้วติดตั่ง docker ตามคำสั่งนี้เลยครับ ซึ่งผมก็เอามาจาก บทความนี้ [link] เหมือนกัน งานนี้เราไม่ได้ใช้ docker compose หรือใครอยากใช้ก็ได้ติดตั่งเผื่อไว้

 

Create Swarm mode in Master server

หลังจากติดตั่ง Docker ครบทุกเครื่องก็ logout ออกมาแล้ว ssh ไปที่ node01 เพราะผมจะทำการติดตั่ง WordPress ไว้ที่นี้ครับ ก่อนอื่นเลยต้องสร้าง swarm ก่อนด้วยคำสั่ง

โดย IP ที่เราเห็นนั่นจะเป็น Private IP ของเครื่อง node01 นะครับเราสามารถจะพิมพ์ ifconfig หรือจะเข้าไปที่หน้าของ DigitalOcean ก็ได้ตามถนัด และถ้าเราทำถูกจะได้ผลตามนี้นะครับ

โดยผลที่ได้จะมี token สำหรับให้เครื่องอื่นๆ เข้ามา join ได้ คำสั่งชุดแรกสำหรับเครื่องที่จะทำ Slave และอันที่สองของเครื่องที่จะทำ Master ครับ

อีกอย่างนึง Docker สามารถมีเครื่อง Master ได้หลายๆ เครื่องนะครับ แค่เอาคำสั่งที่สองไปรันในเครื่องที่ต้องก็จะทำให้มี Master ได้ตามต้องการ แต่ผมแนะนำว่าห้ามเกิน 3 เครื่องนะครับ เพราะ อาจารย์ Chanwit Kaewkasi ผู้ที่เป็น Docker Swarm Maintainer ของ Docker, Inc. บอกไว้ในงาน Docker Meetup

 

Slave server join a Master server

หลังจากที่ swarm init แล้วก็เอาคำสั่งอันแรกสุดไปรันในทุกๆ เครื่องที่ต้องการทำ replicate นะครับ

และเมื่อเราทำการ join เครื่องครบแล้วก็ลองเช็คดู จะเห็นว่า server ที่ผมทำไว้มาทำหน้าที่เป็น Master – Slave แล้วนะ

 

Install WordPress and MariaDB

ผมสร้าง Network ก่อนเป็น Overlay network เพื่อให้ service ผมทำงานในวงเดียวกันด้วยคำสั่ง

สร้าง Database

สร้าง WordPress

เราก็จะได้เว็บของเราที่รันอยู่ใน server แล้ว

  •  –replicas – เป็นการบอกจำนวน instance ของแต่ละ container ที่ต้องการรันใน server และทุก container จะถูก load-balance ด้วย DNS นะครับ (เจ๋งสัสๆ)
  •  –name – ตั่งชื่อเรียก service เหมือนกับการตั่งชื่อ container ในคำสั่ง docker run
  • -e – เป็นการประกาศค่า environment ของ container เช่น Database เราก็ประกาศ username , password อะไรแบบนี้ครับ พวกนี้ดูได้จาก Docker Hub ของ Official แต่ละเจ้า
  • –network – ก็เป็นการบอกให้ service ทำงานใน network ที่ผมสร้างไปตอนแรกครับ
  • –publish – ถ้าต้องการให้ container ของเราถูกเรียกได้จากภายนอก เราก็ใส่ตรงนี้ไป ระบบจะทำ L4 IPVS load-balancer ให้เราครับ (โคตรฉลาดเลย)

สำหรับการเช็คดูว่า service ทำงานหรือยังก็สามารถทำได้แบบนี้

โดยถ้าทำงานสำเร็จจะต้องขึ้น 1/1 หรือ n/n ตามค่า –replicas ที่เรากำหนดไว้นะครับ อาจจะใช้เวลาสักแปปให้มันสร้างให้เรา

ลองมาเข้าเว็บสิทำงานได้หรือยัง เป็นไงครับเจ๋งไปเลยใช่มะ Docker เนี่ย ผมพิมพ์ url เข้าผ่าน port 3000 ที่ผมตัั่งไว้ใน –publish ตอนสร้าง WordPress นี่เราไม่ต้องพึ่ง Nginx เลยนะครับ

Screenshot from 2016-07-30 18:24:47

 

Scale service to every nodes

ถึงเวลาของการทำ Cluster แล้วครับ ง่ายมากแค่พิมพ์

และ

ง่ายไหมครับ เราแค่เรียกชื่อ service แล้วใส่ตัวเลขไป ผมมี 4 server ผมก็ใส่ 4 มันก็จะทำการ Cluster ระบบผ่าน Private IP ไปให้แต่ละเครื่องในวงที่เป็น Slave ทั่งหมดเลย

ลองมาดูว่ามันทำงานจริงป่าวคำสั่ง

และ

เราจะเห็นว่า service เราจะทำงานในทุกๆ server เลยดูเครื่อง server ที่ NODE นะครับเห็นไหม และเรายังทำการ Inspect ดูข้อมูลได้ด้วยแบบนี้

และ

ที่นี้ลองลบ container ออกไปสักตัวดูว่าระบบเราจะล่มไหม ด้วยคำสั่ง

และลองตรวจสอบดู จะเห็นว่ามีตัวเลขลดลง แต่เดียวอีกไม่เกิน 10 วินาที มันจะทำการสร้างมาให้ใหม่เป็น 4/4 เหมือนเดิม

และลองเขาเว็บ ก็ยังทำงานได้ปกติ

Screenshot from 2016-07-30 18:24:47

เมื่อเวลาผ่านไปลองเช็คดูสิ จะเห็นว่าระบบทำการเอากลับมาเหมือนเดิมในเครื่องที่ถูกลบออกไป

 

Remove command

ถ้าต้องการจากยกเลิกให้ Server ไหน ออกจากการ join ก็แค่พิมพ์คำสั่งด้านล่างโดย ssh ไปในเครื่อง server นั่นๆครับ

 

ถ้าต้องการลบ service ที่สร้างไปแล้วก็พิมพ์ตามนี้ และตัว service ก็จะโดนลบไป รวมถึง container ในนั่นก็จะหายไปทันที

 

Why user docker service create

ใน swarm mode เขาจะมีแนวคิดใหม่ 2 เรื่องคือ “service” และ “task” โดยที่

  • service คือกลุ่มของ task
  • task คือ container แต่ละตัวที่ทำงานอยู่ใน service หรือพูดง่ายๆ มันเป็นเพียงการเอากลุ่มของ container เดียวกันมาจัดอยู่โหมดหมู่ชื่อเรียกเฉยๆ ดังนั่นเราจึงใช้คำสั่ง “docker service create” แทนการใช้คำสั่ง “docker run” เวลาทำ cluster server

ดังนั่นเมื่อเราต้องการใช้ swarm mode เราจะต้องใช้คำสั่ง “docker service create” ขึ้นมา ระบบจะทำการสร้าง container ให้จึงจะสามารทำ Replicate ได้ และเราก็ยังสามารถใช้ “docker ps” ดูการทำงานได้ปกติครับ

 

Other testing and Tips

– ต้องบอกว่าง่ายและดีมากตัว Docker Swarm ฉลาดสุดๆ ซึ่งในบทความนี้ที่ผมไม่ได้ทำนั่นคือการทำ volume ข้อมูลใน Database ออกมาไว้โฟรเดอร์ด้านนอก Container ดังนั่นถ้าเครื่อง Master ล่มข้อมูลเราก็หายหมดและในการใช้งานจริงให้ volume folder ออกไว้นอก Container เสมอ เพราะถ้า Container พังข้อมูลเราจะไม่หายครับแต่ถูกเก็บไว้ในโฟรเดอร์ด้านนอกแทน เมื่อจะใช้ก็แค่ทำการลิ้งโฟรเดอร์กลับเข้าไป อันนี้ควรทำและจำเลยนะครับ ห้ามไม่ทำนะ ใครไม่ทำ volume ถือว่าใช้ Docker ผิดวิธีนะครับ

– ผมได้ทดลองปิดเครื่อง Master node01 และลองเอา URL เครื่อง Slave เช่น node02, node03 เข้าเว็บผลที่ได้คือเว็บผมยังทำงานปกติ ยกเว้นแต่ข้อมูลหายตัว WordPress ให้ผมติดตั่งเว็บใหม่เท่านั่นเอง และผมก็เปิดเครื่อง Master node01 และเข้า URL ของ node02 , node03 ใหม่ เว็บก็มีข้อมูลกลับมาเหมือนเดิม เพราะ database ของเครื่อง node01 ทำงานปกติไม่ต้องติดตั่งเว็บใหม่

ปล. ผมลืมก็อบรูปไว้ให้ดู เดียวเอาไว้ผมจะมาอัพเดตให้ที่หลังนะครับ

และเมือผมลองสร้างโพสใน WordPress แล้วเอา URL node02, node03, node04 เข้าไปจะเห็นว่าได้ข้อมูลมาจาก node01 ถูกต้องตามหลักการทำ Replicate server เลยครับ

 

สำหรับบทความนี้ตกหล่นอะไรไปผมต้องขออภัยนะ ยังไงก็ขอให้สนุกกกับการใช้งาน และการเขียนโปรแกรมนะครับ มีปัญหาอะไรสอบถามมาได้หรือไปถามในกลุ่ม Docker in Thai ยังไงก็ฝากเพจนี้ไว้ด้วยนะครับ นอกจากนี้เรายังมีจัด Meeting กลุ่มบ่อยๆ ใครสนใจมาร่วมง่านได้ กดไลท์ไว้เดียวเราจะแจ้งให้ทราบครับ

 

อ้างอิง: https://docs.docker.com/engine/swarm/swarm-tutorial/

Facebook Comments