Images และ Dockerfile — ภาพรวมโมดูล
Docker image คืออะไร?
หัวข้อที่มีชื่อว่า “Docker image คืออะไร?”Docker image คือแพ็กเกจแบบ read-only ที่บรรจุทุกอย่างที่จำเป็นต่อการรันโปรแกรม ไม่ว่าจะเป็น filesystem ของ OS, runtime, ไลบรารี, โค้ด application และค่า config เริ่มต้น ลองนึกถึง image เหมือนสูตรอาหาร ตัวสูตรไม่เคยเปลี่ยน แต่คุณสามารถอบเค้ก (container) จากสูตรนี้ได้มากเท่าที่ต้องการ
image ถูกสร้างขึ้นจาก layer แบบ read-only ที่ซ้อนกันเป็นชั้น ๆ แต่ละ layer แทนการเปลี่ยนแปลงหนึ่งอย่าง เช่น เพิ่มไฟล์, ติดตั้งแพ็กเกจ, หรือเขียนค่า config เมื่อนำ layer มาซ้อนกันก็จะได้ filesystem ที่สมบูรณ์ แต่ Docker จะเก็บ (และส่งต่อ) เฉพาะ layer ที่มีการเปลี่ยนแปลงเท่านั้น จึงทำให้ image มีขนาดเล็กกระชับ
flowchart TB img["Image (read-only)"] l3["Layer 3: COPY app/ /app/ (your code)"] l2["Layer 2: RUN npm install (dependencies)"] l1["Layer 1: FROM node:22-alpine (base OS + runtime)"] img --> l3 --> l2 --> l1
container ที่กำลังรันอยู่ก็คือ image ที่มี writable layer เพิ่มขึ้นมาอีกหนึ่งชั้นด้านบน ตัว image ไม่ถูกแตะต้อง container จะเขียนข้อมูลลงใน scratch layer ของตัวเอง เมื่อหยุด container layer นั้นก็จะหายไป (เว้นแต่คุณจะบันทึกเอาไว้)
flowchart TB con["Container (running)"] w["Writable layer (container-specific changes, deleted on stop)"] l3["Layer 3 (read-only)"] l2["Layer 2 (read-only)"] l1["Layer 1 (read-only)"] con --> w --> l3 --> l2 --> l1
Dockerfile คืออะไร?
หัวข้อที่มีชื่อว่า “Dockerfile คืออะไร?”Dockerfile คือไฟล์ข้อความธรรมดาที่บรรจุชุดคำสั่ง (instruction) เพื่อบอก Docker ว่าจะ build image ขึ้นมาอย่างไร แต่ละ instruction จะกลายเป็น layer หนึ่งชั้น คุณรัน docker build เพื่อเปลี่ยน Dockerfile ให้เป็น image และรัน docker run เพื่อสตาร์ต container จาก image นั้น
นี่คือ Dockerfile ที่ง่ายที่สุดเท่าที่จะเป็นไปได้:
# syntax=docker/dockerfile:1FROM alpine:3.20CMD ["echo", "Hello, Docker!"]build และรัน:
docker build -t hello .docker run --rm helloผลลัพธ์ที่คาดหวัง:
Hello, Docker!โมดูลนี้ครอบคลุมเรื่องอะไรบ้าง
หัวข้อที่มีชื่อว่า “โมดูลนี้ครอบคลุมเรื่องอะไรบ้าง”| บทเรียน | สิ่งที่คุณจะได้เรียนรู้ |
|---|---|
| หน้านี้ | image กับ container, layer, การ build ครั้งแรก |
| Dockerfile basics | instruction หลัก: FROM, WORKDIR, COPY, RUN, ENV, EXPOSE |
| Build & tag | build context, -t name:tag, docker images, .dockerignore |
| Layers & cache | build cache ทำงานอย่างไร, การจัดลำดับ instruction ให้ build เร็ว |
| CMD vs ENTRYPOINT | exec form, shell form, default arguments, การ override |
ลงมือทำ: build ครั้งแรกของคุณ
หัวข้อที่มีชื่อว่า “ลงมือทำ: build ครั้งแรกของคุณ”วาง snippet ด้านล่างลงใน session ของ Play with Docker รันคำสั่งทั้งสองบรรทัด แล้วดู Docker build image เล็ก ๆ ขึ้นมาตั้งแต่ต้น
# syntax=docker/dockerfile:1
FROM alpine:3.20
CMD ["echo", "Hello, Docker!"]
# --- build & run ---
# docker build -t hello .
# docker run --rm hello