ในกระบวนการพัฒนา (developement) และติดตั้งใช้งานแอปพลิเคชัน (deployment) แบบดั้งเดิม โดยเฉพาะระบบงานขนาดใหญ่ (enterprise application) เราจะต้องเตรียมเครื่องเซอร์ฟเวอร์ ติดตั้งระบบปฏิบัติการ และติดตั้งองค์ประกอบอื่นๆ เช่น แอปพลิเคชัน และ ดีเพนเดนซี่ เพื่อสร้างสิ่งแวดล้อมที่จะรองรับการติดตั้งแอปพลิเคชันที่เราจะใช้งาน โดยเราต้องทำกระบวนการทั้งหมดนี้ซ้ำๆกัน ทั้งในขั้นตอนการพัฒนา ขั้นตอนการทดสอบ และในการติดตั้งใช้งานจริง นอกจากนี้เราอาจะพบปัญหาการติดตั้งที่แตกต่างกันในระบบปฏิบัติการที่แตกต่างกัน การขัดแย้งกันของแอปพลิเคชันหรือดีเพนเดนซี่ต่างๆ รวมถึงเราจะไม่ติดตั้งแอปพลิเคชันหลายๆตัวไว้ในเครื่องเซอร์ฟเวอร์เดียวกันถึงแม้ทรัพยากรของเครื่องคอมพิวเตอร์จะมีเพียงพอก็ตามเพราะแอปพลิเคชันเหล่านั้นอาจจะขัดแย้งกันเองจนทำให้เกิดปัญหาได้ จะเห็นว่ากระบวนการติดตั้งแบบดั้งเดิมนั้นทั้งเสียเวลาและใช้ทรัพยากรไม่คุ้มค่า

เทคโนโลยีการทำเครื่องเสมือน (virtualization)

ต่อมาได้มีการพัฒนาเทคโนโลยีที่ช่วยให้เราสามารถติดตั้งแอปพลิเคชั่นหลายๆแอปพลิเคชันบนเครื่องคอมพิวเตอร์เดียวกันได้ และสามารถโยกย้ายแอปพลิเคชันจากขั้นตอนการพัฒนาไปยังขั้นตอนการทดสอบและขั้นตอนการใช้งานจริงได้อย่างง่ายดาย โดยใช้วิธีการแบ่งทรัพยากรของเครื่องคอมพิวเตอร์ให้กับแต่ละแอปพลิเคชันใช้งานโดยไม่ปะปนกันเรียกว่าการทำเครื่องเสมือน (virtualization) ซึ่งวิธีการทำเครื่องเสมือนจะมีอยู่ 2 แบบ คือ แบบที่จำลองเครื่องคอมพิวเตอร์ขึ้นมาทั้งเครื่อง (virtual machine) ซึ่งเครื่องคอมพิวเตอร์จำลองจะทำงานอยู่บนแพลตฟอร์มเครื่องเสมือน (hypervisor) ที่อยู่บนเครื่องคอมพิวเตอร์ที่เป็นโฮสต์อีกทีหนึ่ง โดยเราจะต้องติดตั้งระบบปฏิบัติการและองค์ประกอบอื่นๆในเครื่องคอมพิวเตอร์จำลองเหมือนกับที่เราทำบนเครื่องคอมพิวเตอร์จริงๆหลังจากนั้นจึงจะสามารถติดตั้งแอปพลิเคชันได้ และอีกแบบหนึ่งเป็นการทำคอนเทนเนอร์(containerization) คือการห่อแอปพลิเคชั่นและส่วนประกอบอื่นๆที่จะทำให้แอปพลิเคชั่นทำงานได้เป็นแพคเกจเรียกว่าอิมเมจ แล้วนำไปใช้งานบนแพลตฟอร์มเครื่องเสมือนแบบคอนเทนเนอร์ (container engine) ได้เลยโดยที่ไม่ต้องมีการสร้างเครื่องคอมพิวเตอร์จำลองขึ้นมาก่อน โดยคอนเทนเนอร์ก็คือสิ่งแวดล้อมแบบ run time เพื่อให้อิมเมจของแอปพลิเคชันสามารถทำงานได้ โดยแต่ละอิมเมจจะมีคอนเทนเนอร์เป็นของตนเอง การทำงานในรูปแบบคอนเทนเนอร์เป็นการจัดสรรทรัพยากรให้กับแต่ละคอนเทนเนอร์ในระดับของระบบปฏิบัติการของเครื่องคอมพิวเตอร์ที่เป็นโฮสต์ คล้ายกับการที่เราลงทะเบียนเข้าใช้งานเครื่องคอมพิวเตอร์แล้วเราได้รับสิ่งแวดล้อมในการทำงานของเราที่ไม่ปะปนกับใคร

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

