Jaynarol Blog

Docker : จัดการโปรเจคทั้งระบบด้วย Docker Compose – Part 1 (Overview)

          สวัสดีครับ บทความนี้ผมตั้งใจทำมากๆ เพราะผมมองว่า Docker Compose คือหัวใจสำคัญของ Docker ในการจัดการโปรเจคทั้งระบบ ไม่ว่าจะเป็นด้าน Infrastructure Network Service Database และอีกมากมาย เรียกได้ว่าเป็น Infrastructure as Code (IaC) ได้เลย บทความนี้จะใช้ความรู้เกี่ยวกับ Docker จากทุก Blog ที่ผมเคยเขียน ซึ่งใครที่อ่าน+ทำตามบทความนี้จนจบและเข้าใจ ผมเชื่อว่าคุณจะได้ความรู้พื้นฐานที่สามารถนำไปต่อยอดได้อีกไกลแน่นอนครับ

 

บทความนี้ให้ความรู้อะไรบ้าง

  • รู้จัก Docker Compose
  • การเขียน docker-compose.yml
  • แนวคิดการทำ Load Balance
  • การเชื่อมโยง Container ต่างๆให้ทำงานร่วมกัน
  • เทคนิคของ Docker กับ Database
  • ภาพ end 2 end ในการพัฒนาระบบ
  • การห่อ (Pack) ทั้งระบบและส่งต่อ (Ship) ไปยังที่อื่น

 

สิ่งที่ควรรู้/มีก่อนอ่านบทความนี้

* บทความนี้ผมจะใช้ Command ผ่าน Docker Terminal ที่ติดมากับ Docker Toolbox เป็นหลัก เพื่อให้ทุกคน ทุก OS สามารถทำตามได้นะครับ

 

Docker Compose คือ

Docker Compose

        ในปกติเวลาเราใช้คำสั่ง docker run|start|stop|rm ที่ดำเนินการโดย Docker Engine จะเป็นการจัดการ Container ตัวเดียว รันตัวเดียว หยุดตัวเดียว ซึ่งหากเราใช้งานทั่วๆไปก็คงไม่มีอะไรน่าเป็นห่วง แต่ลองนึกภาพว่าถ้าเป็นโปรเจคที่มีโครงสร้างซับซ้อนขึ้นมาหน่อยตัวอย่างง่ายๆเช่น Website ต้องมี Load balance / Web Server / Database  และอาจมี Service อื่นๆอีกตามแต่สถาปัตยกรรม การที่เราต้องสั่งงานที่ละ Container ไหนจะการตั้งค่าต่างๆ การเชื่อมโยงระหว่าง Container อีกคงจะเสียเวลาและปวดหัวไม่น้อย

Docker Compose จึงเกิดมาเพื่อแก้ไขปัญหาดังกล่าว ด้วยคำสั่ง docker-compose up|start|down ซึ่งเป็นการสั่งในระดับโปรเจค เราสามารถสั่งให้ Container ทั้งหมดในโปรเจค เริ่มทำงานพร้อมกัน หยุดพร้อมกัน อัพเดทพร้อมกันได้อย่างง่ายดาย

Docker Compose จะใช้ข้อมูลจากไฟล์ docker-compose.yml ในการกำหนดลำดับ ตั้งค่าต่างๆ รวมไปถึงการเชื่อมโยง Container ให้สามารถทำงานร่วมกันได้ ดังนั้นจริงๆแล้วเรามีหน้าที่เพียงแค่เขียนเจ้าไฟล์ docker-compose.yml ให้ออกมาตามที่เราต้องการเท่านั้น ที่เหลือ Docker Compose จะจัดการให้เราทั้งหมด สบายมาก ใครอ่านแล้วงงไม่ต้องสนใจครับ ไปลองเล่นกันเลยดีกว่า…

 

มาเล่นกันดีกว่า ดูภาพรวมก่อน

