qa-docker-swarm
qa-docker-swarm

บทความสั้นๆให้เข้าใจ concept เรื่องของ Docker Compose และ Docker Swarm 🙂 เพื่อเวลาอ่านต่อยอดจะได้ไม่ปวดหัวและลงมือทําได้จริง

ดังนั้นจากเข้าใจพื้นฐาน docker ไปแล้วในบทความที่แล้ว Docker ของเล่นชิ้นใหม่ที่ QA ขาดไม่ได้ ทีนี้ เรารู้แล้วว่า Dockerfiles เป็นตัวการสําคัญที่จะ Build Image ขึ้นมา เพื่อเอา Image ไปสร้าง Container เช่นเดียวกับ class และ instance ใน oop

แต่ทีนี้ถ้ามีหลายๆๆ container ล่ะ เราจะมั่นใจได้ไงว่าการที่เราสร้าง container ใหม่ขึ้นมา แล้วต้องการให้มันเชื่อมถึงกันจะทําได้อย่างถูกค้อง? หรือ start ทันกัน เช่น สมมุติเราสร้าง WordPress App ที่ต้องการ Database Mysql แล้วสมมุติ WordPress App container เราทํางานก่อน แต่ Mysql ยังไม่ทํางาน …… ทีนี้ยุ่งเลย ไม่สามารถดึงข้อมูลมาเปิดแอพได้ พังสิครับ กลายเป็นว่าต้องรอ Mysql container ทํางานเสร็จ แล้วไป restart WordPress App container อีกที

ซึ่งสิ่งที่มาแก้ปัญหาก็คือ Docker Compose นั้นเอง!!!

Docker Compose

จริงๆแล้ว DockerFile กับ Docker Compose มันก็เปรียบเสมือน สูตรอาหารอะแหละ คือในการทําอาหารขึ้นมาต้องมีอะไรบ้าง 🙂

