Docker บน VPS คืออะไร ติดตั้งและใช้งานเบื้องต้นอย่างไร

ถ้าคุณเพิ่งได้ VPS มาใหม่หรือกำลังมองหาวิธีจัดการแอปพลิเคชันหลายตัวบน Server เดียวให้เป็นระเบียบและง่ายต่อการดูแล Docker คือเครื่องมือที่คุณต้องรู้จัก บทความนี้จะพาคุณตั้งแต่ทำความเข้าใจ Docker คืออะไร ไปจนถึงติดตั้งและรันแอปพลิเคชันแรกบน VPS ของคุณได้จริง

Docker คืออะไร

Docker เป็นแพลตฟอร์มสำหรับพัฒนา ส่งมอบ และรันแอปพลิเคชันใน Container ซึ่งเป็นหน่วยที่บรรจุทุกอย่างที่แอปต้องการไว้ด้วยกัน ทั้ง Code, Runtime, Libraries และ Configuration โดยไม่ขึ้นกับสภาพแวดล้อมของ Server

Container ต่างจาก Virtual Machine (VM) อย่างไร

คนมักสับสนระหว่าง Container กับ VM แต่ทั้งสองทำงานต่างกันโดยสิ้นเชิง

ตัวอย่างเปรียบเทียบ: ถ้า VM คือบ้านแต่ละหลังที่มีทุกอย่างครบ Container คือห้องในอพาร์ตเมนต์ที่ใช้โครงสร้างอาคาร (Kernel) ร่วมกัน แต่ห้องแต่ละห้องก็มีความเป็นส่วนตัวและเอกเทศของตัวเอง

สรุปสั้นๆ: Docker Container ใช้ทรัพยากรน้อยกว่า VM 5–10 เท่า เริ่มต้นเร็วกว่า และ Deploy ง่ายกว่า เหมาะมากสำหรับใช้งานบน VPS ที่ RAM จำกัด

ทำไมถึงนิยมใช้ Docker กับ VPS

Docker ได้รับความนิยมอย่างมากในหมู่ผู้ใช้ VPS ด้วยเหตุผลหลักดังนี้

ข้อกำหนดก่อนติดตั้ง Docker

ก่อนติดตั้ง Docker ให้ตรวจสอบว่า VPS ของคุณตรงตามเงื่อนไขเหล่านี้

เชื่อมต่อ VPS ผ่าน SSH ก่อน ถ้ายังไม่รู้วิธี อ่านบทความ วิธีเชื่อมต่อ VPS ด้วย SSH ก่อน

ขั้นตอนติดตั้ง Docker บน Ubuntu

วิธีที่แนะนำคือติดตั้งจาก Official Repository ของ Docker ซึ่งจะได้ Version ล่าสุดเสมอ

ขั้นที่ 1: อัปเดตระบบและติดตั้ง Dependencies

apt update && apt upgrade -y
apt install -y ca-certificates curl gnupg lsb-release

ขั้นที่ 2: เพิ่ม Docker GPG Key และ Repository

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null

apt update

ขั้นที่ 3: ติดตั้ง Docker Engine

apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

ขั้นที่ 4: ตรวจสอบการติดตั้ง

docker --version
# ควรเห็น: Docker version 26.x.x, build xxxxxxx

docker run hello-world
# ควรเห็น: Hello from Docker!

ขั้นที่ 5 (ไม่บังคับ): ใช้ Docker โดยไม่ต้อง sudo

ถ้าคุณทำงานด้วย User ที่ไม่ใช่ root ให้เพิ่ม User ของคุณเข้า docker group

usermod -aG docker $USER
# Log out แล้ว Log in ใหม่เพื่อให้มีผล

คำสั่ง Docker พื้นฐาน

เมื่อติดตั้ง Docker เสร็จแล้ว มาทำความรู้จักคำสั่งที่ใช้บ่อยที่สุด

docker pull — ดาวน์โหลด Image