เพื่อให้เห็นขุมพลังของ Docker และ Docker Compose ชัดๆ Workshop นี้ผมจะพาเล่นระบบที่มีโครงสร้างซับซ้อนกว่าแต่ก่อนสักนิด แต่ยังคงความง่ายสุดๆไว้เช่นเดิม อะไรที่ไม่สำคัญ ไม่ใช่ประเด็นของ Docker Compose ผมจะพยายามตัดออกเพื่อไม่ให้มีข้อมูลเยอะมากเกินจนงงครับ

เป้าหมายของ Workshop นี้คือเว็บหน้าตาเรียบๆที่ผู้อ่านเห็นในภาพด้านบนนี่แหละครับ ถึงจะดูเรียบๆจนเหมือนเว็บทึ่มๆ แต่เบื่องหลังมันมีการทำงานของ Container ทั้งหมด 5 ตัวดังนี้

  • Load Balance ด้วย HAProxy ใช้รับ Request จาก Browser และส่งต่อไปยัง Container ที่เรากำหนด
  • File Server ด้วย Nginx ใช้ทำงานกับไฟล์ที่เป็นข้อมูลเช่นพวก Js, CSS หรือภาพต่างๆ
  • Web Application Server ด้วย Apache + PHP 7.0 ใช้สำหรับทำงานโปรแกรมฝั่ง Server Side
  • Database Server ด้วย MySQL ฐานข้อมูลสำหรับให้ Web App ติดต่อเรียกใช้งาน
  • Database Web Client ด้วย phpMyAdmin ระบบสำหรับจัดการฐานข้อมูลผ่านเว็บไซต์
    (ตัวนี้เป็นทางเลือกสำหรับมือใหม่ครับ ปกติผมใช้ Navicat แทนจึงไม่มีตัวนี้ก็ได้)

 

ดูสถาปัตยกรรมต่อ

โครงสร้างระบบนี้ผมเน้นให้เห็นภาพการใช้งาน Docker และ Docker Compose ไม่เน้นด้านอื่นๆเช่น ความเร็ว ความคงทน และ ความปลอดภัย ดังนั้นการนำไปใช้งานจริงอาจต้องปรับแต่งให้เหมาะกับรูปแบบของระบบนั้นๆ เช่นต้องมีการเชื่อม VPN ก่อนเพื่อใช้งาน phpMyAdmin เป็นต้นครับ

การทำงานเว็บไซต์ก็ไม่มีอะไรซับซ้อนครับ แบ่งภาพเป็น 2 ส่วนตามผู้ใช้งาน

ผู้ใช้งาน เมื่อเปิดเว็บผ่าน Browser > Load Balance จะเป็นผู้รับ Request ก่อน จากนั้นจึงตรวจสอบว่าเป็นข้อมูลประเภทไหน ถ้าเป็นพวกไฟล์ก็ส่งไปให้ Nginx ทำงาน แต่ถ้าไม่ใช่ก็ส่งไปให้ Apache แทนครับ ซึ่งหลังจาก Apache ได้รับข้อมูลก็จะทำงานตามคำสั่งในไฟล์ PHP ที่เราเขียนไว้ นั่นคือให้เชื่อมต่อฐานข้อมูล MySQL เพื่ออ่านข้อมูลประเทศและ echo ออกมาเป็น html เพื่อส่งกลับไปให้ผู้ใช้งานเห็นผ่าน Browser

แอดมิน สามารถเข้า phpMyAdmin เพื่อจัดการฐานข้อมูลผ่าน Browser ได้เช่นกันครับ

 

ลองเล่นเลยดีกว่า

เพื่อไม่ให้อ่านอย่างเดียวจนง่วง ในขั้นนี้ผมจะพาเล่นของจริงเลยดีกว่า เล่นมันทั้งๆที่ยังไม่เข้าใจไปเลย แล้วค่อยมาแกะมันดูทีละส่วนๆทีหลังครับ ว่าแล้วก็เปิด Docker Quickstart Terminal และพิมพ์ Command ตามนี้ได้เลย

 

