Docker คืออะไร?
แพลตฟอร์มสำหรับพัฒนาและรันแอปพลิเคชันใน containers — "works on my machine" จะไม่ใช่ปัญหาอีกต่อไป
Docker คืออะไร?
// ปัญหาที่ Docker แก้ได้ Developer A: "โค้ดรันได้บนเครื่องฉัน" Developer B: "แต่บนเครื่องฉันมัน error..." Server: "และบน production ก็พังอีกแบบ" // Docker: ทุกคนรันใน environment เดียวกัน ✓ [Your Code + Dependencies + Config] = Container Container รันเหมือนกันทุกที่ — Local, Staging, Production
แนวคิดหลักของ Docker
Image blueprint ของ container — อ่านอย่างเดียว สร้างได้หลาย container
Container instance ที่รันจาก image — มี state และ lifecycle ของตัวเอง
Dockerfile ไฟล์คำสั่งสำหรับ build image — เขียนครั้งเดียวใช้ได้ทุกที่
Registry ที่เก็บและแชร์ image เช่น Docker Hub, GitHub Container Registry
VM vs Container
// Virtual Machine — หนัก ช้า แต่ isolated เต็มที่ [ App ][ App ][ App ] [ Guest OS ][ Guest OS ][ Guest OS ] ← แต่ละ VM มี OS เป็นของตัวเอง [ Hypervisor ] [ Host OS ] [ Hardware ] // Container — เบา เร็ว share kernel กับ host [ App ][ App ][ App ] [ Container Runtime (Docker) ] ← share OS kernel [ Host OS ] [ Hardware ]
Dockerfile พื้นฐาน
# เลือก base image FROM node:20-alpine # กำหนด working directory ใน container WORKDIR /app # copy dependency files ก่อน (ใช้ cache layer ได้) COPY package*.json ./ # ติดตั้ง dependencies RUN npm install # copy source code ที่เหลือ COPY . . # build app RUN npm run build # เปิด port ที่ app ใช้ EXPOSE 3000 # คำสั่งรัน app CMD ["node", "dist/server.js"]
คำสั่ง Docker ที่ใช้บ่อย
# Build image จาก Dockerfile docker build -t my-app:1.0 . # รัน container จาก image docker run -p 3000:3000 my-app:1.0 # รัน background (detached mode) docker run -d -p 3000:3000 --name my-app my-app:1.0 # ดู container ที่กำลังรัน docker ps # ดู log ของ container docker logs my-app # เข้าไปใน container docker exec -it my-app sh # หยุดและลบ container docker stop my-app docker rm my-app
Docker Compose — รันหลาย container พร้อมกัน
# docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
depends_on:
- db
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
# รัน services ทั้งหมดด้วยคำสั่งเดียว docker compose up -d # หยุดทุก service docker compose down # ดู log ทุก service docker compose logs -f
Best Practices
1. ใช้ .dockerignore
ป้องกัน node_modules, .env และไฟล์ที่ไม่จำเป็นเข้าไปใน image
2. ใช้ Alpine base image
node:20-alpine เล็กกว่า node:20 หลายเท่า build เร็วกว่า deploy ไวกว่า
3. จัด COPY ให้ใช้ cache layer ได้
copy package.json ก่อน แล้ว RUN npm install ก่อน copy source code
4. ไม่รัน app ด้วย root user
สร้าง user ใน Dockerfile แล้ว USER นั้น เพื่อความปลอดภัย
Docker ในการทำงานจริง
Development ทีมทุกคน clone repo แล้ว docker compose up ได้เลย ไม่ต้องตั้งค่า local
CI/CD build image ใน pipeline ทดสอบใน container เดียวกับ production
Production deploy ด้วย Kubernetes หรือ Docker Swarm scale ได้ตามต้องการ