Containers and Amazon ECR
Container ทำให้ application และ dependencies ถูก package เป็น image เดียวกัน รันซ้ำได้ในเครื่อง dev, CI/CD และ AWS runtime platforms
Container vs Virtual Machine
Virtual Machine มี guest OS แยกชุด ส่วน Container แชร์ kernel ของ host แต่ isolate process, filesystem และ network namespace Container จึงเริ่มเร็วและเบากว่า แต่ยังต้องดูแล base image, patching และ runtime security
Dockerfile และ image build
Dockerfile คือ recipe สำหรับสร้าง image ควรเริ่มจาก base image ที่เชื่อถือได้, pin version, copy เฉพาะไฟล์จำเป็น, ใช้ non-root user เมื่อทำได้ และลด image size เพื่อลด attack surface
FROM public.ecr.aws/docker/library/node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
USER node
EXPOSE 3000
CMD ["node", "server.js"]
Amazon ECR
Amazon Elastic Container Registry หรือ ECR เป็น managed container registry สำหรับเก็บ Docker/OCI images ใช้ IAM ควบคุม push/pull, รองรับ lifecycle policies, image scanning, tag immutability และ replication ตาม use case
aws ecr create-repository --repository-name learning-web
aws ecr get-login-password --region ap-southeast-1 \
| docker login --username AWS --password-stdin ACCOUNT_ID.dkr.ecr.ap-southeast-1.amazonaws.com
docker build -t learning-web:1.0.0 .
docker tag learning-web:1.0.0 ACCOUNT_ID.dkr.ecr.ap-southeast-1.amazonaws.com/learning-web:1.0.0
docker push ACCOUNT_ID.dkr.ecr.ap-southeast-1.amazonaws.com/learning-web:1.0.0
Tagging strategy
- ใช้ immutable release tag เช่น Git SHA หรือ semantic version
- หลีกเลี่ยง deploy ด้วย
latestใน production เพราะ rollback และ audit ยาก - ใช้ ECR lifecycle policy เพื่อลบ old untagged images
- เปิด image scanning เพื่อเห็น vulnerability ก่อน deploy
Common mistakes
- ใส่ secret ลง image layer เช่น
.envหรือ private key - ใช้ base image ใหญ่และไม่ patch นานจนมี CVE สะสม
- ไม่กำหนด health check หรือ signal handling ทำให้ container shutdown ไม่เรียบร้อย
Review questions
- Container ต่างจาก VM อย่างไร?
- ทำไม production ไม่ควรพึ่ง tag
latest? - ECR lifecycle policy ช่วยลดปัญหาอะไร?