หลายๆ คนที่เป็น Web Developer น่าจะเข้าใจดี เวลาจะ Deploy อะไรสักอย่าง ในสมัยก่อน วิธีคือต้องมี Server + OS (Linux, Windows อะไรก็ตามแต่) เสร็จแล้วเราก็ Remote เข้าไปติดตั้งสิ่งที่ต้องการ

เช่นถ้า LAMP Stack เบสิกๆ ก็ลง Apache, MySQL, PHP แล้วก็ Config แล้วอัพโค้ดเข้าไป หลายขั้นตอนไหม หลายขั้นตอน เหนื่อย แล้วถ้าเราต้องใช้ 100 เครื่องทำไง จะมานั่งทำทีละเครื่องเหรอ

จริงๆ แล้วยังมีอีกหลายงาน ไม่ใช่แค่ Web Dev แต่งานอื่นๆ ก็มี ที่ต้องสร้างอะไรแบบนี้

ด้วยปัญหาอะไรพวกนี้เลยถือกำเนิด Docker ขึ้นมา (ตาม Concept สวยหรูดูแพง Build, Ship, and Run Any App, Anywhere)

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

อันนั้นเปรียบเสมือนอาหารแพคกล่อง พร้อมจะไปแจกจ่าย

ทีนี้พอเราจะใช้ ทำยังไง ? เราสั่ง Docker run ตัว Image ที่สร้างมาแล้ว มันก็จะสร้างสิ่งที่เรียกว่า Docker Container อันนี้เปรียบเสมือน Server 1 ตัว ที่พร้อมใช้งาน

แล้วไงต่อ ?

ทีนี้ใน Server 1 ตัวเนี่ย เราจะมีกี่ Container ก็ได้

หลายๆ คนอ่านมาถึงตรงนี้แล้วกำลังคิดว่ามันก็คือ Virtual Machine ไม่ใช่เหรอ

จริงๆ มันคล้ายกัน แต่ไม่เหมือนกันซะทีเดียว อะลองดูภาพ

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