ติดตั้ง Docker บน VPS Ubuntu

📋 สารบัญ

Docker คืออะไร และทำไมถึงต้องใช้บน VPS

Docker คือเทคโนโลยี Container ที่ช่วยให้คุณรันแอปพลิเคชันในสภาพแวดล้อมที่แยกออกจากกัน (Isolated Environment) โดยไม่ต้องกังวลเรื่อง dependency ขัดแย้งกัน แต่ละ Container ประกอบด้วยโค้ด, runtime, libraries และการตั้งค่าทั้งหมดที่แอปพลิเคชันต้องการ

เปรียบเทียบ Docker กับ Virtual Machine:

คุณสมบัติDocker ContainerVirtual Machine
ขนาดเบา (MB)หนัก (GB)
เวลาเปิดวินาทีนาที
การแชร์ทรัพยากรKernel ร่วมKernel แยก
IsolationProcess-levelHardware-level
Overheadต่ำมากสูง
Portabilityสูงมากปานกลาง

Docker เหมาะกับ VPS เพราะใช้ทรัพยากรน้อย ทำให้คุณรันแอปพลิเคชันหลายตัวบน VPS เดียวได้อย่างมีประสิทธิภาพ

ความต้องการระบบก่อนติดตั้ง Docker

ก่อนเริ่มติดตั้ง ตรวจสอบให้ครบ:

💡 หมายเหตุ: VPS ของ AsiaGB ที่มี RAM 2GB ขึ้นไปรองรับ Docker ได้เต็มที่ รัน Container ได้หลายตัวพร้อมกันโดยไม่มีปัญหา

ติดตั้ง Docker บน Ubuntu 22.04/24.04

ทำตามขั้นตอนนี้ทีละขั้น:

ขั้นที่ 1: อัปเดต package list

sudo apt update && sudo apt upgrade -y

ขั้นที่ 2: ติดตั้ง dependencies

sudo apt install -y ca-certificates curl gnupg lsb-release

ขั้นที่ 3: เพิ่ม 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
sudo chmod a+r /etc/apt/keyrings/docker.gpg

ขั้นที่ 4: เพิ่ม 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
sudo apt update

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

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

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

sudo docker run hello-world

ถ้าเห็น Hello from Docker! แสดงว่าติดตั้งสำเร็จ

ขั้นที่ 7: ใช้ Docker โดยไม่ต้อง sudo (แนะนำ)

sudo usermod -aG docker $USER
newgrp docker

คำสั่ง Docker พื้นฐานที่ต้องรู้

คำสั่งที่ใช้บ่อยที่สุด:

จัดการ Image

# ดาวน์โหลด image
docker pull nginx

# แสดงรายการ images ทั้งหมด
docker images

# ลบ image
docker rmi nginx

จัดการ Container

# รัน container
docker run -d -p 80:80 --name my-nginx nginx

# แสดง container ที่กำลังรัน
docker ps

# แสดง container ทั้งหมด (รวม stopped)
docker ps -a

# หยุด / เริ่ม / ลบ container
docker stop my-nginx
docker start my-nginx
docker rm my-nginx

ดู Logs และเข้า Shell

# ดู logs
docker logs my-nginx
docker logs -f my-nginx   # follow mode

# เข้า bash ใน container
docker exec -it my-nginx bash

ติดตั้งและใช้ Docker Compose

Docker Compose ช่วยจัดการหลาย Container พร้อมกันด้วยไฟล์ YAML ไฟล์เดียว

ตรวจสอบว่าติดตั้งแล้วหรือยัง:

docker compose version

ตัวอย่าง docker-compose.yml สำหรับ WordPress:

version: '3.8'
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppass
    volumes:
      - db_data:/var/lib/mysql

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

volumes:
  db_data:
  wp_data:

รัน Compose:

docker compose up -d

รัน Container แรกของคุณ — ตัวอย่างจริง

ลองรัน Nginx เป็น web server:

# รัน Nginx บน port 8080
docker run -d   --name my-web   -p 8080:80   -v /var/www/html:/usr/share/nginx/html:ro   nginx

# ทดสอบ
curl http://localhost:8080
🔥 เคล็ดลับ: ใช้ flag --restart unless-stopped เพื่อให้ Container เริ่มใหม่อัตโนมัติเมื่อ VPS รีบูต เช่น docker run -d --restart unless-stopped nginx

จัดการ Port, Volume และ Network

Port Mapping

# format: -p HOST_PORT:CONTAINER_PORT
docker run -d -p 3000:3000 my-app    # map port 3000
docker run -d -p 127.0.0.1:5432:5432 postgres  # bind เฉพาะ localhost

