Docker 101: สิ่งที่ควรรู้ก่อนเริ่มใช้งาน Docker

ในบทความที่แล้วเราได้พูดถึงแล้วว่า Containers และ Docker คืออะไรและมีประโยชน์อย่างไร ในครั้งนี้เราจะมาอธิบายถึงสิ่งที่เราควรจะรู้และทำตัวให้คุ้นเคยก่อนจะเริ่มใช้งาน Docker

Docker Engine? Never heard of that

Docker Engine คือชุดซอฟต์แวร์ในการจัดการ Containers ซึ่งเปรียบเทียบได้กับ Hypervisor ในการทำ Virtualization ตัว Docker Engine จะประกอบไปด้วย 3 ส่วนก็คือ

Image from https://docs.docker.com/get-started/overview/
  • Docker Daemon หรือ Server เป็นตัวที่ทำงานในการจัดการและควบคุม Docker Containers ทุกอย่าง โดย Docker Daemon จะทำงานเป็น background process
  • Docker CLI หรือ Client เป็น Command Line Interface ที่ทำให้ผู้ใช้สามารถใส่คำสั่งเพื่อควบคุม Docker Container ได้
  • REST API จะเป็นตัวกลางในการสื่อสารระหว่าง Docker CLI (Client) และ Docker Daemon (Server)

3 ส่วนใน Docker Engine นี้จะทำงานร่วมกันเพื่อทำให้ผู้ใช้สามารถสร้างและจัดการ Docker Containers ได้ โดย Docker CLI จะเป็นตัวรับคำสั่งผ่าน CLI จากผู้ใช้และจะส่งคำสั่งนั้นผ่านไปทาง REST API เพื่อสั่งการให้ Docker Daemon ที่ทำงานอยู่ทำคำสั่งตามที่ผู้ใช้ต้องการ ด้วยการทำงานแบบนี้ ทำให้เราสามารถที่จะใช้ Docker CLI ที่อยู่บนเครื่องเรา ไปควบคุม Docker Daemon บนเครื่องอื่นๆโดยทำผ่าน REST API นั้นเอง (การเปิด port Docker REST API สู่ Internet ไม่ใช่เรื่องที่ควรทำนัก)

Docker Image

An image is a read-only template with instructions for creating a Docker container
ตัวอย่างของ Docker Image nginx บน Docker Hub

Docker Image คือ สิ่งที่เราสร้างขึ้นมาเพื่อเป็นพิมพ์เขียวให้กับ Docker ในการนำไปสร้าง Docker Containers เพราะฉะนั้นแล้วในการที่เราจะสร้าง Docker Containers ขึ้นมา เราจะต้องทำการสร้าง Docker Image ขึ้นมาก่อน ซึ่ง Docker ก็มี Docker Hub ที่เป็นแหล่งรวม Docker Image ที่เราสามารถเอา Image ของเรามาแชร์กับคนอื่นได้ รวมไปถึงเราสามารถใช้ Image ของคนอื่นก็ได้เช่นกัน

ถ้าหากใครยังนึกภาพไม่ออก เราสามารถคิดได้ว่า Docker Image ก็คือตัว ตู้ container เลย โดย application ที่เราต้องการใช้งานเนี่ย มันอยู่ในตู้ container ดังนั้น ตัวตู้ container (Docker Image) นี้เนี่ย เราสามารถจะเคลื่อนย้ายไปไหนก็ได้ (Docker Hub)

Wait wait, where the Docker Image came from ?

ในเมื่อ Docker Image ถูกใช้เพื่อเป็นพิมพ์เขียวในการสร้าง Docker Containers แล้ว Docker Image มาจากไหนล่ะ ตัว Docker Image นั้นจะถูกสร้างมาจากไฟล์ที่เรียกว่า Dockerfile โดยใน Dockerfile จะมีการเขียนคำสั่งเป็นขั้นตอนเพื่อบอก Docker Daemon ว่าในการสร้าง Docker Image นี้เราจะต้องทำอะไรบ้างเช่น command ต่างๆ หรือการ copy file โดยการ Dockerfile จะถูกนำไปใช้ในคำสั่ง docker build และผลลัพท์ที่ได้ก็คือ Docker Image ที่เอาไปสร้าง Docker Container อีกทีนึงนั้นเอง ซึ่งสำหรับตัว Dockerfile เราจะมาอธิบายรายละเอียดของ syntax และ structure ของมันอีกทีนึงในบทความอื่น

Docker architecture ?

อย่างที่เราอธิบายไปแล้วว่าการทำงานของ Docker ที่ทำหน้าที่สร้างและจัดการ Docker Containers จะทำงานผ่าน Docker Engine ดังนั้นขั้นตอนทำงานโดยภาพรวมของ Docker จะประกอบด้วย 3 ส่วนหลักๆ ก็คือ

  • Client ที่เป็นทำหน้าที่รับคำสั่งจากผู้ใช้
  • Docker Daemon ที่รับคำสั่งจาก Client และดำเนินการตามที่ได้รับคำสั่ง
  • Registry เป็นที่เก็บ Docker Image (Ex. Docker Hub)
Image from https://docs.docker.com/get-started/overview/

ขั้นตอนการทำงานการสร้าง Docker Container โดยภาพร่วมก็จะเป็นดังนี้

  • ผู้ใช้ส่งคำสั่งผ่าน Client เช่น docker run nginx (สร้าง docker container ที่รัน nginx web server)
  • Client จะส่งคำสั่งไปที่ Docker Daemon ผ่าน REST API
  • Docker Daemon จะเห็นว่าเราต้องการที่จะสร้าง container ที่ใช้ Docker Image เป็น nginx และตรวจสอบดูว่าในเครื่องเรามี Docker Image ของ nginx อยู่รึเปล่า ถ้ามีก็ข้าม. step ต่อไปได้เลย
  • Docker Image ของ nginx ก็จะถูกดึง (pull) มาจาก registry เช่น Docker Hub มาเก็บไว้บนเครื่อง
  • Docker Daemon จะสร้าง Docker Container ของ nginx จาก Docker Image ที่โหลดมาไว้บนเครื่อง และเป็นอันเสร็จสิ้น

There is so much more about Docker

หลายๆ คนนะครับ นี่อ่านมาถึงจุดนี้ อาจจะรู้สึกว่า Docker เนี่ย มันดูยุ่งยาก มีอะไรที่ต้องจำเยอะแยะเลย แต่ถ้าเราเข้าใจการทำงานพื้นฐานของ Docker แล้ว เราจะสามารถใช้ Docker ได้อย่างง่ายดายเลยครับ

See you in the next article about Docker 101 soon ~