อย่างที่เคยบอกไปครับว่า Docker สามารถห่อทั้งระบบ (ที่เมื่อก่อนเราเห็นว่ามันผูกติดเหนียวแน่นกับ Server) และส่งไปให้คนอื่น (Ship) ได้อย่างอิสระ ตอนนี้เรากำลังใช้ความสามารถนี้ของมันอยู่ครับ ลองคิดดูครับ โปรเจคที่มีสถาปัตยกรรมซับซ้อน มี Container ทำงาน 5 ตัว มีฐานข้อมูล มีข้อมูลเว็บ มีการใช้งาน Load Balance กำลังลอยไปเครื่องท่านและจะใช้งานได้ในไม่กี่อึดใจนี้แล้ว ว่าแล้วก็ซัดต่อกันเลยด้วยคำสั่งนี้ครับ

 

เมื่อใส่คำสั่งด้านบนไปจะเป็นการสั่งให้ Docker Compose เริ่มทำงาน Container ทั้งโปรเจคตามที่ได้เขียนไว้ในไฟล์ docker-compose.yml ครับ ซึ่งตอนนี้เรายังไม่สนใจว่ามันเขียนอะไรไว้บ้าง รอพักนึงจน Terminal โหลด Image ต่างๆเสร็จและขึ้นหน้าตาดังภาพด้านล่างครับ

พอระบบพร้อมทำงานก็ลองเข้าเว็บของเราผ่านทาง IP ของ Docker ได้เลยครับ (ใครไม่ทราบ IP ของ Docker ให้ใช้คำสั่ง docker-machine ip ครับ) เช่นของผม http://192.168.99.100 เราจะเห็นว่าเว็บหน้าตาจืดชืดๆของเราทำงานได้แล้ว ลองกด F5 รัวๆดูครับจะพบว่าข้อมูลประเทศเปลี่ยนเสมอ แสดงว่าฐานข้อมูลใช้งานได้ เพราะผมสั่งให้มัน Query ข้อมูลจากฐานข้อมูลแบบ Random นั่นเองครับ

ลองมาต่อด้วยการดูว่า Apache และ Nginx ได้ทำงานตรงตามที่เราต้องการไหม กด F12 แล้วส่อง การเชื่อมต่อได้เลยครับ จะพบว่าหากเลือกโหมด Doc จะแสดงข้อมูลการเชื่อมต่อว่าทำงานบน Server Apache และหากเลือกโหมดไฟล์ต่างๆเช่นภาพก็จะแสดงข้อมูลการเชื่อมต่อว่าทำงานบน Server Nginx ครับ สวยงามมาก

สุดท้ายลองเข้า phpMyAdmin ด้วย http://x.x.x.x:8080 เช่นของผมคือ http://192.168.99.100:8080 ก็จะพบหน้าสำหรับ Login ข้อมูลผู้ใช้งานคือ root และรหัสผ่าน password ลองกดเข้าไปได้เลยครับ จะพบฐานข้อมูลชื่อว่า world ตัวนี้แหละที่เว็บเราใช้งาน

ถ้าทุกขั้นตอนทำงานได้เหมือนผมหมดก็ขอแสดงความยินดีด้วยครับ คุณเยี่ยมมาก ><

เห็นไหมครับ เราใช้งานคนละเครื่อง คนละสภาพแวดล้อม อาจจะคนละ OS ด้วยนะ แต่เราสามารถส่งและรันระบบที่ซับซ้อนไปมาได้ง่ายดายมากๆ ด้วย Docker และ Docker Compose

หลังจากเล่นจนพอใจ ก็ถึงเวลาปิดระบบ กลับมาหน้า Docker Terminal และกด CTRL + C เพื่อหยุดและออกจากระบบและพิมพ์คำสั่งนี้เพื่อลบ Container ที่ค้างในระบบทั้งหมดครับ

จบ Part 1

สุดท้ายแต่ยังไม่ท้ายสุด เนื่องจากบทความยาวมากและผมก็เริ่มเพลียแล้ว จึงขอแยกออกเป็น 3 บทดีกว่า บทหน้า Part 2 ผมจะมาอธิบายรายละเอียดของไฟล์ docker-compose.yml และไฟล์ต่างๆที่ใช้ในโปรเจคให้เห็นภาพและเข้าใจโครงสร้างระบบทั้งหมด รวมถึงแบ่งปันเทคนิคต่างๆแบบไม่มีกั๊กครับ

แล้วพบกันใหม่ สวัสดีครับ