docker pull nginx          # ดาวน์โหลด Nginx Image ล่าสุด
docker pull nginx:1.25     # ดาวน์โหลด Nginx เวอร์ชันที่ระบุ
docker pull ubuntu:22.04   # ดาวน์โหลด Ubuntu 22.04 Image

docker run — รัน Container

docker run nginx                          # รัน Nginx (Foreground)
docker run -d nginx                       # รันแบบ Background (Detached)
docker run -d -p 80:80 --name web nginx   # Map Port 80 ตั้งชื่อ Container ว่า "web"
docker run -d -p 8080:80 nginx            # Map Port Host 8080 → Container 80

docker ps — ดู Container ที่กำลังรัน

docker ps           # แสดง Container ที่กำลัง Run อยู่
docker ps -a        # แสดงทุก Container รวมที่หยุดแล้ว

docker stop และ docker rm — หยุดและลบ Container

docker stop web     # หยุด Container ชื่อ "web"
docker stop abc123  # หยุดด้วย Container ID
docker rm web       # ลบ Container ที่หยุดแล้ว
docker rm -f web    # บังคับลบแม้กำลังรันอยู่

คำสั่งอื่นที่ควรรู้

docker images           # ดูรายการ Image ทั้งหมด
docker rmi nginx        # ลบ Image
docker logs web         # ดู Log ของ Container
docker exec -it web bash  # เข้า Shell ใน Container ที่กำลังรัน

Docker Compose คืออะไร และติดตั้งอย่างไร

Docker Compose เป็นเครื่องมือสำหรับกำหนดและรันแอปพลิเคชันที่ประกอบด้วย Container หลายตัวพร้อมกัน โดยใช้ไฟล์ docker-compose.yml เป็นตัวกำหนดค่า แทนที่จะต้องพิมพ์คำสั่ง docker run ยาวๆ หลายครั้ง

ถ้าคุณติดตั้ง Docker ตามขั้นตอนข้างต้น (ด้วย docker-compose-plugin) คุณจะสามารถใช้งาน Compose ได้ทันทีผ่านคำสั่ง

docker compose version
# Docker Compose version v2.x.x

หมายเหตุ: Docker Compose รุ่นใหม่ (v2) ใช้คำสั่ง docker compose (มีช่องว่าง) ส่วนรุ่นเก่า (v1) ใช้ docker-compose (มีขีด) ในบทความนี้ใช้ v2

ตัวอย่าง: รัน WordPress + MySQL ด้วย Docker Compose

นี่คือตัวอย่างที่ใช้งานได้จริง สำหรับการรัน WordPress พร้อม MySQL บน VPS โดยไม่ต้องติดตั้ง Apache หรือ PHP เองเลย

สร้างโฟลเดอร์และไฟล์ docker-compose.yml

mkdir ~/wordpress && cd ~/wordpress
nano docker-compose.yml

เนื้อหาไฟล์ docker-compose.yml

services:
  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: your_wp_password
    volumes:
      - db_data:/var/lib/mysql

  wordpress:
    image: wordpress:latest
    restart: always
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: your_wp_password
    volumes:
      - wp_data:/var/www/html
    depends_on:
      - db

volumes:
  db_data:
  wp_data:

รัน WordPress Stack

docker compose up -d
# Docker จะดาวน์โหลด Image และสร้าง Container ให้อัตโนมัติ

docker compose ps
# ตรวจสอบว่า Container ทั้งสองรันอยู่

# เปิด Browser ไปที่ http://YOUR_VPS_IP:8080
# จะเห็นหน้าติดตั้ง WordPress

คำสั่ง Docker Compose ที่ใช้บ่อย

docker compose up -d        # รันทุก Service แบบ Background
docker compose down         # หยุดและลบ Container ทั้งหมด
docker compose down -v      # หยุด + ลบ Volume ด้วย (ข้อมูลจะหาย!)
docker compose logs -f      # ดู Log แบบ Real-time
docker compose restart      # Restart ทุก Service
docker compose ps           # ดูสถานะ Service

