Getting started with Docker
การ Deploy application เพื่อทำงานบน Docker จะต้องผ่านการะบวนการสร้าง Docker images เทียบได้กับขั้นตอนการ Publish ซึ่งในเครื่องพัฒนาจะต้องติดตั้ง Docker Desktop ก่อนทำการ Publish การ Deploy รูปแบบนี้จะทำให้ Application ที่ถูกพัฒนาขึ้นสามารถทำงานได้ทุกสภาพแวดล้อม ในต่างระบบปฏิบัติการ ซึ่งในทางกลับกัน ผู้พัฒนาก็จะสามารถจำลองการทำงานจริง ๆ ที่เหมือนกับ Production ได้จากเครื่องผู้พัฒนาได้เลยเพราะมีการ Image ชุดเดียวกัน
หลักการทำงานของ Docker โดยเบื้องต้น
Docker เปรียบเสมือนเรือบรรทุกตู้ Container ทุกตู้ที่ถูกโหลดขึ้นเรือ ตู้ Container แต่ละตู้ก็จะมีรูปแบบที่เป็น Tamplate เดียวกันถ้ามาจากบริษัทเดียวกัน 1 บริษัทก็อาจจะมีมากกว่า 1 ตู้บนเรือ บริษัทตู้ที่ว่าก็คือ Image ของ Application และ Container แต่ละตู้คือ Node ที่ Deploy ออกไป ปกติแล้วก็จะเป็น 1 Image ต่อ 1 Container
สำหรับการใช้งานทั่วไป หรือกรณีของระบบที่ต้องมีการ scale เราก็จะใช้ระบบ 1 Image ต่อ n Container
(n คือจำนวนที่ scale ออก)
Docker เป็นตัวจำลองและแบ่งทรัพยากรภายในเครื่องซึ่งทำงานอยู่บนระบบปฏิบัติการเครื่องเดียวกัน 1 เครื่องสามารถจำลอง Container ขึ้นมาได้มากกว่า 1 Node ในเทคนิคระดับเดียวกันเมื่อนำมาเทียบการใช้ระบบ Virtual Machine ทุก ๆ Node ที่ VM ได้แบ่งออกมาจะต้องติดตั้งระบบปฏิบัติการเพื่อที่จะทำงานได้ ซึ่งเปลืองทรัพยากรมากกว่าทั้งๆที่เราสามารถ Reuse ทรัพยากรได้ Docker จึงเป็นที่นิยมในปัจจุบัน
นอกจากการใช้งาน Docker ในการ Deploy application แล้ว Docker ยังสามารถใช้งานกับ Registry อื่นๆได้เช่น Deploy Proxy หรือเครื่องมือ Monitoring ได้เพื่อเป็นตัวเสริมให้ application ที่ deploy มีความสามารถเพิ่มมากขึ้น ตัวอย่างการใช้งานเช่น
-
การ Deploy Database ด้วย Docker ไว้ภายในเครื่องเดียวกับ Application จากที่ต้องอยู่คนละเครื่องกัน ให้มาอยู่ด้วยกันจะช่วยลด latency หรือ round-trip ของ request ต่างๆได้
-
การใช้งาน Elasticsearch, Kibana ที่ Deploy ด้วย Docker ในเครื่องเดียวกันและทำการเชื่อมกับระบบ log ของตัว .NET Application ได้
Docker Image
หลักการโดยเบื้องต้นการจะได้มาซึ่ง Docker Image ของ Application เรานั้นคือการอ่านลำดับคำสั่งจากไฟล์ Dockerfile
ที่จะประกอบไปด้วย การดาวน์โหลด .NET SDK มาสำหรับการ Build > Restore > Publish จนได้ไฟล์ .dll ในที่สุด
การใช้งาน Docker Image
หลังจากได้ Publish application ด้วย Docker แล้ว Docker Image ของ application จะอยู่ที่ [Registry URL]/[application-name]:[tag]
ซึ่งเราสามารถใช้ address ชุดนี้เพื่อเข้าถึง Image application ได้
ก่อนจะ Deploy เราจะทำการดาว์นโหลด Image ด้วยคำสั่ง pull และตามด้วย address ของ image
Deploy application ด้วยคำสั่ง run
และตามด้วย address ของ image
เพื่อสั่งให้ Docker ไปอ่านไฟล์ Dockerfile ภายในและทำการอ่าน .dll
เท่านี้ก็จะเป็นการ Deploy .NET Application ด้วย Docker
จะเห็นได้ว่า Docker Image เปรียบเหมือน Source Code ที่เราจะต้องนำไปวางใน server เมื่อเทียบกับการ Deploy บน Windows Server เพียงแต่อยู่ในรูปแบบของ Image บน Gitlab จับต้องไม่ได้
หากไม่มีการระบุ tag ตามท้ายชื่อ image Docker จะทำการดึง version ล่าสุดหรือ latest มาให้แต่ถ้าต้องการแบบระบุ version จะต้องระบุดังนี้
registry.in.psu.ac.th/my-team/my-project:1.0
เมื่อใช้กับคำสั่งdocker pull [address]
ก็จะได้ Image ของ Application my-project ที่เป็น tag version 1.0 ไป
Docker Command พื้นฐาน
คำสั่งการควบคุม Docker CLI โดยพื้นฐานจะประกอบไปด้วย
Pull image from image registry to local repository
คำสั่ง pull ใช้สำหรับการดึงหรือดาว์นโหลด Docker Image ของ address นั้นๆมาเก็บที่เครื่อง
ควรมีการล้าง Image ที่ไม่ใช้ออกด้วยคำสั่ง
docker image prune
อย่างสม่ำเสมอ
Start running container
คำสั่ง run จะนำ Image ที่ pull มาสร้างเป็น Container ซึ่งจะมีการกำหนด parameter ได้เช่น
-
--name
ใช้ตั้งชื่อ Container -
-d
ใช้สำหรับการรันในโหมด "detached" คือรันใน Background process ทำให้ reuse หน้า command line ได้ -
-p [port ภายนอกที่ใช้เข้าถึง]:[port ภายใน container]
ใช้กำหนด port ของ container -
-v [path ภายนอก]/[path ภายใน container]
ใช้สร้าง volume หรือ persistent storage -
-e key=value
ใช้กำหนดตัวแปร environment
Stop running container
คำสั่งหยุดการทำงานของ container
container id สามารถพิมพ์แค่บางส่วนได้เช่น
container id: 2ceefs981
สามารถใช้แค่2ceef
ได้เช่นกัน
Remove container
คำสั่งลบ container
Docker process status
คำสั่งสำหรับการตรวจสอบ Status ของ container ใส่ parameter -a
เพื่อแสดงทั้งหมด ทุก container
Inspect container's information
คำสั่งดูรายละเอียดของ container
Explore logs from container
สำหรับ .NET Application คำสั่ง logs จะใช้สำหรับการเข้าถึง console ที่จะแสดงรายละเอียดการทำงานของ application หรือ logs ที่ได้จาก application
Execute command
คำสั่งสำหรับการเข้าถึง Command line ของ container