สำหรับบทความวันนี้จะมาแนะนำให้รู้จัก Docker โดยบทความนี้มีแรงบันดาลใจมาจากการอยากจะเล่าเรื่องของ Docker ที่เคยได้ศึกษา ซึ่งเนื้อหาจะเป็นเรื่องเกี่ยวกับ Concept และประโยชน์ของการใช้งาน Docker
Container กับ Virtualization
สำหรับ Virtualization จะเป็นสร้างเครื่องเสมือนหรือ Virtual Machine (VM) ขึ้นมาเพื่อใช้รันบนคอมพิวเตอร์อีกทีหนึ่ง โดยตัว Virtual Machine หรือ VM จะมองตัวเองเป็นเสมือนคอมพิวเตอร์หนึ่งตัวทื่รันอยู่บน Hardware จริงๆ โดยการรันของ Guest OS แต่ละตัวจะเป็นแบบ Isolation หรือแยกกันออกไปอย่างสมบูรณ์เลย และยังสามารถใช้งาน Host OS ได้แยกกับ Guest OS อยู่ ซึ่งการทำแบบนี้มีข้อเสียตรงที่กินทรัพยากรเยอะ ทำงานช้า ใช้พื้นที่ซ้ำซ้อน เพราะต้องลง OS และลง Software แยกกันในทุกๆ VM

จึงเกิดเป็น Container โดยคอนเทนเนอร์ถูกสร้างมาเพื่อแก้ข้อจำกัดเรื่องพื้นที่ โดยจะมี Hardware และ OS ชุดเดียวเพื่อลดปัญหาซ้ำซ้อน โดยตัว Software ที่ต้องรันต่างกันก็จะมีตัว Container มาครอบไว้เพื่อแบ่งส่วนทรัพยากรไว้ไม่ให้ปนกัน โดยจุดเด่นของคอนเทนเนอร์จะเป็นเรื่องของการใช้ทรัพยากรเครื่อง ซึ่งน้อยกว่า Virtualize มากๆ ซึ่งอาจจะมีขนาดแค่ หลัก MB แต่แบบ VM ใช้งานไปถึงระดับ GB เพราะไปหนักเรื่อง OS และยังใช้ memory น้อยกว่า
Docker คืออะไร ?

Docker ก็คือ engine ตัวหนึ่งที่มีการทำงานในลักษณะจำลองสภาพแวดล้อมขึ้นมาบนเครื่อง เพื่อใช้ในการ run service ที่ต้องการ มีการทำงานคล้ายคลึงกับ Virtual Machine เช่น VMWare โดยจะใช้เป็น container ในการจำลองสภาพแวดล้อมขึ้นมา เพื่อใช้งานสำหรับ 1 service ที่ต้องการใช้งานเท่านั้น
สรุปข้อดีของ Docker
- Docker ไม่ต้องเสียเวลาในสร้าง OS ใหม่ และการ Config แต่ละ OS เลย
- Docker เบาและเร็วกว่ามาก ไม่ว่าจะเป็น start stop และ restart เพราะใช้ OS, CPU และ RAM ร่วมกันกับ Host OS
- Docker สามารถรัน Container ได้มากกว่า VMs ในเครื่องที่มีทรัพยากรที่เท่ากัน
- Docker มีระบบ Registry ทำให้สามารถเคลื่อนย้าย หรือติดตั้ง Container ได้สะดวก และรวดเร็วกว่ามาก
- Containers รันอยู่บน Docker Engine ทำให้ไม่ต้องสนใจว่า Infrastructure หรือ Host OS ว่าจะเป็นอะไรยังไง ทำให้หมดปัญหาว่าเครื่อง Dev รันได้ แต่เครื่อง Production มันรันไม่ได้บ้าง หรือเครื่อง Dev แต่ละคนติดตั้งเครื่องมือคนละเวอร์ชันกัน ก็ build container เป็น image แล้วส่งในคนในทีมใช้ ก็หมดปัญหาแล้ว
ลองเล่น Docker ด้วยการเขียน Dockerfile

จากในภาพเป็นการเขียน Dockerfile ขึ้นมาเพื่อใช้ run app golang ซึ่งต่อไปก็ต้องใช้คำสั่ง เบื้องต้นดังนี้
docker build -t [image:tag] [dockerfile location] //เพื่อ build image
docker images //เพื่อดู image ในเครื่องของเรา
docker run -d[image:tag] //เพื่อ run image โดย -d คือ Detached mode
docker ps //เพื่อดู container ที่กำลังรันอยู่ในเครื่องของเรา



หลังจากนั้นให้ลองเข้าไปใน Container ด้วยคำสั่ง
docker exec -it [container id] sh

ก็จะพบว่าภายใน Container ก็เหมือนเป็นคอมพิวเตอร์อีกเครื่องจริงๆ เลยนั่นเอง
ถ้าเราอยากจัดการหลาย Container ละ?

สมมติว่าเรามี Container หลายๆ ตัว เช่น Application , Database , Mock Server หรืออื่นๆ ก็มีสิ่งที่เรียกว่า docker-compose มาช่วยจัดการในเรื่องนี้ ซึ่ง docker-compose ก็เหมือนกับการที่เขียน config เอาไว้สำหรับ container แต่ละตัว และก็สามารถสั่งให้มันทำงานพร้อมกันได้ด้วยคำสั่ง คำสั่งเดียว นั่นก็คือ
docker-compose up

ก็จะเห็นได้ว่า เมื่อรันคำสั่งแล้ว docker ก็จะสร้าง container ขึ้นมาตามที่ได้เขียน config ไว้ในไฟล์ docker-compose นั่นเอง โดยถ้าไม่มี image ตัวไหน compose ก็จะทำการค้นหา image ที่ขาดไปมาติดตั้งและสั่งให้ทำงานทันที

ซึ่งทั้งหมดของบทความนี้ก็เป็น Concept ของ Docker
อ้างอิง