Docker เป็นเทคโนโลยี Container ที่เปลี่ยนวิธีการพัฒนา ทดสอบ และ Deploy แอปพลิเคชันอย่างสิ้นเชิง ในปี 2026 Docker ไม่ใช่แค่เครื่องมือเสริมอีกต่อไป แต่เป็นทักษะพื้นฐานที่นักพัฒนาและ DevOps Engineer ทุกคนต้องรู้
บทความนี้จะพาคุณเรียนรู้ Docker ตั้งแต่ศูนย์จนถึงการใช้งานจริงใน Production ครอบคลุม Container, Image, Dockerfile, Docker Compose, Volume, Network และ Best Practices ที่จะทำให้คุณใช้ Docker ได้อย่างมืออาชีพ
Docker คืออะไร?
Docker คือแพลตฟอร์มสำหรับสร้าง รัน และจัดการ Container ซึ่งเป็นหน่วยมาตรฐานของซอฟต์แวร์ที่ Pack โค้ด Dependencies และ Configuration ทั้งหมดไว้ด้วยกัน ทำให้แอปพลิเคชันทำงานได้เหมือนกันทุกที่ ไม่ว่าจะเป็นเครื่อง Dev, Staging หรือ Production
คิดง่ายๆ ว่า Container เหมือน "กล่อง" ที่บรรจุทุกสิ่งที่แอปต้องการไว้แล้ว ย้ายไปรันที่ไหนก็ทำงานได้ทันที ไม่มีปัญหา "Works on my machine" อีกต่อไป
Container vs Virtual Machine
| คุณสมบัติ | Container | Virtual Machine |
|---|---|---|
| ขนาด | MBs (เล็ก) | GBs (ใหญ่) |
| เวลาเริ่ม | วินาที | นาที |
| OS | แชร์ Host Kernel | OS เต็มรูปแบบ |
| Isolation | Process-level | Hardware-level |
| Performance | ใกล้ Native | มี Overhead |
| Density | รันได้หลายร้อยตัว | รันได้ไม่กี่สิบตัว |
| เหมาะกับ | Microservices, CI/CD | Full OS Isolation |
การติดตั้ง Docker
Windows / Mac
# ดาวน์โหลด Docker Desktop จาก docker.com
# ติดตั้งแล้วรีสตาร์ทเครื่อง
# ตรวจสอบ
docker --version
docker compose version
Linux (Ubuntu/Debian)
# ลบ Docker เก่า (ถ้ามี)
sudo apt-get remove docker docker-engine docker.io containerd runc
# ติดตั้ง prerequisites
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
# เพิ่ม Docker GPG key
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# เพิ่ม Docker repository
echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# ติดตั้ง Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
# เพิ่ม user เข้ากลุ่ม docker (ไม่ต้องใช้ sudo)
sudo usermod -aG docker $USER
# ตรวจสอบ
docker run hello-world
Docker Image คืออะไร?
Image คือ Template แบบ Read-only ที่ใช้สร้าง Container เปรียบเสมือน "พิมพ์เขียว" ที่บอกว่า Container ต้องมีอะไรบ้าง — OS base, libraries, source code, environment variables ทั้งหมด
คำสั่งจัดการ Image
# ดาวน์โหลด Image จาก Docker Hub
docker pull nginx
docker pull python:3.12-slim
docker pull node:20-alpine
# ดู Images ที่มี
docker images
docker image ls
# ลบ Image
docker rmi nginx
docker image prune # ลบ Image ที่ไม่ได้ใช้
Docker Container — พื้นฐาน
รัน Container แรก
# รัน Nginx web server
docker run -d --name my-nginx -p 8080:80 nginx
# -d = detached (รัน background)
# --name = ตั้งชื่อ
# -p 8080:80 = map port 8080 บนเครื่องไปที่ port 80 ใน container
# เปิดเบราว์เซอร์ http://localhost:8080 จะเห็นหน้า Nginx
จัดการ Container
# ดู Container ที่กำลังรัน
docker ps
# ดูทั้งหมด (รวมที่หยุดแล้ว)
docker ps -a
# หยุด Container
docker stop my-nginx
# เริ่มใหม่
docker start my-nginx
# รีสตาร์ท
docker restart my-nginx
# ลบ Container
docker rm my-nginx # ต้องหยุดก่อน
docker rm -f my-nginx # บังคับลบ
# ดู Logs
docker logs my-nginx
docker logs -f my-nginx # follow (real-time)
# เข้าไปใน Container
docker exec -it my-nginx bash
docker exec -it my-nginx sh # ถ้าไม่มี bash
Dockerfile — สร้าง Image ของตัวเอง
Dockerfile คือไฟล์ที่กำหนดขั้นตอนการสร้าง Image เป็นเหมือน "สูตรอาหาร" ที่บอก Docker ว่าต้องทำอะไรบ้าง
ตัวอย่าง Dockerfile สำหรับ Python App
# ใช้ Python base image
FROM python:3.12-slim
# ตั้ง working directory
WORKDIR /app
# Copy requirements แยก (ใช้ Docker cache)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy source code
COPY . .
# Expose port
EXPOSE 8000
# คำสั่งรัน app
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
ตัวอย่าง Dockerfile สำหรับ Node.js
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Build Image
# สร้าง Image
docker build -t my-app:1.0 .
# สร้างแบบ multi-platform
docker buildx build --platform linux/amd64,linux/arm64 \
-t my-app:1.0 .
# ดู Image ที่สร้าง
docker images | grep my-app
Docker Compose — จัดการหลาย Container
Docker Compose ใช้จัดการหลาย Container พร้อมกัน ด้วยไฟล์ compose.yaml (หรือ docker-compose.yml) เหมาะสำหรับ Development Environment และ Multi-container Applications
ตัวอย่าง: Web App + Database + Redis
# compose.yaml
services:
web:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
- REDIS_URL=redis://redis:6379
depends_on:
- db
- redis
volumes:
- ./src:/app/src # mount source code
restart: unless-stopped
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
คำสั่ง Docker Compose
# เริ่มทุก service
docker compose up -d
# ดู status
docker compose ps
# ดู logs
docker compose logs -f web
# หยุดทั้งหมด
docker compose down
# หยุดพร้อมลบ volumes
docker compose down -v
# สร้าง image ใหม่แล้วเริ่ม
docker compose up -d --build
Docker Volume — จัดเก็บข้อมูลถาวร
Container เป็น Ephemeral (ข้อมูลหายเมื่อลบ) Volume ช่วยให้ข้อมูลอยู่ถาวร:
# สร้าง Named Volume
docker volume create my-data
# ใช้ Volume กับ Container
docker run -d -v my-data:/app/data my-app
# Bind Mount (mount folder จากเครื่อง Host)
docker run -d -v $(pwd)/data:/app/data my-app
# ดู Volumes
docker volume ls
# ลบ Volumes ที่ไม่ได้ใช้
docker volume prune
เปรียบเทียบ Volume Types
| Type | ใช้เมื่อ | ตัวอย่าง |
|---|---|---|
| Named Volume | เก็บข้อมูล Production (DB, uploads) | -v pgdata:/var/lib/postgresql/data |
| Bind Mount | Development (mount source code) | -v ./src:/app/src |
| tmpfs Mount | ข้อมูลชั่วคราว (sensitive data) | --tmpfs /tmp |
Docker Network — การสื่อสารระหว่าง Container
# สร้าง Network
docker network create my-network
# รัน Container ใน Network เดียวกัน
docker run -d --name app --network my-network my-app
docker run -d --name db --network my-network postgres
# Container สามารถติดต่อกันได้ด้วยชื่อ
# จาก app: สามารถเชื่อมต่อ db ด้วย hostname "db"
# ดู Networks
docker network ls
# ดูรายละเอียด Network
docker network inspect my-network
Network Drivers
| Driver | ใช้เมื่อ |
|---|---|
bridge (default) | Container บนเครื่องเดียวกัน คุยกัน |
host | ใช้ Network ของ Host โดยตรง (performance) |
overlay | Docker Swarm — ข้ามเครื่อง |
none | ไม่มี network (isolated) |
Multi-stage Build — ลดขนาด Image
Multi-stage Build ช่วยสร้าง Image ขนาดเล็กโดย Build ใน Stage หนึ่งแล้ว Copy เฉพาะ Output ไป Production Stage:
# Stage 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage 2: Production
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
# Image จาก ~500MB เหลือ ~30MB
ตัวอย่าง Go Application
# Build stage
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.* ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o /server
# Production stage
FROM scratch
COPY --from=builder /server /server
EXPOSE 8080
ENTRYPOINT ["/server"]
# Image เหลือแค่ ~10MB!
Docker Security Best Practices
- อย่ารันเป็น root: ใช้
USERinstruction ใน Dockerfile - ใช้ Official Images: ดาวน์โหลดจาก Docker Official Images เท่านั้น
- อย่าเก็บ Secret ใน Image: ใช้ Environment Variables หรือ Docker Secrets
- Scan Image: ใช้
docker scoutหรือ Trivy หา Vulnerabilities - ใช้ .dockerignore: ไม่ Copy ไฟล์ที่ไม่จำเป็นเข้า Image
- Pin Base Image Version: ใช้
python:3.12-slimไม่ใช่python:latest - ลดจำนวน Layers: รวม RUN commands ด้วย
&& - Read-only Filesystem: ใช้
--read-onlyflag
# ตัวอย่าง Dockerfile ที่ปลอดภัย
FROM python:3.12-slim
# สร้าง non-root user
RUN groupadd -r appuser && useradd -r -g appuser appuser
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY --chown=appuser:appuser . .
# รันเป็น non-root user
USER appuser
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Docker ใน Production
Docker + Nginx Reverse Proxy
# compose.yaml สำหรับ Production
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./certs:/etc/ssl/certs:ro
depends_on:
- app
restart: always
app:
build: .
expose:
- "8000"
environment:
- DATABASE_URL=${DATABASE_URL}
restart: always
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
Resource Limits
# จำกัด Memory และ CPU
docker run -d \
--memory=512m \
--cpus=1.0 \
--name my-app \
my-app:1.0
Docker Registry — เก็บและแชร์ Image
# Login เข้า Docker Hub
docker login
# Tag Image
docker tag my-app:1.0 username/my-app:1.0
# Push ไป Docker Hub
docker push username/my-app:1.0
# Pull กลับมา
docker pull username/my-app:1.0
# ใช้ Private Registry
docker tag my-app:1.0 registry.example.com/my-app:1.0
docker push registry.example.com/my-app:1.0
การ Debug Container
# ดู Logs
docker logs -f --tail 100 container_name
# เข้าไปใน Container
docker exec -it container_name bash
# ดู Resource Usage
docker stats
# ดู Processes ใน Container
docker top container_name
# ตรวจสอบ Container
docker inspect container_name
# ดู Events
docker events --since 1h
Docker กับ CI/CD
GitHub Actions ตัวอย่าง
# .github/workflows/deploy.yml
name: Build and Deploy
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build Docker image
run: docker build -t my-app:${{ github.sha }} .
- name: Run tests
run: docker run my-app:${{ github.sha }} pytest
- name: Push to registry
run: |
docker tag my-app:${{ github.sha }} \
ghcr.io/${{ github.repository }}:latest
docker push ghcr.io/${{ github.repository }}:latest
Kubernetes vs Docker Compose
| Feature | Docker Compose | Kubernetes |
|---|---|---|
| เหมาะกับ | Dev, Small Production | Large-scale Production |
| Learning Curve | ง่าย | ยาก |
| Auto-scaling | ไม่มี | มี (HPA) |
| Self-healing | จำกัด (restart policy) | เต็มรูปแบบ |
| Load Balancing | ต้องตั้งเอง (Nginx) | Built-in (Service) |
| Multi-node | ไม่ได้ (เครื่องเดียว) | ได้ (Cluster) |
คำสั่ง Docker ที่ใช้บ่อย (Cheatsheet)
| คำสั่ง | หน้าที่ |
|---|---|
docker run -d -p 80:80 nginx | รัน Container แบบ Detached |
docker ps -a | ดู Container ทั้งหมด |
docker logs -f name | ดู Logs แบบ Real-time |
docker exec -it name bash | เข้าไปใน Container |
docker build -t img . | Build Image จาก Dockerfile |
docker compose up -d | เริ่มทุก Service |
docker compose down | หยุดทุก Service |
docker system prune -a | ลบทุกอย่างที่ไม่ได้ใช้ |
docker stats | ดู Resource Usage |
docker inspect name | ดูรายละเอียด Container |
สรุป
Docker เป็นเครื่องมือที่ทรงพลังและจำเป็นสำหรับนักพัฒนาในปี 2026 ไม่ว่าจะเป็น Backend Developer, Frontend Developer, DevOps Engineer หรือ Data Engineer การเข้าใจ Docker จะช่วยให้คุณทำงานได้มีประสิทธิภาพมากขึ้น Deploy ได้เร็วขึ้น และลดปัญหา "Works on my machine" ได้อย่างสิ้นเชิง
สิ่งที่ได้เรียนรู้ในบทความนี้:
- Docker คืออะไร และ Container vs VM
- การติดตั้ง Docker บน Windows, Mac, Linux
- Image, Container — คำสั่งพื้นฐาน
- Dockerfile — สร้าง Image ของตัวเอง
- Docker Compose — จัดการหลาย Container
- Volume, Network — Data Persistence และ Communication
- Multi-stage Build — ลดขนาด Image
- Security Best Practices
- Docker ใน Production + CI/CD
- Kubernetes vs Docker Compose
เริ่มต้นใช้ Docker วันนี้ — ติดตั้ง Docker Desktop แล้วลอง docker run hello-world เป็นก้าวแรกสู่โลกของ Containerization