Docker Network และ Volume: พื้นฐานที่ต้องรู้

เมื่อรัน Container หลายตัวบน VPS คุณต้องเข้าใจสองแนวคิดสำคัญ ได้แก่ Docker Network (การสื่อสารระหว่าง Container) และ Docker Volume (การเก็บข้อมูลถาวร) เพราะ Container โดยธรรมชาตินั้น Stateless — ข้อมูลใน Container จะหายทันทีเมื่อลบ Container

Docker Network

โดย Default Docker มี Network อยู่ 3 ประเภทหลัก

เมื่อใช้ Docker Compose ระบบจะสร้าง Custom Bridge Network ให้อัตโนมัติ ทำให้ Container ในกลุ่มเดียวกันเรียกกันได้ด้วย Service Name เช่น Container WordPress เรียก MySQL ด้วย hostname db ได้เลย

# สร้าง Network เอง
docker network create mynetwork

# รัน Container ใน Network ที่กำหนด
docker run -d --name app --network mynetwork nginx

# ดู Network ทั้งหมด
docker network ls

# ดูรายละเอียด Network
docker network inspect mynetwork

Docker Volume: เก็บข้อมูลให้อยู่รอด

Docker Volume คือพื้นที่จัดเก็บข้อมูลที่แยกออกมาจาก Container ข้อมูลใน Volume จะยังคงอยู่แม้จะลบ Container ไปแล้ว ซึ่งสำคัญมากสำหรับ Database, ไฟล์ Upload และ Configuration สำคัญ

# สร้าง Volume
docker volume create mydata

# ดู Volume ทั้งหมด
docker volume ls

# Mount Volume เมื่อรัน Container
docker run -d -v mydata:/var/lib/mysql mysql:8.0

# ลบ Volume (ระวัง! ข้อมูลจะหาย)
docker volume rm mydata

# ลบ Volume ที่ไม่ใช้แล้ว
docker volume prune

กฎทอง: ข้อมูลสำคัญทุกอย่าง ทั้ง Database, ไฟล์ที่ผู้ใช้อัพโหลด และ Configuration ต้องเก็บใน Volume เสมอ ห้ามเก็บไว้ใน Container เพราะจะหายเมื่อลบหรือ Recreate Container

การจัดการ Multi-Container Stack บน VPS ด้วย Docker Compose

ในการใช้งานจริงบน VPS ส่วนใหญ่คุณจะต้องรัน Container หลายตัวพร้อมกัน เช่น Web Server + Database + Cache + Reverse Proxy บทความนี้มีตัวอย่าง Stack ที่พร้อมใช้งานจริง

ตัวอย่าง: Nginx + PHP-FPM + MySQL + Redis Stack

Stack นี้เหมาะกับแอปพลิเคชัน PHP สมัยใหม่ที่ต้องการ Performance สูงและ Cache ด้วย Redis

services:
  nginx:
    image: nginx:1.25-alpine
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./app:/var/www/html
      - ./ssl:/etc/ssl/certs
    depends_on:
      - php

  php:
    image: php:8.3-fpm-alpine
    restart: always
    volumes:
      - ./app:/var/www/html
    depends_on:
      - mysql
      - redis

  mysql:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: strong_root_pw_here
      MYSQL_DATABASE: appdb
      MYSQL_USER: appuser
      MYSQL_PASSWORD: strong_app_pw_here
    volumes:
      - db_data:/var/lib/mysql
    ports:
      - "127.0.0.1:3306:3306"

  redis:
    image: redis:7-alpine
    restart: always
    volumes:
      - redis_data:/data
    ports:
      - "127.0.0.1:6379:6379"

volumes:
  db_data:
  redis_data:

สังเกตว่า MySQL และ Redis ผูก Port กับ 127.0.0.1 เท่านั้น ทำให้เข้าถึงได้เฉพาะบน VPS เท่านั้น ไม่เปิด Public — เป็น Best Practice ด้าน Security ที่สำคัญมาก