Docker คืออะไร

 Docker เป็นแพลตฟอร์มที่เป็นโอเพ่นซอร์สซอฟต์แวร์สำหรับใช้ในการพัฒนา ทดสอบ ติดตั้ง และใช้งานแอปพลิเคชันในแบบคอนเทนเนอร์ (containerization) ช่วยให้เราแยกส่วนระหว่างแอปพลิเคชันและเครื่องคอมพิวเตอร์ที่เป็นโฮสต์ให้เป็นอิสระจากกัน ส่งผลให้เราสามารถพัฒนา ทดสอบ ติดตั้ง และใช้งานแอปพลิเคชันได้ง่ายและรวดเร็ว โดยคอนเทนเนอร์จะทำงานบน Docker Engine ซึ่งเป็นแพลตฟอร์มเครื่องเสมือนแบบคอนเทนเนอร์ เราสามารถใช้งานคอนเทนเนอร์ได้ทั้งบนเครื่องคอมพิวเตอร์ส่วนบุคคล เครื่องเซร์ฟเวอร์ในศูนย์ข้อมูล เครื่องเสมือน (virtual machine) บนระบบคลาวด์ทั้งที่เป็นขององค์กรหรือบริการคลาวด์ต่างๆ ตราบเท่าที่มีการติดตั้ง Docker Engine ไว้ 

เนื่องจากองค์ประกอบที่ต้องใช้เพื่อให้แอปพลิเคชันสามารถทำงานได้ ได้ถูกบรรจุไว้ในอิมเมจไฟล์ครบหมดแล้ว เราจึงไม่ต้องสนใจว่าจะมีองค์ประกอบที่เราต้องการติดตั้งอยู่บนเครื่องคอมพิวเตอร์หรือคลาวด์ที่เป็นโฮสต์หรือไม่ และเราสามารถใช้งานหลายๆอิมเมจพร้อมๆกันบน Docker Engine เดียวกันได้ การทำคอนเทนเนอร์ช่วยให้กระบวนการพัฒนาซอฟแวร์ (software developement life cycyle) มีความรวดเร็วและเชื่อถือได้ และยังสนับสนุนการทำงานในแบบ CI/CD (continuous integration and continuous delivery) ซึ่งเป็นกระบวนการในการพัฒนาแอพพลิชั่นทีละส่วนเล็กๆเพื่อให้สามารถนำออกมาใช้งานจริงได้อย่างรวดเร็ว โดยมีวงรอบการพัฒนาซอฟแวร์ที่สั้นมากๆ 

เราสามารถใช้รูปแบบคอนเทนเนอร์ได้ตลอดกระบวนการพัฒนา ทดสอบ แจกจ่าย และการติดตั้งใช้งานจริงทั้งในแบบคอนเทนเนอร์เดี่ยวๆ (container) และแบบใช้งานประสานกันจากหลายๆคอนเทนเนอร์ (orchestrated service) ได้อย่างง่ายดาย เพราะเราเพียงแค่ย้ายไฟล์ที่เป็นอิมเมจไปใช้งานในเครื่องที่ต้องการ นอกจากนี้การใช้คอนเทนเนอร์ยังช่วยให้เราเพิ่มหรือลดบริการให้สอดคล้องกับปริมาณงานได้ทันกับความต้องการ โดยการเพิ่มหรือลดจำนวนคอนเทนเนอร์ที่ทำงานแบบเดียวกันซึ่งระบบงานต้องออกแบบมาให้รองรับการทำแบบนี้ด้วย

