Best Practices และ Security
ทำ image/คอนเทนเนอร์ให้ปลอดภัยตามหลักที่ควรทำ
ปูพื้นฐาน: ความปลอดภัยเป็นเรื่องที่พลาดไม่ได้เลย หลายคนคิดว่าเอาแอปใส่ Docker แล้วแปลว่าปลอดภัย แต่ความจริงถ้าตั้งค่าไม่ดี แฮกเกอร์อาจจะเจาะผ่าน Container ทะลุเข้ามาพังระบบหลัก (Host) ของเราได้
ความปลอดภัย container เหมือนล็อกบ้านหลายชั้น — ไม่ให้ใครถือกุญแจ master (ไม่รันเป็น root), ตรวจของก่อนเข้า (สแกน image), และไม่เก็บของมีค่าไว้หน้าบ้าน (ไม่ฝัง secret ใน image)
เช็กลิสต์ที่ควรทำ
- อย่ารันเป็น root — ใส่
USERใน Dockerfile ให้รันด้วย user ธรรมดา ลดความเสียหายถ้าถูกเจาะ - pin เวอร์ชัน — ระบุ tag/digest ชัดเจน ไม่ใช้
latest(ทบทวนจากบท Registry) - อย่าฝัง secret ใน image — รหัสผ่าน/key ส่งผ่าน env หรือ secret ตอน run ไม่ใช่ COPY เข้า image
- สแกนช่องโหว่ — ใช้
docker scoutหรือ Trivy สแกน image ก่อน push - .dockerignore + image เล็ก — ลดของไม่จำเป็น = ลดผิวโจมตี
- ใช้ base image ทางการ/เชื่อถือได้ และอัปเดตสม่ำเสมอ
FROM node:20-alpine
WORKDIR /app
COPY --chown=node:node . .
RUN npm ci --omit=dev
USER node # สลับไปรันด้วย user "node" (ไม่ใช่ root)
CMD ["node", "server.js"]docker scout cves myapp:1.0 # เครื่องมือในตัว Docker
# หรือ Trivy (นิยมมาก, ฟรี)
trivy image myapp:1.0สรุป Key Takeaways
- อย่ารันเป็น root (ใส่ USER) · pin เวอร์ชัน · อย่าฝัง secret ใน image
- สแกนช่องโหว่ด้วย docker scout / Trivy ก่อน push
- secret ที่ COPY เข้า image ค้างใน layer เดิม ลบไม่ออก — ห้ามทำ
คำถามที่พบบ่อย
ทำไมไม่ควรรัน container เป็น root
ถ้า container ถูกเจาะ ผู้โจมตีได้ root ใน container ซึ่งลดระยะทางสู่การหลุดออกมาที่ host มาก — แก้ง่ายๆ ใน Dockerfile: สร้าง user แล้ว USER appuser ก่อน CMD — และเป็นเงื่อนไขที่ Pod Security Standard ระดับ restricted ของ K8s บังคับอยู่แล้ว
Secret เผลอ COPY เข้า image ไปแล้ว ลบใน layer ถัดไปพอไหม
ไม่พอ — layer เก่ายังเก็บไฟล์นั้นอยู่ ใครดึง image ไปแกะดูได้ — ถ้าหลุดไปแล้วให้ถือว่า secret รั่ว: revoke ทันที แล้วป้องกันด้วย .dockerignore, ส่ง secret ตอน build ด้วย --secret (BuildKit) หรือฉีดตอน runtime ผ่าน env/secret manager แทนการฝังใน image

