Docker 101 : มารู้จัก Docker กันเถอะ
สวัสดีครับ สำหรับบทความวันนี้ผมจะมาแนะนำให้รู้จักกับสิ่งที่เรียกว่า Docker กันนะครับ โดยบทความนี้มีแรงบันดาลใจมาจากการอยากจะแบ่งปันเรื่องของ Docker ที่เคยได้ศึกษากับพร้อมๆกับเพื่อนของผม ซึ่งเนื้อหาจะเป็นเรื่องเกี่ยวกับ Concept และประโยชน์ของการใช้งาน Docker และก่อนที่พวกเราจะมารู้จัก Docker กัน ผมอยากให้ทุกคนรู้จักกับสองคำนี้ก่อนครับ นั่นก็คือ Container กับ Virtualization
Virtualization vs Container
สำหรับเทคนิค 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 ก็มาช่วยแก้ปัญหาที่ผมเจอบ่อยๆ ตอนทำแรกๆ เลยดังนี้
- Environment ของโปรแกรมที่มักจะ Conflict กัน
2. Version Dependency ของโปรแกรม Legacy
สรุปข้อดีของ 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 แบบคร่าวๆ หวังว่าจะมีประโยชน์กับผู้อ่านทุกคนนะครับ
อ้างอิง
https://docs.docker.com/
https://github.com/wdrdres3qew5ts21/Example-Golang-REST-API-with-Docker
Special Thanks
ขอขอบคุณ “สำนักงานส่งเสริมเศรษฐกิจดิจิทัล (depa)” และคณาจารย์ “คณะเทคโนโลยีสารสนเทศ มจธ. (SIT)” ที่ให้การสนับสนุน “ทุนเพชรพระจอมเกล้าเพื่อพัฒนาเทคโนโลยีและนวัตกรรมดิจิทัล (KMUTT-depa)” ซึ่งเป็นทุนที่มอบความรู้ ทักษะและโอกาสดีๆ กับผมอย่างมาก~