แนะนำโลกของ Docker
สามารถดู video ของหัวข้อนี้ก่อนได้ ดู video
รู้จักกับ Docker ก่อนว่ามันคืออะไร ? มันมาแก้ pain point อะไรของการ development ?
Docker คือ platform ที่ใช้สำหรับการจำลอง environment แยกออกมาเป็น container เพื่อให้เราสามารถที่จะ develop, deploy และ run application บน container ที่แยกออกมาได้ (ภาพจะคล้ายๆกับ VM ที่มีขนาดเล็กกว่า) ซึ่งมันจะรวมทั้งหมดเอาไว้ตั้งแต่ code, library, system tools, runtime (ตัวที่ใช้สำหรับ run code) เพื่อให้จัดการ software ได้ง่ายยิ่งขึ้น
- ปัญหาของ Docker เริ่มจาก แต่ละคนมีเครื่องที่มีคนละ environment กัน แล้วถ้าจะต้องลง Software ในแต่ละ environment ที่ไม่เหมือนกัน = มันจะต้องเตรียมการ setup ไว้หลายๆแบบ (มีคำตลกในวงการโปรแกรมเมอร์ที่ชอบพูดกันประจำว่า It works on my machine ซึ่งก็มาจากประเด็นเหล่านี้แหละ)
- ไหนจะเวลาไปทำงานที่เครื่องใหม่ก็ต้องมาเสียเวลาลงใหม่อีก (ย้ายเครื่องทีก็ต้องมาดูทีว่า software นี้จะลงกับเครื่อง environment นี้ยังไงได้บ้าง)
- ซึ่ง Docker เนี่ย สามารถแก้ปัญหาเหล่านี้ได้ เนื่องจาก Docker เป็น platform ที่ run อยู่บนพื้นฐานของ Container (เดี๋ยวเรามาอธิบายอีกที) ที่มีความสามารถห่อของทั้ง application เอาไว้ (ไม่ว่าจะเป็น code, library หรือ system file ที่เกี่ยวข้อง) เป็น Image file แล้วเราสามารถเอาสิ่งที่ห่อ (Image file นั้น) ไป deploy บน Docker เพื่อให้สามารถ run application ออกมาหน้าตาเหมือนเดิมกับตอนที่ห่อเข้าไปได้
- อารมณ์เหมือน burn ข้อมูลใส่แผ่นดิส แล้วเราก็เอาแผ่นดิสนั้นไปลง software ต่อที่เครื่องไหนก็ได้ ขอแค่ลง docker ไว้
เทียบกับ Virtual Machine (VM) แล้ว docker แตกต่างกันอย่างไร ?
ถ้าเราอ่านมาจนถึงตอนนี้ ทุกคนอาจจะสงสัยอย่างหนึ่งว่า แล้ว Docker platform นี่ ฟัง ๆดูมันเหมือนเป็น VM สักตัวหนึ่ง ที่ support การรันในทุก platform ได้ แล้วตัวมันเองละ แตกต่างกับ Virtual Machine ยังไงบ้าง ?
Ref: https://www.weave.works/blog/a-practical-guide-to-choosing-between-docker-containers-and-vms
ต้องบอกว่า ทั้ง VM และ Docker นั้นเป็น Technology ที่ใช้สำหรับการแยกส่วนของการ deployment ออกมาจากกันทั้งคู่ (คือเป็นเครื่องที่ใช้สำหรับรัน software แยกจากเครื่องหลัก) แต่ความแตกต่างของทั้งคู่ก็คือ "รูปแบบการ run"
- Docker จะทำงานอยู่บน Container เป็นหลักโดยจะใช้ทรัพยากรจากเครื่อง OS อีกที (เรียกว่าใช้ร่วมกัน สังเกตจากภาพด้านบน Container จะรันอยู่บน Operating System ตัวหลักเหมือนเดิม)
- ส่วน VM นั้นจะแบ่งทรัพยากรออกมาจากกันต่างหากเลย ทำให้เหมือนเครื่องนั้นกลายเป็นเครื่องๆหนึ่งออกมาจริงๆ (จากภาพบน ส ังเกตตรง Hypervision แล้วเบื้องหลังของแต่ละคนจะมี Guest OS ออกมาที = ทุกคนก็จะมี OS แยกเป็นของตัวเอง)
ดังนั้น ทั้ง 2 ตัวนี้จึงแตกต่างกันที่รูปแบบการจัดสรรทรัพยากรและการใช้งานทรัพยากรเป็นหลัก
- แต่หากเรามองไปที่ความสะดวกสบายของรูปแบบ Container (ที่สามารถนำ Image มา run ได้) ก็ต้องยอมรับว่า การใช้ Docker มันสะดวกสบายกว่า การพยายามเปิด VM ให้เหมือนกับเครื่องต้นฉบับกว่ามากเลย
- ดังนั้น นี่จึงเป็นเหตุผลที่ Docker ถูกใช้ในวงกว้างมาก ทั้งในการทำ deployment (การขึ้นงาน production) และการ development (ซึ่งจะเป็นเนื้อหาของ session นี้) เพื่อให้ต่อให้ผม ผู้เรียน หรือทุกๆคนที่กำลังอ่านอยู่ ต่อให้เรา run OS ที่ไม่เหมือนกัน (ใช้ Mac, Windows, Linux คนละ version กัน) ก็สามารถที่จะ run software หน้าตาออกมาเหมือนๆกันผ่าน Docker ได้
Session นี้จะพาทำอะไรบ้าง
- เราจะพาแนะนำ docker สำหรับ development เท่านั้น (สำหรับ production จริง เราจะมีคำแนะนำตอนท้าย)
- เพื่อให้ Session หลังจากนี้ standard การลงแต่ละ project ทุกที่จะเหมือนๆกัน
- ใน Session นี้เราจะพาเล่นผ่าน command ทั้งหมด (ตอนท้ายจะมีแนะนำ Docker UI ไว้เล็กน้อย)เพื่อให้เกิดความเข้าใจที่ถ่องแท้
setup docker
ปัจจุบันเรามี Docker desktop ที่สามารถลงได้ทั้ง windows / mac / linux สามารถใช้ตัวนี้ได้เลย
เข้าไปโหลดกันได้ที่ https://www.docker.com/
ให้ทุกคนเปิด terminal (ถ้าเป็น windows คือ cmd) แล้ว test command docker ดูว่าออกมาหรือไม่ ด้วยคำสั่ง
docker -v
ถ้าพิมพ์คำสั่งได้ และออกมาแบบนี้ (version อาจจะไม่ตรงกัน ไม่เป็นไร ขอแค่ไม่ command not found ก็พอ) = ok แล้ว เราพร้อมสำหรับลุย