Jaynarol Blog

Docker : ฉบับปูพื้น

          ความเหนื่อยอย่างนึงของ Full Stack Dev คือเราต้องรู้จักและเข้าใจการทำงานทุกส่วนของ SDLC ตั้งแต่การเก็บ Req ยัน Deploy ขึ้น Production และ Maintain อีกยาวๆ ที่เหนื่อยเพราะเราต้องมีความรู้หลายสายและแต่ละสายก็เปลี่ยนไปเร็วมาก แต่ถามว่าเหนื่อยแล้วเบื่อไหม ตอบเลยว่า สนุกมาก 555+ เคยได้ยินคนบอกว่า สันดานของคน IT คือชอบเล่นของใหม่ อันนี้ต้องออกมายืดอกยอมรับเลยว่า จริง! -0-

ประเด็นคือช่วงนี้ง่วนๆอยู่แถวๆ Design Infrastructure ของโปรเจคใหม่ ถามว่าโปรเจคใหม่ต้องใช้ Docker เลยหรอ ตอบเลยว่า เปล่า! แต่อยากเล่น 5555+

โม้ซะเพลิน เข้าเรื่องกันเลยดีกว่าครับ

 

Docker คืออะไร

          Docker  คือชื่อของ Engine ตัวนึงที่มีแนวคิดในการจำลองสภาพแวดล้อมขึ้นมาในเครื่องสำหรับรัน Service ถ้านึกภาพไม่ออกให้นึกถึงพวก Virtual Machine อย่าง VirtualBox หรือ VMWare คอนเซปคล้ายๆกันแต่หลักการทำงานและจุดประสงค์ต่างกันโดยสิ้นเชิง

ใน Virtual Machine เราเรียก OS ที่ถูกจำลองขึ้นมาว่า Guest OS แต่ใน Docker เราจะเรียกมันว่า Container ดังนั้นเพื่อกันการเข้าใจผิดจากนี้ผมจะเรียกสิ่งที่ Docker จำลองขึ้นมาว่า Container ครับ (เพราะ Docker คือชื่อ Engine ที่ใช้ในการควบคุมทั้งหมดอีกทีนึง)

สรุป เป้าหมายของ Docker คือ การสร้าง Container เพื่อจำลองสภาพแวดล้อมการทำงานสำหรับ Service 1 ตัว ต่างจาก Virtual Machine ที่ Guest จะจำลองทั้ง OS เพื่อทำหน้าที่แทน Server

หัวใจหลักๆของ Docker มันมีเท่านี้ครับ แต่สิ่งที่ทำให้มัน Cool คือการประยุกต์ใช้และระบบต่างๆที่อยู่รายล้อมตัวมันช่วยอำนวยความสะดวกให้อะไรๆง่ายไปซะหมด เดี๋ยวเราจะค่อยๆทำความเข้าใจไปทีละเรื่องๆครับ

ปล. Service ก็คือ Software ตัวนึงที่งานในเบื่องหลัง เช่นพวก Apache Database ซึ่งพวกนี้เราจะไม่เคยเห็นหน้าตามัน (ไม่มี UI) พบได้ตามปกติใน Server ต่างๆครับ

Container -vs- Virtual Machine

 

         ตามที่ได้เกริ่นไปครับว่าเป้าหมายของ Docker คือจำลอง Container เพื่อใช้รันแอพที่เราต้องการ 1 ตัว ดังนั้นจากภาพเราจะสังเกตได้ว่า Docker ใช้ Kernel เดิมของ OS เป็นตัวรัน Container ได้เลย ต่างจาก VM ที่ต้องมี Hypervisor มาช่วยรัน OS อีกหนึ่งทอด

คิดภาพเล่นๆ สมมุติว่าเราอยากจำลอง Apache+PHP สัก 3 Containers เมื่อเปรียบเทียบกับ VMs 3 เครื่อง จะสรุปได้ดังนี้

  1. Docker ไม่ต้องง้อ OS ใหม่ ดังนั้นจึงไม่ต้องเสียเวลาติดตั้ง ไม่ต้องเสียเวลา config ต่างๆนาๆ
  2. Docker เบาและเร็วกว่ามาก ไม่ว่าจะการ start stop หรือ restart
  3. Docker ใช้ CPU, RAM และที่สำคัญคือพื้นที่ในการจัดเก็บข้อมูลน้อยกว่ามาก เพราะไม่ต้องสิ้นเปลืองทรัพยากรในการรัน OS ใหม่ขึ้นมาทั้งตัว
  4. ในทรัพยากรที่เท่ากัน Docker รันจำนวน Container ได้มากกว่า VMs
  5. Docker สามารถเคลื่อนย้ายและติดตั้ง Container ได้สะดวกและไวกว่ามาก

 

Docker image และ Docker container

 

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

Docker image คือ แม่แบบแอพพลิเคชั่น ที่ถูกการ install config และปรับจูนต่างๆตามวัตถุประสงค์ของมันผ่าน command line ใน linux มาแล้ว จากนั้นจึงถูกห่อหุ้มไว้สำหรับพร้อมติดตั้งจึงกลายมาเป็น Docker image นั่นเอง ถ้าให้คิดตามง่ายๆก็คิดซะว่ามันเหมือน แผ่น OS ที่เราใช้ติดตั้ง Windows เราไม่สามารถทำอะไรกับมันได้นอกจากสั่งติดตั้ง

