ข้ามไปเนื้อหาหลัก
คอนเทนเนอร์· ~14 นาที· อัปเดตล่าสุด

Image, Dockerfile และ Registry

สร้างกล่องด้วย Dockerfile เก็บ/แชร์กล่องผ่าน registry

ปูพื้นฐาน: การจะสร้าง Container ขึ้นมาสักอัน เราต้องมี "สูตร" เขียนบอกไว้ก่อนว่าแอปของเราใช้อะไรบ้าง จากนั้นนำสูตรนั้นไปสร้างเป็น "แม่พิมพ์" และเก็บไว้ใน "คลัง" เพื่อให้ดึงไปใช้เมื่อไหร่ก็ได้

Dockerfile คือสูตรอาหาร

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"]
Dockerfile ของเว็บแอป Node.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
build → push → pull → run

สรุป 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 ขององค์กร

อ่านจบแล้วอย่าลืมทำเครื่องหมาย