Docker tutorial for beginners : Part 1

บทความโดย ผศ.ดร.ณัฐโชติ พรหมฤทธิ์
ภาควิชาคอมพิวเตอร์
คณะวิทยาศาสตร์
มหาวิทยาลัยศิลปากร

หลายคนคงเคยได้ยินคำว่า Containers ที่เป็นเครื่องมือสำหรับการบรรจุ จัดส่ง และ Deploy Application กันมาบ้าง ซึ่งถ้าคุณเป็น Software Developer ของบริษัท Software ในปัจจุบัน คุณมีโอกาสสูงที่จะได้เขียนโปรแกรมแล้วบันทึก Version โดยใช้ Git และ Deploy บน Containers

ดังนั้นการเข้าใจแนวคิดของ Containers จึงเป็นสิ่งจำเป็นขั้นพื้นฐานที่ผู้ประกอบอาชีพ Software Developer ทุกคนจะต้องมี โดยการดูแล Containers ให้ทำงานได้อย่างราบรื่น เป็นหน้าที่หลักของ DevOps Engineer ครับ

Containers vs Virtual Machines

Containers และ Virtual Machines นั้นมีเป้าหมายเดียวกัน คือ การแยก Application และ Library รวมทั้งไฟล์ต่างๆ ที่เกี่ยวข้อง เก็บไว้ในกล่องที่สามารถนำไปรันบน Host ได้ทุกๆ ที่

แต่ทั้ง Containers และ Virtual Machines มีสถาปัตยกรรมที่แตกต่างกัน ดังภาพด้านล่าง

Virtual Machines นั้นจะจำลอง Computer ทั้งเครื่อง และรัน Program ผ่าน Guest OS ได้เหมือนกับ Computer จริงๆ โดย Virtual Machines ใช้ Hypervisor ในการรัน ซึ่ง Hypervisor สามารถรันบน Hardware/Infrastructure โดยตรง (Bare-metal) หรือจะรันผ่าน OS อีกทีก็ได้

Hypervisor ที่รันบน OS (Hosted hypervisor) ที่เราอาจเคยได้ยิน เช่น VMware workstation, Microsoft virtual PC และ Oracle Virtual Box ส่วน Hypervisor ที่รันบน Hardware โดยตรง (Bare-metal hypervisor) ได้แก่ VMware ESX, Citrix Xen Server และ Microsoft Hyper-V เป็นต้น

Containers  ไม่เหมือนกับ Virtual Machines ตรงที่ Virtual Machines เป็นการจำลอง Hardware (Hardware virtualization) ขณะที่ Containers เป็นการจำลอง OS (Operating system virtualization) นั่นทำให้แต่ละ Container ที่ทำงานบน Host เดียวกันจะมีการแชร์ System Kernel ร่วมกันครับ

Docker Containers

Docker คือ Open-source platform สำหรับสร้างและจัดการ Containers บนระบบปฏิบัติการ Linux มันจึงใช้ Linux Kernel เป็นฐานในการสร้าง Containers แต่ Containers ไม่ใช่แนวคิดที่ใหม่ ก่อนหน้านี้ก็มี Linux container อยู่หลายเจ้า เช่น Solaris Zones, BSD jails, and LXC

แต่ที่ทำให้ Docker โด่งดังก็เพราะการใช้งานที่ง่าย เราสามารถ Build และบรรจุ Application บน Laptop และนำไปรันบน Private Cloud หรือ Public Cloud ที่ไหนก็ได้

ด้วยการที่ Containers นั้นแชร์ System Kernel มาจาก Linux OS โดยไม่ต้องลง OS ใหม่ (Guest OS) เหมือนกับ Virtual Machines เราจึงสามารถสร้าง รัน และ stop Docker container ได้ภายในไม่กี่วินาที ขณะที่การสร้าง รัน และ stop Virtual Machines จะใช้เวลาที่นานกว่า

ผู้ใช้ Docker ยังสามารถใช้งาน Docker Hub ซึ่งเหมือนกับ App store (Apple) หรือ Google Play (Google) เพื่อค้นหา หรือฝาก Docker Image ซึ่งเป็นชุดเครื่องมือ (Starter-kit) ในการสร้าง Container

นอกจากนี้เรายังสามารถแบ่ง Application ออกเป็นส่วนๆ ตามหน้าที่ แยกไปเก็บในแต่ละ Container เช่น เราอาจมี Mysql database ที่รันอยู่บน Container หนึ่ง ขณะที่ Python App รันในอีก Container หนึ่ง ทำให้มีความสะดวกในการขยายส่วนประกอบต่างๆ ของ Application หรือทำ Horizontal Scaling ได้ในอนาคต