Volume (เก็บข้อมูลถาวร)

# Named volume
docker volume create my-data
docker run -d -v my-data:/data my-app

# Bind mount (ผูกกับ folder บน host)
docker run -d -v /home/ubuntu/data:/data my-app

# แสดง volumes
docker volume ls

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

Network

# สร้าง network
docker network create my-network

# รัน container ใน network เดียวกัน
docker run -d --network my-network --name app1 my-app
docker run -d --network my-network --name app2 my-app
# app1 เรียก app2 ได้ด้วยชื่อ: http://app2:PORT

ตั้งค่าความปลอดภัยสำหรับ Docker

Docker มาพร้อม default ที่ค่อนข้างเปิดกว้าง ควรทำสิ่งเหล่านี้:

⚠️ ระวัง UFW + Docker: Docker แก้ iptables โดยตรง ทำให้ UFW rules ไม่มีผลกับ published ports ควรใช้ -p 127.0.0.1:PORT:PORT เพื่อ bind เฉพาะ localhost แล้วให้ Nginx reverse proxy จัดการ

แก้ปัญหาที่พบบ่อย

Docker daemon ไม่เริ่ม

sudo systemctl status docker
sudo systemctl start docker
sudo systemctl enable docker

Permission denied

sudo usermod -aG docker $USER
# logout แล้ว login ใหม่

Port already in use

sudo lsof -i :80        # ดูว่าอะไรใช้ port 80
docker ps               # ดู container ที่ใช้ port นั้น
docker stop CONTAINER_NAME

Disk เต็มจาก Docker

docker system prune -a   # ลบทุกอย่างที่ไม่ใช้
docker images prune      # ลบเฉพาะ images
docker volume prune      # ลบ volumes ที่ไม่ใช้

สรุป — Docker บน VPS Ubuntu

Docker ทำให้การ deploy แอปพลิเคชันบน VPS ง่าย ยืดหยุ่น และมีประสิทธิภาพมากขึ้น ขั้นตอนหลักคือ: ติดตั้ง Docker Engine → เพิ่ม user เข้า docker group → ใช้ docker run รัน Container → ใช้ Docker Compose สำหรับ multi-container → ตั้งค่าความปลอดภัยเพิ่มเติม

VPS ของ AsiaGB พร้อมรองรับ Docker ทุก plan ด้วย SSD storage ที่รวดเร็วและ Uptime 99% สำหรับงาน production จริง

คำถามที่พบบ่อย

Q: Docker กับ Docker Desktop ต่างกันอย่างไร?
Docker Desktop เป็น GUI สำหรับ macOS/Windows มี Docker Engine ในตัว ส่วน Docker Engine (Docker CE) บน Linux Server ไม่มี GUI เหมาะกับ VPS และ Server ใช้ command line เท่านั้น
Q: VPS RAM 1GB ใช้ Docker ได้ไหม?
ได้ แต่จำกัด สามารถรัน Container เบาๆ ได้ 2-3 ตัว ถ้าต้องการรัน WordPress หรือ database แนะนำ RAM 2GB ขึ้นไปเพื่อประสิทธิภาพที่ดี
Q: Container ต่างจาก Virtual Machine อย่างไร?
Container แชร์ OS Kernel กับ Host ทำให้เบาและเริ่มได้เร็ว VM มี OS แยกสมบูรณ์ Isolation สูงกว่าแต่กินทรัพยากรมากกว่า Docker Container เหมาะกับแอปพลิเคชันทั่วไปที่ต้องการ portability สูง
Q: ข้อมูลใน Container หายเมื่อลบ Container จริงไหม?
ใช่ ข้อมูลใน Container layer หายเมื่อลบ ต้องใช้ Volume หรือ Bind Mount เพื่อเก็บข้อมูลถาวร เช่น -v /host/path:/container/path หรือ Named Volume
Q: Docker Compose คืออะไร จำเป็นต้องติดตั้งแยกไหม?
Docker Compose เป็นเครื่องมือจัดการหลาย Container ด้วยไฟล์ YAML ปัจจุบัน Docker CE เวอร์ชันใหม่รวม Docker Compose Plugin มาด้วยแล้ว ใช้คำสั่ง docker compose ได้เลย
Q: ควรใช้ Docker กับ Nginx reverse proxy อย่างไร?
แนะนำ bind Container ไปที่ localhost (-p 127.0.0.1:PORT:PORT) แล้วตั้ง Nginx เป็น reverse proxy จาก port 80/443 ไปยัง localhost:PORT วิธีนี้ปลอดภัยและรองรับ SSL/TLS ผ่าน Let's Encrypt ได้