การที่ Docker ไม่ต้องใช้เครื่องคอมพิวเตอร์จำลองเนื่องจาก Docker ใช้ประโยชน์จากเคอร์เนลของระบบปฏิบัติการของเครื่องที่เป็นโฮสต์โดยตรง ดังนั้นเราจะไม่สามารถใช้ Docker ระบบปฏิบัติการอื่นนอกเหนือจากลินุกซ์ได้โดยตรงเพราะอิมเมจของ Docker รองรับเฉพาะลินุกซ์เท่านั้น อย่างไรก็ตาม Docker ได้พัฒนา Docker Desktop ซึ่งเป็นการนำ Docker มาทำงานบนเครื่องคอมพิวเตอร์จำลองที่เป็นลินุกซ์อีกทีหนึ่ง เพื่อให้เราสามารถติดตั้งใช้งาน Docker บนระบบปฏิบัติการอื่นเช่น Mac หรือ Windows ได้

สถาปัตยกรรมของ Docker

Docker ใช้สถาปัตยกรรมแบบลูกข่าย-แม่ข่าย (Client-Server Architecture) โดยส่วนที่เป็นลูกข่าย (Docker Client) จะเป็นส่วนที่ผู้ใช้งานใช้ในการสั่งให้ส่วนที่เป็นแม่ข่าย (Docker deamon) ดำเนินการสร้าง (build) ใช้งาน (run) และแจกจ่าย (disttibute) คอนเทนเนอร์ ทั้งส่วนที่เป็นลูกข่ายและแม่ข่ายสามารถอยู่บนเครื่องคอมพิวเตอร์เครื่องเดียวกันหรือคนละเครื่องก็ได้ หรือเราสามารถใช้ส่วนลูกข่ายเพื่อสั่งส่วนที่เป็นแม่ข่ายที่อยู่บนเครื่องคอมพิวเตอร์เครื่องอื่นก็ได้ ส่วนที่เป็นลูกข่ายและแม่ข่ายจะสื่อสารกันด้วยโปรโตคอล Rest API ผ่านการเชื่อมต่อแบบเครือข่าย (unix socket หรือ network interface) และยังมีส่วนที่เรียกว่า Docker Compose ที่ให้คุณทำงานกับแอปพลิเคชันที่ประกอบด้วยคอนเทนเนอร์หลายๆตัว นอกจากนี้ยังมีส่วนที่เรียกว่า Repository ซึ่งเป็นคลังของอิมเมจเพื่อเอาไว้แชร์กับผู้อื่น โดย Docker มี Repository ที่เป็นสาธารณะเรียกว่า Docker Hub ซึ่งมีอิมเมจหลากหลายแบบให้เราเลือกใช้งาน และเราสามารถสร้าง Repository เพื่อใช้งานภายในองค์กรของเราเองก็ได้

ภาพจาก https://www.docker.com/

Docker daemon

Docker Daemon (โปรแกรมชื่อ dockerd) คือโปรแกรมที่ทำงานในส่วนแม่ข่าย ซึ่งจะคอยรับคำสั่ง (request API ) และจัดการออบเจกต์ต่างๆของ Docker เช่น อิมเมจ (Image) คอนเทนเนอร์ (container) เครือข่าย (network) และขนาด (volume) Docker Daemon สามารถสื่อสารระหว่างกันเพื่อจัดการบริการของ Docker

Docker Client

Docker Client (โปรแกรมชื่อ docker) เป็นช่องทางหลักที่เราใช้งาน Docker เมื่อเราสั่งให้ Docker ทำงาน เช่น สั่ง docker run ตัว Docker Client จะส่งคำสั่งไปยัง dockerd โดยใช้ Docker API เพื่อให้ทำงานตามที่ต้องการต่อไป Docker Client สามารถสื่อสารกับ Docker Deamon ได้หลายตัว

Docker Desktop

