Image, Dockerfile และ Registry
สร้างกล่องด้วย Dockerfile เก็บ/แชร์กล่องผ่าน registry
ปูพื้นฐาน: การจะสร้าง Container ขึ้นมาสักอัน เราต้องมี "สูตร" เขียนบอกไว้ก่อนว่าแอปของเราใช้อะไรบ้าง จากนั้นนำสูตรนั้นไปสร้างเป็น "แม่พิมพ์" และเก็บไว้ใน "คลัง" เพื่อให้ดึงไปใช้เมื่อไหร่ก็ได้
Dockerfile เหมือนสูตรอาหาร (บอกขั้นตอนทำทีละสเต็ป) · Image คืออาหารที่ทำเสร็จแช่แข็งไว้ · Registry คือตู้แช่กลาง (เช่น Docker Hub) ที่ใครก็มาหยิบ image ไปอุ่นรันต่อได้
Dockerfile — สูตรสร้าง image
Dockerfile คือไฟล์ข้อความที่บอกว่าจะประกอบ image ยังไง แต่ละบรรทัดสร้าง layer หนึ่งชั้น (Docker แคช layer ไว้ ทำให้ build ครั้งถัดไปเร็วขึ้น)
# 1) เริ่มจาก image ฐานที่มี Node.js ติดตั้งอยู่แล้ว
FROM node:20-alpine
# 2) กำหนดโฟลเดอร์ทำงานภายใน container
WORKDIR /app
# 3) ก๊อปไฟล์ dependency แล้วติดตั้ง (แยกชั้นไว้เพื่อใช้แคช)
COPY package*.json ./
RUN npm install
# 4) ก๊อปโค้ดที่เหลือเข้าไป
COPY . .
# 5) บอกว่าแอปเปิดพอร์ตไหน
EXPOSE 3000
# 6) คำสั่งที่รันตอน container เริ่มทำงาน
CMD ["node", "server.js"]วงจรการทำงานพื้นฐาน
# สร้าง image จาก Dockerfile แล้วตั้งชื่อ (tag)
docker build -t myapp:1.0 .
# ส่งขึ้น registry กลางให้คนอื่น/เซิร์ฟเวอร์ดึงไปใช้ได้
docker push myregistry/myapp:1.0
# บนเครื่องอื่น: ดึง image ลงมา
docker pull myregistry/myapp:1.0
# รัน container จาก image (map พอร์ต 8080 ของเครื่อง → 3000 ในกล่อง)
docker run -p 8080:3000 myapp:1.0สรุป Key Takeaways
- Dockerfile = สูตร, Image = ผลลัพธ์แช่แข็ง, Registry = ตู้แช่กลางไว้แชร์
- แต่ละบรรทัดใน Dockerfile = 1 layer ที่ถูกแคชเพื่อ build เร็วขึ้น
- วงจร: build → push → pull → run
- ตั้ง tag เวอร์ชันชัดเจน อย่าพึ่ง latest ใน production
คำถามที่พบบ่อย
Image กับ container ความสัมพันธ์คืออะไร
Image = แม่พิมพ์ (read-only, สร้างครั้งเดียว) ส่วน container = ตัวจริงที่รันจาก image (มี layer เขียนได้ของตัวเอง) — image เดียว spin เป็น container กี่ตัวก็ได้ เหมือน class กับ object ในโปรแกรมมิ่ง
ทำไม image ถึงเป็น layer ซ้อนกัน
แต่ละคำสั่งใน Dockerfile สร้าง layer ใหม่ — ข้อดีคือ layer ถูกแชร์และแคชได้: image สิบตัวที่ base เดียวกันเก็บ base แค่ชุดเดียว และ build ซ้ำเร็วเพราะ layer ที่ไม่เปลี่ยนถูก reuse — นี่คือเหตุผลที่ลำดับคำสั่งใน Dockerfile มีผลต่อความเร็ว build มาก
Registry สาธารณะกับส่วนตัวเลือกใช้ยังไง
Docker Hub เหมาะกับ image สาธารณะ/ทดลอง ส่วนงานองค์กรใช้ private registry (ECR, GHCR, Harbor) เพื่อคุมสิทธิ์ สแกนช่องโหว่ และไม่ติด rate limit — image ภายในบริษัทไม่ควรอยู่ registry สาธารณะแม้จะตั้ง private repo ก็ควรอยู่ใต้ IAM ขององค์กร

