เริ่มต้นใช้ Docker บน VPS สำหรับคนที่ยังไม่เคยลอง
Docker เปลี่ยนวิธีที่นักพัฒนารัน software บนเซิร์ฟเวอร์ไปโดยสิ้นเชิง แทนที่จะติดตั้ง software ลงบน OS ตรง ๆ คุณรันมันใน container ที่แยกออกจากระบบ บทความนี้อธิบายว่า Docker คืออะไรและใช้อย่างไรบน VPS
Docker คืออะไร และต่างจาก VM อย่างไร
VM (Virtual Machine) จำลอง hardware ทั้งหมดรวมถึง OS ทำให้หนักและเริ่มช้า Docker ใช้แค่ OS kernel ของ host และ isolate เฉพาะ process ทำให้เบากว่ามากและเริ่มเร็วภายในวินาที
- Image — template สำหรับสร้าง container (เหมือน ISO)
- Container — instance ที่รันจาก image (เหมือน VM ที่รันอยู่)
- Dockerfile — สคริปต์สำหรับสร้าง image
- Docker Hub — registry สำหรับเก็บและแชร์ image
ติดตั้ง Docker บน Ubuntu/Debian
curl -fsSL https://get.docker.com | sh
usermod -aG docker $USER # เพิ่ม user ให้รัน docker ได้โดยไม่ต้อง sudo
newgrp docker
ตรวจสอบการติดตั้ง:
docker run hello-world
คำสั่ง Docker พื้นฐาน
# รัน container จาก image
docker run -d -p 80:80 nginx
# ดู container ที่กำลังรัน
docker ps
# ดู log ของ container
docker logs container_id
# หยุด container
docker stop container_id
# ลบ container
docker rm container_id
# ดู image ที่มีอยู่
docker images
# ลบ image
docker rmi image_name
Docker Compose: รันหลาย Container พร้อมกัน
แอปส่วนใหญ่ต้องการหลาย service พร้อมกัน เช่น web server + database + cache Docker Compose ช่วยจัดการด้วย file เดียว
ตัวอย่าง docker-compose.yml สำหรับ WordPress:
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: wordpress
volumes:
- db_data:/var/lib/mysql
wordpress:
image: wordpress:latest
ports:
- "80:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: rootpass
depends_on:
- db
volumes:
db_data:
docker compose up -d # รันทุก service แบบ background
docker compose down # หยุดและลบ container ทั้งหมด
Volume: เก็บข้อมูลไม่ให้หายเมื่อ Container ถูกลบ
ข้อมูลใน container จะหายทันทีเมื่อลบ container ต้อง mount volume เพื่อเก็บข้อมูลถาวร:
# Mount directory จาก host
docker run -v /host/path:/container/path nginx
# ใช้ named volume (Docker จัดการเอง)
docker run -v mydata:/app/data nginx
ข้อควรระวังบน VPS
- Docker daemon ต้องการสิทธิ์ root ผู้ใช้ที่อยู่ใน group
dockerมีสิทธิ์เทียบเท่า root - Port ที่ expose ออกมาจาก container จะผ่าน Docker firewall ไม่ผ่าน UFW ต้องระวังเรื่อง security
- ตั้ง log rotation ไม่งั้น log container จะกิน disk เต็มได้
สรุป
Docker ทำให้การ deploy แอปพลิเคชันบน VPS ง่ายและ reproducible ขึ้นมาก environment ที่รันบน local machine จะทำงานเหมือนกันบน production server ลง Docker แล้วลอง run nginx หรือ WordPress ด้วย Compose ดูก่อน จะเห็นภาพทันที
ตรวจสอบว่า Docker ทำงานถูกต้อง
# ตรวจ Docker daemon
systemctl status docker
# ดู container ที่รันอยู่
docker ps
# ดู resource usage ทุก container
docker stats --no-stream
# ตรวจ disk ที่ Docker ใช้
docker system df
docker system prune เป็นประจำเพื่อลบ unused container, network และ image ที่ไม่ได้ใช้แล้ว ป้องกัน disk เต็มจาก Docker layersแก้ปัญหาที่พบบ่อย
Error: "Got permission denied while trying to connect to Docker daemon"
User ยังไม่ได้อยู่ใน docker group:
# เพิ่ม user เข้า docker group
usermod -aG docker $USER
# Logout แล้ว login ใหม่ หรือรัน
newgrp docker
# ทดสอบ
docker ps
Error: "port is already allocated" ตอน docker run
Port นั้น service อื่นใช้อยู่แล้ว:
# ดูว่า port ไหนถูกใช้อยู่
ss -tlnp | grep :80
# หรือ
lsof -i :80
# หยุด service ที่ขัดแย้ง
systemctl stop nginx
# หรือเปลี่ยน port ที่ Docker publish
docker run -p 8080:80 nginx # ใช้ port 8080 แทน
Container restart loop — status "Restarting"
# ดู log ของ container ที่ crash
docker logs container_name --tail=50
docker logs container_name --since 5m
# ดู exit code
docker inspect container_name | grep ExitCode
Docker compose ขึ้น error "yaml: line X: did not find expected key"
YAML indentation ผิด ต้องใช้ space ไม่ใช่ tab:
# ตรวจ yaml syntax
docker compose config
# ถ้าถูกต้องจะแสดง config ที่ parse แล้ว
Log ของ container กิน disk เต็ม
ตั้ง log limit ใน docker-compose.yml:
services:
myapp:
image: myapp:latest
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
คำถามที่พบบ่อย
Docker ต้องการ RAM เพิ่มขึ้นเท่าไร?
Docker daemon เองกิน RAM ประมาณ 100–200 MB แต่ละ container ขึ้นอยู่กับ app ที่รัน เช่น Nginx container กิน 10–30 MB, MySQL กิน 200–500 MB ควรมี RAM เหลือเผื่อไว้อย่างน้อย 500 MB
Docker กับ VPS spec ต่ำใช้ได้ไหม?
ได้ Docker เบากว่า VM มาก แต่ถ้า container หลายตัวรันพร้อมกันใช้ RAM รวมกัน VPS 1 GB RAM รัน 2–3 container เล็กๆ ได้สบาย แต่ถ้ารัน database + web + cache พร้อมกัน ควรมี RAM 2 GB+
ข้อมูลใน Docker volume จะหายไหมถ้า update image?
ไม่หาย Volume แยกจาก container lifecycle การ docker compose pull และ up -d จะ recreate container แต่ volume ที่ mount ไว้ยังคงอยู่ครบ