เพื่อให้เข้าใจมากขึ้น จะขอเปรียบเทียบ Docker Containers กับสิ่งต่างๆ ที่เราเคยรู้จักในชีวิตจริงครับ

Container

ภาพจาก https://www.piqsels.com/th/public-domain-photo-flrxz

ตู้คอนเทนเนอร์ ก็เหมือนกับ Docker container ที่สามารถ "เก็บ" Program ต่างๆ ไว้ภายในตู้ โดยสามารถ "เคลื่อนย้าย" จาก Local Machine ไปยัง Cloud servers ได้ และมี "ช่องทางเข้าถึง" Program ภายใน Container ที่ชัดเจน เช่น มี Port ที่ให้ Brower เปิดเข้าไปใช้งาน รวมทั้งสามารถจัดหามาได้จากผู้จัดจำหน่ายผ่านทาง Internet แต่ที่ไม่เหมือนอย่างเดียวคือ Docker container นั้นฟรี ขณะที่ ตู้คอนเทนเนอร์ นั้นต้องซื้อ

Software

Docker container ก็เหมือน Software ตัวหนึ่ง โดยพื้นฐานแล้ว Docker container คือชุดคำสั่งของ Program เมื่อ Container ถูกรัน มันจะรัน Program ใน Container อีกที เราสามารถรัน Container หลายๆ ตัวบน Host Machine เหมือนกับรัน Program หลายๆ โปรแกรมบนเครื่องคอมพิวเตอร์ โดยเราสามารถรัน stop และ detete Container ได้เช่นกัน

Docker Image and Dockerfile

Docker Platform มีองค์ประกอบสำคัญที่ต้องทำความรู้จัก ได้แก่ Docker Image และ Dockerfile

Docker Image ประกอบด้วย Dockerfile, Library และ Code ของ Application ที่ต้องการจะรัน มัดรวมอยู่ด้วยกัน

Dockerfile คือ ชุดคำสั่งในการ Build Image ซึ่ง Docker จะ Build Image ทีละ Layer โดยเราเรียก Layer แรกว่า Base Image เช่น alpine, ubuntu หรือ python

Layer ใหม่จะถูกเพิ่มต่อจาก Base Layer ตามลำดับคำสั่งใน Dockerfile เราสามารถระบุคำสั่งใน Dockerfile เพื่อให้เพิ่ม Numpy, Pandas และ Scikit-learn เป็น Layer ถัดๆ ไป ซึ่งเรียกว่า Intermediate layer โดย Intermediate layer จะเป็น Read only layer


เมื่อมีการสร้าง Container ใหม่ Docker จะ Add Layer แบบ Writable Layer ไว้ด้านบนสุด โดยเราสามารถสร้าง Container โดยใช้คำสั่ง docker run

docker run image_name

Eating Container

เราอาจเปรียบเทียบกระบวนการสร้าง Container ได้เหมือนกับการทำขนมเค้กครับ

ภาพจาก https://www.piqsels.com/th/public-domain-photo-fjrkc

สูตรในการทำขนมเค้ก คือ Dockerfile ส่วนวัตถุดิบ เช่น ไข่ไก่ นมสด แป้ง ผงฟู เนยสด และน้ำตาล คือ Layer

ชุดทำขนมเค้กที่มีทั้งเมนูและวัตถุดิบ คือ Docker image เตาอบเค้ก คือ Docker platform เริ่มอบขนมเค้กกันโดยใช้คำส่ง docker run! ครับ

Create your first Docker application

ssh nc-user@labxx.cpsudevops.com
  • ดู Version ของ Docker
docker version
  • สร้าง Project ใหม่ภายใน Folder docker101 ซึ่งประกอบด้วย ไฟล์ "main.py" และ "Dockerfile"
.
|__ Dockerfile
|__ main.py
  • เพิ่ม Code ในไฟล์ Python
  • เพิ่มคำสั่งใน Dockerfile
  • สร้าง Docker image
docker build -t hello-docker .
  • ดู Image ที่ถูกสร้าง
docker images
  • รัน Docker image
docker run hello-docker
`
  • ดู Container ทั้งหมดที่กำลังรันอยู่และ stop แล้ว
docker ps -a
`
  • ดู Layer ของ Images
docker history hello-docker
  • ดูเนื้อที่ที่ Docker ใช้
docker system df
  • ลบ Containers
docker rm c66c1683e903
`
  • ลบ Images
docker rmi hello-docker
`
ขอขอบคุณ Nipa.Cloud ที่ให้การสนับสนุน Environment ในการเรียนการสอน
รายวิชา Dev-Ops and Cloud Engineering 101