Home > Blog > tech

สอน Docker ฉบับสมบูรณ์ 2026: Container, Image, Compose ตั้งแต่เริ่มต้นจนถึง Production

Docker Container Guide 2026
2026-04-07 | tech | 3400 words

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

คุณสมบัติContainerVirtual Machine
ขนาดMBs (เล็ก)GBs (ใหญ่)
เวลาเริ่มวินาทีนาที
OSแชร์ Host KernelOS เต็มรูปแบบ
IsolationProcess-levelHardware-level
Performanceใกล้ Nativeมี Overhead
Densityรันได้หลายร้อยตัวรันได้ไม่กี่สิบตัว
เหมาะกับMicroservices, CI/CDFull OS Isolation
Key Insight: Container ไม่ได้แทนที่ VM แต่ทำงานร่วมกันได้ดี — หลายองค์กรรัน Container ภายใน VM เพื่อได้ทั้ง Hardware Isolation และ Application Packaging

การติดตั้ง 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
Best Practice: เรียง Dockerfile จาก layer ที่เปลี่ยนน้อยที่สุดไปมากที่สุด เพื่อใช้ Docker cache ได้มีประสิทธิภาพ

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 MountDevelopment (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)
overlayDocker 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

  1. อย่ารันเป็น root: ใช้ USER instruction ใน Dockerfile
  2. ใช้ Official Images: ดาวน์โหลดจาก Docker Official Images เท่านั้น
  3. อย่าเก็บ Secret ใน Image: ใช้ Environment Variables หรือ Docker Secrets
  4. Scan Image: ใช้ docker scout หรือ Trivy หา Vulnerabilities
  5. ใช้ .dockerignore: ไม่ Copy ไฟล์ที่ไม่จำเป็นเข้า Image
  6. Pin Base Image Version: ใช้ python:3.12-slim ไม่ใช่ python:latest
  7. ลดจำนวน Layers: รวม RUN commands ด้วย &&
  8. Read-only Filesystem: ใช้ --read-only flag
# ตัวอย่าง 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

FeatureDocker ComposeKubernetes
เหมาะกับDev, Small ProductionLarge-scale Production
Learning Curveง่ายยาก
Auto-scalingไม่มีมี (HPA)
Self-healingจำกัด (restart policy)เต็มรูปแบบ
Load Balancingต้องตั้งเอง (Nginx)Built-in (Service)
Multi-nodeไม่ได้ (เครื่องเดียว)ได้ (Cluster)
คำแนะนำ: เริ่มจาก Docker Compose สำหรับโปรเจกต์เล็ก-กลาง เมื่อ Scale ถึงจุดที่ต้องการ Auto-scaling, Self-healing, Multi-node ค่อยย้ายไป Kubernetes

คำสั่ง 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 วันนี้ — ติดตั้ง Docker Desktop แล้วลอง docker run hello-world เป็นก้าวแรกสู่โลกของ Containerization


Back to Blog | iCafe Forex | SiamLanCard | Siam2R