Docker container คือ แอพพลิเคชั่น ที่ติดตั้งแล้ว เป็นผลพวงมาจาก Docker image เราติดตั้ง Docker image อันไหนก็จะได้  Container  แอพพลิเคชั่น อันนั้น โดยใน Container เราสามารถสั่ง start stop config ดูการทำงานของมันได้ครับ ซึ่งใน Container แต่ละตัวจะมี RAM, CPU, Users, File ต่างๆเป็นของตัวเอง ถ้าให้คิดตามง่ายๆก็คล้ายๆ VM ตัวนึง ที่ถูกติดตั้งด้วย แผ่น OS (Docker image) นั่นเอง (แต่มันไม่ใช่ VM นะ เพราะมันมีเป้าหมายคือ ทำงานแอพหลักตัวเดียว)

ผมเจอมาเว็บนึงเขาบอกว่า Docker image เสมือน Class และ Docker container เสมือน Instance ของ Class อันนี้ก็เข้าใจง่ายดีครับ

 

Registry และ Repository

 

         จุดเด่นที่ทำให้ Docker แข็งแกร่งมากก็คงไม่พ้นเรื่องระบบ Registry และ Repository เพราะมันคือแนวคิดที่ทำให้การจัดการ Docker Image เป็นไปได้อย่างง่ายดาย เราสามารถสร้าง Docker Image ของ Service ตัวนึงขึ้นมาเองและโยน (push) ขึ้น Registry จากนั้นให้เพื่อนของเรามาโหลด (pull) ไปใช้ เพียงเท่านี้เราและเพื่อนก็สามารถได้ Service ที่มี Environment เหมือนกันได้ทันที หรือเราสามารถไปโหลด (pull) Service ของคนอื่นๆที่เขายำๆจูนๆมาให้แล้วก็ได้เช่นกัน ลืมภาพการติดตั้ง Service สมัยก่อนที่กว่าจะ compile และจูนอะไรเสร็จซัด command line ไป 30 กว่าบรรทัดได้เลยครับ 55

โดย Registry ที่ใหญ่ที่สุดของ Docker ก็ไม่พ้น Docker Hub ครับ

 

Docker จะเปลี่ยนแปลงชีวิตเรายังไง

 

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

  1. Docker จะเข้ามาเป็นตัวกลาง ช่วยให้ทุกคนในทีมรวมถึง Production Server มี Environment เดียวกันหมด ดังนั้นหมดปัญหา ตอนอยู่ในเครื่องผมมันรันได้นะครับ
  2. Docker ช่วยให้เราจัดการ Service ที่มีหลากหลายเวอร์ชั่น เช่น php 5.4, php 5.6, php 7 ในเครื่องเดียวกันได้อย่างง่ายดาย
  3. Docker ลดเวลาในการติดตั้ง Service ลงอย่างมหาศาล ด้วยระบบ Registry อยากใช้ App อะไร Pull ลงมาได้เลย
  4. เราสามารถ ลบ และ ติดตั้ง Container ใหม่ ได้อย่างรวดเร็วด้วย Docker Image ที่เป็นเหมือน Template ของ Service
  5. เราสามารถสร้าง Docker Image เพื่อใช้ในการ Install Config Service ของเราได้เองด้วย Dockerfile
  6. ใน Dockerfile เราสามารถสืบทอดจาก Docker Image ของคนอื่นได้ด้วย เช่น php 5.4 และ php 5.6 สือทอดมาจาก Apache เหมือนกัน และ Apache เองก็สืบทอดมาจาก Ubuntu
  7. เราสามารถจัดการและควบคุม Container หลายๆตัว เช่นการตั้งค่า การให้มันทำงานร่วมกัน start stop ทั้งหมดพร้อมกัน ได้ด้วย Docker Compose
  8. เราสามารถควบคุม Container บน Cloud Service ต่างๆผ่าน SSH เสมือน Docker รันอยู่ในเครื่องตัวเองด้วย Docker Machine
  9. เราสามารถ Scale Container ได้อย่างง่ายดายและรวดเร็วด้วย Docker Swarm

 

หากข้อไหนอ่านแล้วงงต้องขออภัยด้วยนะครับ บางอันมันก็เป็นเชิงลึกไปหน่อย แต่อยากให้เห็นภาพรวมไว้ครับ ไว้จะมาลงรายละเอียดให้ในบทความต่อๆไปครับ

 

ปิดท้าย

Docker เรียกได้ว่าเป็น Trend ที่ร้อนแรงมากในช่วงปีที่ผ่านมา

ในมุมมองผม ผมคิดว่ามันคืออนาคตของ Server ยุคใหม่ที่เน้นด้าน Automation และ Continuous Integration

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

เดี๋ยวบทความหน้าจะพยายามหาเวลามาทะยอยลงรายละเอียดและแชร์ประสบการณ์การใช้งานของผมให้ฟังครับ

สวัสดีครับ