ข้ามไปที่เนื้อหา

Getting started with Docker

การ Deploy application เพื่อทำงานบน Docker จะต้องผ่านการะบวนการสร้าง Docker images เทียบได้กับขั้นตอนการ Publish ซึ่งในเครื่องพัฒนาจะต้องติดตั้ง Docker Desktop ก่อนทำการ Publish การ Deploy รูปแบบนี้จะทำให้ Application ที่ถูกพัฒนาขึ้นสามารถทำงานได้ทุกสภาพแวดล้อม ในต่างระบบปฏิบัติการ ซึ่งในทางกลับกัน ผู้พัฒนาก็จะสามารถจำลองการทำงานจริง ๆ ที่เหมือนกับ Production ได้จากเครื่องผู้พัฒนาได้เลยเพราะมีการ Image ชุดเดียวกัน

หลักการทำงานของ Docker โดยเบื้องต้น

Docker Architecture

Docker Architecture from https://docs.docker.com/get-started/overview/

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

docker pull image command
docker pull [address]

Deploy application ด้วยคำสั่ง run และตามด้วย address ของ image

docker run image command
docker run -d [address]

เพื่อสั่งให้ 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 นั้นๆมาเก็บที่เครื่อง

docker pull image command
docker pull [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

docker run image command
docker run [parameters] [address]

Stop running container

คำสั่งหยุดการทำงานของ container

docker stop container command
docker stop [container name หรือ container id]

container id สามารถพิมพ์แค่บางส่วนได้เช่น container id: 2ceefs981 สามารถใช้แค่ 2ceef ได้เช่นกัน

Remove container

คำสั่งลบ container

docker remove container command
docker run -d [address]

Docker process status

คำสั่งสำหรับการตรวจสอบ Status ของ container ใส่ parameter -a เพื่อแสดงทั้งหมด ทุก container

check status of every container command
docker ps -a

Inspect container's information

คำสั่งดูรายละเอียดของ container

inspect container command
docker inspect [container name หรือ container id]

Explore logs from container

สำหรับ .NET Application คำสั่ง logs จะใช้สำหรับการเข้าถึง console ที่จะแสดงรายละเอียดการทำงานของ application หรือ logs ที่ได้จาก application

access log console command
docker logs [container name หรือ container id]

Execute command

คำสั่งสำหรับการเข้าถึง Command line ของ container

execute command inside container command
docker exec -it [container name หรือ container id] bash