ข้ามไปยังเนื้อหา

Docker คืออะไร?

Docker ไม่ใช่โปรแกรมเดียว — แต่เป็น ecosystem ของส่วนประกอบที่ทำงานร่วมกัน พอเข้าใจแต่ละส่วนแล้ว คุณจะเห็นภาพได้ง่ายขึ้นมากว่าเกิดอะไรขึ้นเมื่อรันคำสั่ง docker

docker CLI คือโปรแกรมที่คุณโต้ตอบด้วยโดยตรง เมื่อคุณพิมพ์คำสั่งเช่น docker run, docker build, หรือ docker pull CLI จะแปลคำสั่งนั้นเป็น REST API request และส่งต่อไปยัง Docker daemon ตัว client เองไม่ได้ทำงานหนัก — เป็นแค่ API client แบบบาง

client สื่อสารกับ daemon ผ่าน Unix socket ที่ /var/run/docker.sock โดยค่าเริ่มต้น สำหรับ daemon ระยะไกล (เช่น Docker host ที่รันบน cloud VM) client สามารถเชื่อมต่อผ่าน TCP พร้อม TLS ได้

daemon คือ background process ที่รันต่อเนื่องและเป็นตัวลงมือทำงานจริง คอยรับฟังบน Unix socket (หรือ TCP port) และจัดการ API call ทุกอย่างที่ client ส่งมา daemon รับผิดชอบในการ:

  • Pull และ cache images จาก registries
  • สร้างและรัน containers จาก images เหล่านั้น
  • จัดการ networks เพื่อให้ containers สามารถสื่อสารกันและกับโลกภายนอกได้
  • จัดการ volumes สำหรับข้อมูลถาวรที่อยู่รอดเกินอายุการทำงานของ container

image คือ แพ็กเกจแบบ read-only, layered ที่บรรจุทุกสิ่งที่จำเป็นในการรัน process: application code, base OS filesystem, runtime libraries, environment variables, และ default command ที่จะรัน Images ถูก build จาก Dockerfile และถูกระบุด้วยชื่อและ tag เช่น nginx:1.27-alpine

แต่ละ layer ใน image แสดงถึงคำสั่งเดียวใน Dockerfile Layers ถูก cache และแชร์ระหว่าง images ซึ่งช่วยให้การใช้พื้นที่ดิสก์ต่ำและการ rebuild เร็ว

registry คือ server ที่จัดเก็บและแจกจ่าย images registry สาธารณะเริ่มต้นคือ Docker Hub (docker.io) เมื่อคุณรัน docker pull nginx daemon จะติดต่อ docker.io, ค้นหา repository nginx, และดาวน์โหลด image ไปยัง cache ในเครื่อง

Registries จัดระเบียบ images เป็น repositories repository หนึ่งสามารถมี images หลายเวอร์ชันของสิ่งเดียวกัน โดยแยกแยะด้วย tags:

flowchart TB
  ref["docker.io/library/nginx:1.27-alpine"]
  ref --> host["registry host: docker.io"]
  ref --> ns["namespace: library (official images)"]
  ref --> repo["repository name: nginx"]
  ref --> tag["tag: 1.27-alpine"]
Anatomy of an image reference

Private registries (Amazon ECR, GitHub Container Registry, registry ที่ host เอง) ทำงานในแบบเดียวกัน — คุณแค่ docker login เพื่อยืนยันตัวตนก่อน push หรือ pull

การไหลที่คำสั่ง docker run ทุกครั้งดำเนินตาม:

flowchart TB
  you["You (terminal): docker run nginx"]
  cli["docker CLI"]
  daemon["dockerd (daemon)"]
  registry["Docker Hub (or other registry)"]
  cache["Local image cache"]
  container["Running container (isolated process on host kernel)"]
  you --> cli
  cli -->|REST API over Unix socket| daemon
  daemon -->|Image not in local cache| registry
  registry -->|Pull image layers| cache
  cache -->|Create container from image| container
What happens when you run docker run
  1. คุณพิมพ์ docker run nginx
  2. CLI ส่ง request POST /containers/create ไปยัง dockerd ผ่าน Unix socket
  3. dockerd ตรวจสอบ cache image ในเครื่องสำหรับ nginx:latest
  4. ถ้า image ไม่มี dockerd จะติดต่อ Docker Hub, ยืนยันตัวตนถ้าจำเป็น, และ pull image layers
  5. Layers ถูกเก็บไว้ใน cache ในเครื่อง (โดยทั่วไปอยู่ใน /var/lib/docker)
  6. dockerd สร้าง container ใหม่จาก image และเริ่ม process
  7. Standard output จาก container ถูก stream กลับผ่าน dockerd ไปยัง terminal ของคุณผ่าน CLI
ตัวเลือกBenefitCost
containerเบา แชร์ kernel host เริ่มทำงานเร็ว เหมาะกับ deploy จำนวนมากisolation อ่อนกว่า VM เพราะแชร์ kernel เดียวกัน
VMisolation แข็งแกร่งด้วย hypervisor เต็มรูปแบบหนัก ต้องมี guest OS ของตัวเอง ใช้ทรัพยากรมากกว่ามาก
  • เข้าใจว่า image กับ container เป็นสิ่งเดียวกัน ทั้งที่ image คือ template แบบ static ส่วน container คือ instance ที่กำลังรัน
  • ใช้ tag latest ใน production ทำให้ build ไม่ reproducible เพราะ latest ชี้ไป version ไหนก็ได้เมื่อเวลาผ่านไป
  • มองว่า container ปลอดภัยเท่า VM โดยไม่ปรับ configuration เพิ่มเติม เช่น ปล่อยให้ process ภายใน container รันเป็น root

💡 ตัวอย่างจากของจริง

Netflix และ Spotify ใช้สถาปัตยกรรม microservices ที่รันแทบทั้งหมดใน container เพราะ Docker ทำให้ทีมนับร้อยส่ง service อิสระจากกันได้อย่างรวดเร็วและสม่ำเสมอ ตั้งแต่ local dev ไปจนถึง production

Docker daemon (`dockerd`) มีบทบาทอะไร?
Docker CLI ส่งคำสั่งของตัวเองไปที่ไหนโดยค่าเริ่มต้น?
Docker image คืออะไร?
ใน image reference `docker.io/library/nginx:1.27-alpine`, `1.27-alpine` แสดงถึงอะไร?