ในการพัฒนาซอฟต์แวร์ กว่าจะเสร็จจนพร้อมใช้งานได้ มันต้องผ่านการออกแบบ, ทดสอบ และปรับปรุงแก้ไขอยู่หลายครั้ง ซึ่งในปัจจุบันนี้ ซอฟต์แวร์ส่วนใหญ่มักถูกสร้างมาให้ทำงานได้บนหลายแพลตฟอร์ม การทดสอบจึงต้องผ่านหลายสภาพแวดล้อม
เพื่อให้การจำลองสภาพแวดล้อมในการทดสอบเป็นเรื่องง่าย เทคโนโลยี Containner จึงมีบทบาทสำคัญอย่างมาก ซึ่งแพลตฟอร์มที่ได้รับความนิยมอย่างแพร่หลายในการจัดการเรื่องนี้ก็คือ Docker
แล้ว Docker คืออะไร ? เรามาทำความรู้จักมันให้มากขึ้นในบทความนี้กัน
ภาพจาก : https://en.wikipedia.org/wiki/Docker_(software)
Wikipedia ได้ให้นิยาม Docker เอาไว้ว่า มันเป็นโครงการ โอเพ่นซอร์ส (Open-Source) ที่ช่วยอำนวยความสะดวกการนำแอปพลิเคชันไปใช้งาน ภายใน คอนเทนเนอร์ (Container) เป็นไปแบบอัตโนมัติ ด้วยการเพิ่ม Layer, แยก Abstraction และจัดการจำลอง ระบบปฏิบัติการ (OS) ระดับล่าง (OS-level Virtualization) บน ลีนุกซ์ (Linux) ให้อัตโนมัติ
Docker เป็นเครื่องมือที่ถูกออกแบบมาเพื่อช่วยให้การสร้าง, ใช้งาน และรันแอปพลิเคชัน ทำได้สะดวกมากยิ่งขึ้น โดยอาศัยสิ่งที่เรียกว่า "Contrainer" คอนเทนเนอร์ช่วยให้นักพัฒนาสามารถรวมแอปพลิเคชันเข้ากับทุกสิ่งที่มันต้องใช้ในการทำงาน เช่น ไลบรารี (Library) และส่วนประกอบอื่น ๆ ที่จำเป็น แล้วส่งออกเป็นแพ็กเกจเดียว
สมมติว่า เราต้องการสร้างแอปพลิเคชันขึ้นมาสักตัวหนึ่ง อาจจะเป็น Facebook, Youtube, Spotify หรืออะไรก็ได้ ถ้าหากเราอยากให้คนทั่วไปสามารถเข้าใช้งานแอปพลิเคชันดังกล่าวได้ ก็ต้องมีที่สำหรับ "โฮสต์" แอปพลิเคชันเอาไว้
หากเป็นในอดีต นักพัฒนาอาจต้องประกอบคอมพิวเตอร์เองขึ้นมาสักเครื่องหนึ่ง แล้วตั้งค่าให้มันเป็นเครื่องที่ทำหน้าที่เป็น เซิร์ฟเวอร์ (Server)โดยเฉพาะ หรืออีกทางเลือกหนึ่งคือ การนำแอปพลิเคชันไปฝากไว้กับบริษัทที่ให้บริการโฮสติ้ง (Hosting)
ถัดมายุคของ คลาวด์ (Cloud) ก็เริ่มขึ้น ซึ่งนำร่องมาโดย Amazon Web Services (AWS) ที่เปิดให้บริการโฮสต์แอปพลิเคชันของลูกค้าผ่าน ศูนย์ข้อมูล (Data Center) ของตัวเอง การทำงานของคลาวด์จะมีความแตกต่างจากเว็บโฮสติ้ง โดยมีการนำแนวคิด การจำลองระบบ (Virtualization) มาใช้ ซึ่งเป็นการแบ่งทรัพยากรของฮาร์ดแวร์ออกเป็นส่วนย่อย ๆ โดยใช้ซอฟต์แวร์เข้ามาช่วยควบคุม เพื่อให้สามารถจัดสรรทรัพยากรให้ตรงกับความต้องการของลูกค้ามากที่สุด อีกทั้ง ลูกค้าสามารถจ่ายเฉพาะส่วนที่ต้องการใช้แทนที่จะต้องซื้อทั้งเซิร์ฟเวอร์ วิธีนี้ช่วยลดต้นทุนได้ทั้งสำหรับผู้ใช้ และบริษัท
อย่างไรก็ตาม ถึงคลาวด์จะมีข้อดีอยู่มากมาย แต่มันสิ้นเปลืองพื้นที่เป็นอย่างมาก เพราะต้องติดตั้งตัวระบบปฏิบัติการ ไม่ว่าจะเป็น Windows, Linux, macOS ฯลฯ ไฟล์นี้เราเรียกว่า "OS Image" ขนาดส่วนใหญ่ก็อย่างน้อย 1 กิกะไบต์ เมื่อคิดว่าตัวแอปพลิเคชันที่เราต้องการใช้งานอาจจะมีขนาดแค่เพียง 300 เมกะไบต์ เท่านั้น แต่ต้องเสียค่าใช้จ่ายเช่าพื้นที่ทำ VM มากกว่า 1 กิกะไบต์
เพื่อแก้ปัญหานี้ จึงมีการนำแนวคิด Container เข้ามาแก้ปัญหา ซึ่ง Docker สามารถทำสิ่งนี้ได้ โดยไม่ต้องเสียพื้นที่ให้กับระบบปฏิบัติการแยกสำหรับแต่ละแอปพลิเคชัน แต่จะแบ่งปันใช้ทรัพยากรบางส่วนร่วมกันด้วย เพื่อประหยัดพื้นที่ และยังมี Docker Engine ทำงานอยู่บนระบบปฏิบัติการหลักอีกด้วย
ภาพจาก : https://yannmjl.medium.com/what-is-docker-in-simple-english-a24e8136b90b
เมื่อเอ่ยถึง Docker แล้ว เราก็หลีกเลี่ยงไม่ได้ที่จะต้องอธิบายเรื่อง Container ด้วย
Container เป็นหน่วยมาตรฐานของซอฟต์แวร์ที่รวมโค้ด และทุกสิ่งที่แอปพลิเคชันจำเป็นต้องใช้ไว้ด้วยกัน เพื่อให้ซอฟต์แวร์สามารถทำงานได้ ไม่ว่าจะเป็น โค้ด, Runtime, System Tools, ไลบรารี (Library) และการตั้งค่าต่าง ๆ รวมกันเป็น Docker Container Image
เมื่อเราเรียกใช้งาน ตัว Docker Engine ซึ่งทำงานบนระบบปฏิบัติการหลัก เช่น Linux และ Linux จะเปลี่ยน Docker Container Image ให้เป็น Container ซึ่งซอฟต์แวร์ที่อยู่ใน Container จะทำงานเหมือนเดิมทุกครั้ง ไม่ว่าจะเปิดใช้งานที่สภาพแวดล้อมไหนก็ตาม
เมื่อรันจริง ภาพของคอนเทนเนอร์ (Container Image) จะกลายเป็นคอนเทนเนอร์ และในกรณีของ Docker ภาพเหล่านี้จะกลายเป็นคอนเทนเนอร์เมื่อรันบน Docker Engine Docker รองรับทั้งแอปพลิเคชันบน Linux และ Windows โดยซอฟต์แวร์ที่อยู่ในคอนเทนเนอร์จะทำงานเหมือนกันทุกครั้ง ไม่ว่าจะอยู่บนโครงสร้างพื้นฐานแบบไหน คอนเทนเนอร์ช่วยแยกซอฟต์แวร์ออกจากสภาพแวดล้อม และทำให้มั่นใจว่าแอปจะทำงานได้อย่างสม่ำเสมอ แม้จะมีความแตกต่างระหว่างสภาพแวดล้อม เช่น ระหว่างการพัฒนาและการทดสอบ
จุดเด่นของ Docker Containers ที่ทำงานบน Docker Engine มีคุณสมบัติที่น่าสนใจ ดังนี้
ภาพจาก : https://www.docker.com/resources/what-container/
Docker ใช้สถาปัตยกรรมแบบ ไคลเอนต์ (Client) - เซิร์ฟเวอร์ (Server) โดยที่ Docker Client จะสื่อสารกับ Docker Daemon ซึ่งเป็น Service ที่ทำงานอยู่เบื้องหลังบนเครื่องโฮสต์ เพื่อทำหน้าที่จัดการ, สร้าง, รัน และบริหาร Container
Docker Client และ Docker Daemon สามารถทำงานอยู่บนเครื่องเดียวกัน หรือจะเชื่อมต่อ Client เข้ากับ Daemon ที่อยู่บนเครื่องอื่นก็ได้
ภาพจาก : https://www.geeksforgeeks.org/devops/what-is-docker-client/
สำหรับองค์ประกอบหลัก จะประกอบไปด้วย
เครื่องจริง หรือเครื่องเสมือน ที่รันระบบปฏิบัติการ Linux หรือระบบอื่นที่รองรับ Docker Engine ได้
แอปพลิเคชันที่อยู่ในฝั่งไคลเอนต์ และเซิร์ฟเวอร์ ประกอบด้วย Docker Daemon, Docker API ที่ใช้สื่อสารกับ Daemon และ เครื่องมือบรรทัดคำสั่ง (CLI) ที่ใช้สั่งงาน Daemon
เป็นบริการเบื้องหลังที่ทำหน้าที่สร้าง และจัดการ Docker Image โดยรับคำสั่งจากไคลเอนต์ โดยพื้นฐานแล้ว Daemon ทำหน้าที่เป็นศูนย์ควบคุมของระบบ Docker
CLI ที่ใช้เข้าถึง Docker ส่วนต่อประสานโปรแกรมประยุกต์ (API) ตัว REST API เพื่อสื่อสารกับ Docker Daemon ผ่าน Unix Socket หรือเครือข่ายอื่น ๆ
คือองค์ประกอบต่าง ๆ ของระบบ Docker ที่ช่วยในการจัดการ และบริหารแพ็คเกจของแอปพลิเคชัน เช่น Images, Containers, Networks, Volumes, ปลั๊กอิน (Plug-In) และอื่น ๆ
คือ Instance ของ Docker Image ที่กำลังทำงานอยู่ โดย Image เป็นไฟล์แบบอ่านอย่างเดียว ส่วน Container เป็นเนื้อหาที่ทำงาน และเปลี่ยนแปลงได้
ไฟล์ที่รวมโค้ดของแอปพลิเคชัน, เครื่องมือ, ไลบรารี และสิ่งที่จำเป็นทั้งหมด เพื่อให้แอปพลิเคชันสามารถทำงานในรูปแบบ Container
ในตัว Docker image จะมีโครงสร้างหลาย Layer และแต่ละ Layer จะแทน เวอร์ชันของ Image ทุกครั้งที่มีความเปลี่ยนแปลงเกิดขึ้น จะมีการสร้าง Layer ใหม่ที่ด้านบนสุด และ Layer นั้นจะกลายเป็นเวอร์ชันล่าสุดทันที ส่วน Layer ก่อนหน้าจะถูกเก็บไว้ เพื่อสำรองไว้ใช้ย้อนเวอร์ชันกลับ หรือนำไปใช้ซ้ำในโปรเจกต์อื่นได้
|
แอดมินสายเปื่อย ชอบลองอะไรใหม่ไปเรื่อยๆ รักแมว และเสียงเพลงเป็นพิเศษ |