รัน Stack และตรวจสอบ

# รัน Stack ทั้งหมด
docker compose up -d

# ดูสถานะทุก Service
docker compose ps

# ดู Log แบบ Real-time
docker compose logs -f

# Restart Service ที่มีปัญหา
docker compose restart php

# อัพเดต Image ทั้งหมดเป็น Version ล่าสุด
docker compose pull && docker compose up -d

การ Backup และ Restore Docker Data บน VPS

แม้ Docker Volume จะปลอดภัยกว่าการเก็บข้อมูลใน Container แต่ก็ต้องมีแผน Backup ที่ดีด้วย เพราะข้อมูลบน Volume ยังอยู่บน Disk เดียวกับ VPS ถ้า VPS มีปัญหา ข้อมูลก็หายได้

Backup Database จาก Container

# Backup MySQL Database
docker exec mysql_container mysqldump -u root -p'strong_root_pw_here' appdb > backup_$(date +%Y%m%d).sql

# Backup ทุก Database
docker exec mysql_container mysqldump -u root -p'strong_root_pw_here' --all-databases > all_backup.sql

# Restore Database
docker exec -i mysql_container mysql -u root -p'strong_root_pw_here' appdb < backup_20260608.sql

Backup Docker Volume ทั้งหมด

# Backup Volume โดยใช้ Container ชั่วคราว
docker run --rm \
  -v db_data:/source:ro \
  -v $(pwd):/backup \
  alpine tar czf /backup/db_data_backup.tar.gz -C /source .

# Restore Volume จาก Backup
docker run --rm \
  -v db_data:/target \
  -v $(pwd):/backup \
  alpine tar xzf /backup/db_data_backup.tar.gz -C /target

Automated Daily Backup ด้วย Cron

เพิ่ม Cron Job บน VPS เพื่อ Backup อัตโนมัติทุกวัน

# รัน crontab -e แล้วเพิ่มบรรทัดนี้
# Backup ทุกวันเวลาตี 2 และเก็บไว้ 7 วัน
0 2 * * * docker exec mysql_container mysqldump -u root -p'PWD' appdb > /backups/db_$(date +\%Y\%m\%d).sql && find /backups -name "db_*.sql" -mtime +7 -delete

คำแนะนำ: Backup ที่ดีควรเก็บไว้หลายที่ เช่น บน VPS, ดาวน์โหลดไปเก็บบน Cloud Storage (Google Drive, Dropbox) หรืออีก Server หนึ่งเสมอ Backup บนเครื่องเดียวกันนับเป็น Backup เดียว ไม่ใช่ Redundancy

ข้อดีของ Docker บน VPS เทียบกับการติดตั้งตรงๆ

หลายคนสงสัยว่าจะใช้ Docker แทนการ Install Apache/PHP/MySQL โดยตรงไปเลยดีไหม ลองเปรียบเทียบกัน

การติดตั้งตรงๆ (Bare-metal Install)

การใช้ Docker

คำแนะนำ: ถ้าคุณวางแผนจะรันหลายแอปบน VPS เดียว หรือต้องการ Deploy บ่อยๆ Docker คุ้มค่ากว่าการ Install ตรงๆ อย่างมาก แต่ถ้าต้องการแค่เว็บไซต์ WordPress ตัวเดียว การใช้ LAMP Stack ปกติก็ยังเป็นตัวเลือกที่ดี

เคล็ดลับความปลอดภัยสำหรับ Docker บน VPS

พร้อมรัน Docker บน VPS ของคุณแล้วหรือยัง?

AsiaGB VPS Linux เริ่มต้น 500 บาท/เดือน RAM 1 GB ขึ้นไป Full Root Access รองรับ Docker ทุกแพ็กเกจ ดาต้าเซ็นเตอร์ไทย และ สิงคโปร์

ดู VPS AsiaGB