เนื่องจาก Docker พัฒนามาบนพื้นฐานของการใช้งานบนระบบปฏิบัติการลินุกซ์ ดังนั้นอิมเมจจึงรองรับกับการใช้งานบนลินุกซ์เท่านั้น จึงมีการพัฒนา Docker Desktop ขึ้นมาเพื่อให้ระบบปฏิบัติการอื่นสามารถใช้งานอิมเมจเหล่านี้ได้ เราสามารถใช้ Docker Desktop ในการสร้าง (build) และแชร์แอปพลิเคชันแบบคอนเทนเนอร์ (containerized application) และไมโครเซอร์วิส (microservice) Docker Desktop ประกอบด้วย Docker daemon (dockerd), the Docker client (docker), Docker Compose, Docker Content Trust, Kubernetes, and Credential Helper และ Docker Desktop ยังมีระบบติดต่อผู้ใช้งานแบบกราฟฟิก (GUI) อย่างไรก็ตามการใช้งาน Docker Desktop บนระบบปฏิบัติการที่ไม่ใช่ลินุกซ์จะเป็นการทำงานบนเครื่องเสมือนอีกทีหนึ่ง ดังนั้นหากเราใช้ลินุกซ์การใช้ระบบติดต่อผู้ใช้งานแบบบรรทัดคำสั่ง (CLI) จะเบาและรวดเร็วกว่า

Docker Repository

Docker Repository เป็นคลังของอิมเมจเพื่อเอาไว้แชร์กับผู้อื่น โดย Docker มี Repository ที่เป็นสาธารณะเรียกว่า Docker Hub และเราสามารถสร้าง Docker Repository ของเราเองได้ เราติดต่อกับ Docker Repository โดยใช้คำสั่ง docker pull หรือ docker run เพื่อดาวน์โหลดอิมเมจที่ต้องการจาก Docker Repository ที่เรากำหนดไว้ในการตั้งค่า และใช้คำสั่ง docker push เพื่ออัพโหลดอิมเมจไปยัง Docker Repository

Docker Image

อิมเมจ (Docker Image) เป็นตัวแบบ (template) ที่อ่านได้อย่างเดียว (read only) ประกอบไปด้วยชุดคำสั่งเพื่อสร้างคอนเทนเนอร์ อิมเมจมักจะประกอบขึ้นมาจากอิมเมจอื่นๆผนวกกับการปรับแต่งต่างๆ เราสามารถสร้างอิมเมจขึ้นมาเองหรือเลือกใช้อิมเมจที่มีคนอื่นสร้างไว้แล้วซึ่งเก็บอยู่ที่ Docker Repository ก็ได้ เราสร้างอิมเมจโดยใช้ไฟล์ Dockerfile ซึ่งประกอบด้วยคำสั่งที่กำหนดขั้นตอนการสร้างและการใช้งานอิมเมจ แต่ละคำสั่งในไฟล์จะหมายถึงการสร้างแต่ละระดับชั้น (layer) ของโครงสร้างในอิมเมจ จุดเด่นของอิมเมจคือหากเราแก้ไขไฟล์ Dockerfile และสั่งปรับปรุงอิมเมจ เฉพาะระดับชั้นที่มีการเปลี่ยนแปลงเท่านั้นที่จะมีการเปลี่ยนแปลง ซึ่งทำให้การทำงานมีความรวดเร็ว

Container

คอนเทนเนอร์ (Container) เป็นสิ่งแวดล้อมแบบ run time เพื่อให้อิมเมจสามารถทำงานได้ โดยเราส่งคำสั่งสร้าง (create ) เริ่มการทำงาน (start) หยุดการทำงาน (stop) หรือลบ (delete) โดยใช้ Docker API หรือการใช้บรรทัดคำสั่ง (command line interface) เราสามารถเชื่อมต่อเครือข่ายกับคอนเทนเนอร์ได้มากกว่าหนึ่งเครือข่าย เชื่อมต่อกับพื้นที่จัดเก็บข้อมูล (storage) หรือสร้างอิมเมจใหม่ขึ้นมาจากสถานะปัจจุบันของคอนเทนเนอร์