วันจันทร์ที่ 13 มีนาคม พ.ศ. 2560

Docker คืออะไร

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

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

Set MongoDB in the windows path environment

  Let’s set MongoDB in the windows environment in just a few steps. Step 1: First download a suitable MongoDB version according to your mach...