recipes-cookie-docker-compose
recipes-cookie-docker-compose (http://www.avegasgirlatheart.com/2012/06/freebie-friday-4×6-recipe-card-clipping.html)

เราสามารถจดลงไปว่าในสูตรต้องมีอะไรบ้าง ต้องมี แป้ง ถั่ว นํ้าตาล เท่าไรก็ว่าลงไป

Docker Compose ก็ไม่ต่างกัน มันออกแบบมาให้เราใส่รายละเอียดลงไปแบบนั้นแหละ โดยมีไว้เพื่อจัดการ Multi-Container Application 🙂  โดยหลักการก็คล้ายๆ DockerFile แหละ เราก็ใส่ Images ที่ต้องใช้ลงไป Network,Volume ของ Container นั้นๆลงไป เช่นไฟล์นี้น่ะ

เป็น Docker Compose ของ WordPress น่ะ โดยใช้ database mysql แบบที่ยกตัวอย่างไปตอนแรกเลยล่ะ

docker-compose-wordpress
docker-compose-wordpress (https://docs.docker.com/compose/wordpress/#define-the-project)

เจ้า docker-compose.yaml ตัวนี้สิ่งที่ทําคือ

  1. สร้าง database โดยใช้ image mysql version 5.7
  2. restart ทั้งสอง image ถ้ามันพัง
  3. สร้าง volumes เก็บแยกไว้ naming volume
  4. image wordpess depend on database container แปลว่าต้องรอให้มันสร้างเสร็จก่อน
  5. มี enviroment variable บ้างตามนั้นแหละ ที่จําเป็นต้องใช้เวลาสร้าง container

เห็นม่ะ เหมือนสูตรอาหารทั่วๆไปแหละ ว่าต้องใช้อะไรบ้าง โดยแยกรายละเอียดเป็นส่วนของ services ที่ต้องใช้, volumes และ network โดยดูรายละเอียดตามข้างล่างนี้เลย

เช่น ถ้าต้องการให้ Network เดียวกัน เราก็เขียนไว้ใน compose

docker-compose-specific-network
docker-compose-specific-network

อย่างตัวอย่างจะเห็นว่าเราสร้าง Networks แยกออกมาสองตัวคือ Network สําหรับ Frontend และ Backend ขึ้นมา แปลว่า app ที่อยู่ในคนละวง Networks จะมองไม่เห็นกันน่ะ อารมณ์เดียวกับรูปข้างล่างนั้นแหละ

docker-network
docker-network

ถ้าต้องการให้ Volume เดียวกัน เราก็เขียนไว้ใน compose

docker-compose-volume
docker-compose-volume

ตัวอย่างเป็นการสร้าง Named Voulmes หมายถึงเราจะเก็บ data ที่เกิดขึ้นจากโปรแกรมไว้ใน Docker โดยใช้ชื่อว่า data-volume แล้ว container data ที่มีก็จะไปเก็บลงในนั้น

หรือ ถ้าต้องการให้ Startup Order เดียวกัน เราก็เขียนไว้ใน compose เช่นตัวนี้บอกให้รอจนกว่า container db จะสร้างขึ้นมาน่ะ postgres เนี่ย 🙂

docker-startup-order
docker-startup-order (https://docs.docker.com/compose/startup-order/)

เห็นม่ะ? หลักการณ์ไม่มีไรเลย มีแค่นี้แหละ อยากได้ไรก็เขียนลงไปใน compose file นั้นเอง :)(docker-compose.yaml) โดยพวกคําสั่งทั้งหมดก็อยู่ที่นี้เลย Docker Compose Reference

Docker Swarm

docker-swarm-logo
docker-swarm-logo (http://blog.arungupta.me/docker-swarm-cluster-using-consul/)

สั้นๆง่ายบรรทัดเดียว: การทํา clustering ด้วย Docker 🙂 จบ !

ประโยชน์ของ Swarm: Scaling ! Scaling ! Scaling ! เพื่อรองรับระบบขนาดใหญ่

จากที่อ่านมาทั้งสองบทความจะเห็นว่าเราจะพูดถึงแค่ Single หรือ Multi Container เท่านั้น แต่จริงๆแล้วมันยังมีเรื่องของ Single HOST หรือ Multi HOST อีก หรือ อีกความหมายนึงก็คือ คอมพิวเตอร์เครื่องเดียว หรือ หลายเครื่องนั้นเอง

Single Host = Host เครื่องเดียว หรือก็คือ คอมเครื่องเดียวนั้นแหละ (โหมดปกติเลย)

Multiple Host = Host หลายเครื่อง พูดง่ายๆ ก็คอมหลายเครื่องนั้นแหละ (Docker Swarm นั้นเอง)

Single Container = Container ที่รันอันเดียว (ใช้ DockerFile สร้าง)

Multiple Container = Container ที่รันบนเครื่องหลายๆอัน (ใช้ Compose คุม)

ทีนี้ศัพท์เหล่านี้รู้แล้วมีประโยชน์ยังไงกับ Docker Swarm???

เจ้า Swarm จริงๆแล้วก็คือ CLUSTERING MODE ของ Docker นั้นเอง หรือพูดง่ายๆก็คือ Multi Host ที่รัน container purpose เดียวกัน เช่น Clustering ของ WordPress Application ที่มีการ replica ออกมา 3 Nodes แต่ละอันมี database เป็นของตัวเอง เป็นต้น แต่ทีนี้ก็จะมีคําถามว่า

  • อ่าวแล้ว network จะจัดการยังไง เพราะแต่ก่อนมี Host เดียวก็ใช้ bridge ซึ่งเป็น default ของเครื่องเลย แล้วถ้ามันหลาย physical machines?
  • แล้ว deploy ไงอ่ะ แต่ก่อน docker-compose up/down เครื่องเดียวก็เสร็จล่ะ ถ้าหลายเครื่องต้องใช้อะไร?
  • อื่นๆมากมาย

แต่จริงๆแล้วมันเหมือน Docker Single Host มากๆ แค่เพิ่ม Configuration นิดเดียว กับคําสั่ง deploy ใหม่จาก docker-compose up เป็น docker stack deploy แค่นั้นเอง

หัวข้อหลักๆของ Swarm ที่น่ารู้คือ

  1. Swarm Architecture
  2. Swarm Stack
  3. Swarm Network
  4. Swarm Secret

เพราะที่เหลือมันก็คล้ายๆกันล่ะ ส่วนวิธีใช้งานไปหาอ่านเองได้ใน document docker swarm เลย

Docker Swarm Architecture

docker-swarm-architecture
docker-swarm-architecture

หลักการณ์ง่ายมากเลย ก็เหมือน clustering ทั่วไปแหละน่ะ คือต้องมี manager node ตัวนึงกับ worker node นั้นเอง

  1. Manager Node = ทําหน้าที่ Maintain cluster state ของ Worker Node ทั้งหมดนั้นแหละ ซึ่ง docker ได้ออกแบบมาเพื่อให้กันความผิดพลาดมากที่สุดเมื่อเกิดเหตุไม่คาดคิด ปกติแล้ว Docker จะ Recommend ให้มี 7 master node (ตํ่าสุดก็ 3 master node)
  2. Worker Node = ทําหน้าที่รับงานจาก Manager Node ซึ่งหลักๆแล้วก็คือรับคําสั่งคอยรัน Container ต่างๆนั้นเอง

ตัวอย่าง swarm manager node with 3 replicas ของ nigix และรอรับ task อื่นๆต่อไป

example-docker-swam
example-docker-swam

การทํางานของ Manager และ Worker ตั้งแต่ยิง cli – docker service create จนไปถึงสร้าง worker node รับคําสั่งไปทํางาน

docker-manager-worker-work
docker-manager-worker-work

พอเข้าใจ Concept Docker Swarm คร่าวๆแล้วใช่มั้ย ที่นี้สงสัยมั้ยถ้าเราจะเทส Multi Host เราต้องทําไง? ซื้อคอมเพิ่มมาทําเป็น Multi Host หรอ? ไม่ใช่ล่ะ……ลองเล่นที่นี้เลย http://labs.play-with-docker.com/ เว็ปที่เอื้อให้เรามาสร้าง instance คนละ host ได้ แต่ข้อเสียคือมันจะลบทิ้งทุก 4 ชม แค่นั้นแหละ แต่เรามาสร้างตัวอย่างทดสอบได้เลย

docker-playground-4hrs
docker-playground-4hrs (ping testing to host1)

Swarm Stack

ถ้าให้สรุปสั้นๆเลยน่ะ Stack == Compose จริงๆแล้วหลักการณ์เหมือนกันเลย คือเรามีไว้ใช้เพื่อ deploy services ขึ้นมา

Compose


docker-compose up

Stack


docker stack deploy

มันแตกต่างกันตรงที่ว่าคร่าวนี้ไม่ใช่ single host ไง มันเป็น multi host แล้วเพราะฉะนั้นมันจะ deploy ไปที่หลายๆ services นั้นเอง และไว้ใช้ควบคุม volumes,network เหมือน compose file นั้นแหละ (ต้องใช้ docker compose version 3 น่ะ)

docker-swarm-stack
docker-swarm-stack

ตัวอย่าง docker stack

docker-stack-example
docker-stack-example

จะเห็นว่ามันมีเรื่องของ deploy เข้ามาล่ะ เพื่ออธิบายให้ docker เข้าใจว่าเวลาเรา deploy จะให้มันทําอะไรบ้างนั้นเอง 🙂

Swarm Network

ถ้าจากบทความที่แล้ว (Docker ของเล่นชิ้นใหม่ที่ QA ขาดไม่ได้) จะพอเข้าใจแล้วล่ะว่า Docker มี Network คร่าวๆยังไง แต่ทีนี้พอมาเป็น Swarm มันจะไม่ได้ใช้ Bridge อีกแล้วล่ะ เพราะมันเป็น single host ทีนี้ถ้าเป็น Multi-host เราจะใช้ driver ที่ชื่อว่า Overlay ในการใช้งาน เพื่อสร้างให้ container มันติดต่อกันผ่าน physical network infrastructure ได้นั้นเอง

docker-network
docker-network (https://success.docker.com/Architecture/Docker_Reference_Architecture%3A_Designing_Scalable%2C_Portable_Docker_Container_Networks)

Swarm Secret

หลักการณ์ของมันเลยคือการเก็บ Enviroment Variables ไว้ในรูปแบบที่ไม่มีใครเข้าถึงได้ เช่น username,passowor,api key, ssh ซึ่งจริงๆแล้วก็มีแค่นั้น! ไม่ซับซ้อน จนไม่รู้จะเขียนไรดี แต่รู้ไว้ก็ดีว่ามีศัพท์คํานี้อยู่ 🙂

อ่านเต็มๆเรื่อง Docker Swarm Secret

สรุปแล้ว..

ที้นี้พอเราเข้าใจ concept ก็ง่ายล่ะ อยากให้อ่านบทความเรื่อง docker swarm ของ mysql + wordpress อธิบายได้ละเอียดดีเลยล่ะ 🙂 ทีนี้เวลาเราเอาไปประยุกต์สร้าง enviroment ของเราเองก็จะได้ง่ายขึ้น ยิ่งเป็นองค์กรใหญ่ๆยิ่งสนุกเลย

Update 22/1/2018

โดยปกติแล้วเวลาเราเขียนโปรแกรม เรามักจะแยก string path หรือ values ที่ซํ้าซ้อนออกมาเป็นคัวแปรแบบ global configuration ใช่มั้ย? ใน docker เองก็มีเหมือนกัน ซึ่งออกแบบมาในรูปแบบ .env เสียอย่างเดียวคือมันต้องอยู่ directories เดียวกันกับ docker compose file นั้นๆ

docker-enviroment-variables
docker-enviroment-variables (https://vsupalov.com/docker-arg-env-variable-guide/#the-dot-env-file-env)

เราสามารถสร้าง .env แล้วก็เป็นตัวแปรใช้ใน docker compose ได้อย่างง่ายดายเลยล่ะ 🙂 เช่นแบบนี้

example-docker-env
example-docker-env (https://github.com/howtoautomateinth/testing-flow-example/blob/master/.env)

แล้วก็นําไปใช้แบบนี้ เป็นต้น

docker-compose-use-env
docker-compose-use-env (https://github.com/howtoautomateinth/testing-flow-example/blob/master/docker-compose.yml)
0 0 vote
Article Rating
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments