Docker คืออะไร?
สี่ส่วนประกอบของ Docker
หัวข้อที่มีชื่อว่า “สี่ส่วนประกอบของ Docker”Docker ไม่ใช่โปรแกรมเดียว — แต่เป็น ecosystem ของส่วนประกอบที่ทำงานร่วมกัน พอเข้าใจแต่ละส่วนแล้ว คุณจะเห็นภาพได้ง่ายขึ้นมากว่าเกิดอะไรขึ้นเมื่อรันคำสั่ง docker
Docker client (docker CLI)
หัวข้อที่มีชื่อว่า “Docker client (docker CLI)”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 ได้
Docker daemon (dockerd)
หัวข้อที่มีชื่อว่า “Docker daemon (dockerd)”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 เร็ว
Registries
หัวข้อที่มีชื่อว่า “Registries”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"]
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
- คุณพิมพ์
docker run nginx - CLI ส่ง request
POST /containers/createไปยังdockerdผ่าน Unix socket dockerdตรวจสอบ cache image ในเครื่องสำหรับnginx:latest- ถ้า image ไม่มี
dockerdจะติดต่อ Docker Hub, ยืนยันตัวตนถ้าจำเป็น, และ pull image layers - Layers ถูกเก็บไว้ใน cache ในเครื่อง (โดยทั่วไปอยู่ใน
/var/lib/docker) dockerdสร้าง container ใหม่จาก image และเริ่ม process- Standard output จาก container ถูก stream กลับผ่าน
dockerdไปยัง terminal ของคุณผ่าน CLI
ข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
| container | เบา แชร์ kernel host เริ่มทำงานเร็ว เหมาะกับ deploy จำนวนมาก | isolation อ่อนกว่า VM เพราะแชร์ kernel เดียวกัน |
| VM | isolation แข็งแกร่งด้วย 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