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

Images และ Dockerfile — ภาพรวมโมดูล

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
An image is a stack of read-only layers

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
A container adds a writable layer on top of the image

Dockerfile คือไฟล์ข้อความธรรมดาที่บรรจุชุดคำสั่ง (instruction) เพื่อบอก Docker ว่าจะ build image ขึ้นมาอย่างไร แต่ละ instruction จะกลายเป็น layer หนึ่งชั้น คุณรัน docker build เพื่อเปลี่ยน Dockerfile ให้เป็น image และรัน docker run เพื่อสตาร์ต container จาก image นั้น

นี่คือ Dockerfile ที่ง่ายที่สุดเท่าที่จะเป็นไปได้:

# syntax=docker/dockerfile:1
FROM alpine:3.20
CMD ["echo", "Hello, Docker!"]

build และรัน:

Terminal window
docker build -t hello .
docker run --rm hello

ผลลัพธ์ที่คาดหวัง:

Hello, Docker!
บทเรียนสิ่งที่คุณจะได้เรียนรู้
หน้านี้image กับ container, layer, การ build ครั้งแรก
Dockerfile basicsinstruction หลัก: FROM, WORKDIR, COPY, RUN, ENV, EXPOSE
Build & tagbuild context, -t name:tag, docker images, .dockerignore
Layers & cachebuild cache ทำงานอย่างไร, การจัดลำดับ instruction ให้ build เร็ว
CMD vs ENTRYPOINTexec form, shell form, default arguments, การ override

วาง 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
Docker image คืออะไร?
เกิดอะไรขึ้นกับ writable layer ของ container เมื่อ container หยุดทำงาน?
คำสั่งใดที่เปลี่ยน Dockerfile ให้เป็น image?