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 ได้ตามต้องการ