ติดตั้ง Portainer จัดการ Docker ด้วย Web UI บน VPS

Portainer CE (Community Edition) คือ Web UI สำหรับจัดการ Docker ที่ได้รับความนิยมสูงสุด ช่วยให้คุณดู, สร้าง, หยุด, ลบ Container, Image, Volume และ Network ผ่านหน้าเว็บแทนการพิมพ์ command line เหมาะสำหรับทั้งมือใหม่ที่เริ่มเรียน Docker และทีมที่ต้องการ Dashboard จัดการ Production

Portainer คืออะไร และทำงานอย่างไร

Portainer CE ทำงานโดยการ Mount Docker Socket (/var/run/docker.sock) เข้ามาภายใน Container ของตัวเอง ซึ่งทำให้ Portainer มีสิทธิ์เรียก Docker API ได้เต็มรูปแบบ — สร้าง ลบ หรือแก้ไข Container ได้เหมือนกับการพิมพ์คำสั่งใน Terminal โดยตรง แต่ผ่าน Interface ที่ใช้งานง่ายกว่ามาก

สถาปัตยกรรมของ Portainer แบ่งเป็น 2 ส่วนหลัก ได้แก่ Portainer Server ซึ่งเป็น Web UI และ API Backend ที่เราติดตั้งลงไป และ Portainer Agent ที่ใช้เชื่อมต่อไปยัง Docker Host ระยะไกลหรือ Cluster เพิ่มเติม สำหรับ VPS เดี่ยวที่ไม่ได้ใช้ Swarm หรือ Kubernetes ติดตั้งเพียง Portainer Server ก็เพียงพอ

ทำไมต้องใช้ Portainer

ข้อกำหนด: ต้องติดตั้ง Docker Engine ก่อน ถ้ายังไม่มีให้รัน curl -fsSL https://get.docker.com | sh ก่อนเริ่มขั้นตอนนี้

ติดตั้ง Portainer CE

ขั้นที่ 1: สร้าง Docker Volume สำหรับเก็บข้อมูล

docker volume create portainer_data

ขั้นที่ 2: Run Portainer Container

docker run -d \
  -p 8000:8000 \
  -p 9443:9443 \
  --name portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

คำสั่งนี้ทำงานในพื้นหลัง (-d) เปิด Port 9443 สำหรับ HTTPS Web UI และ Mount Docker Socket เพื่อให้ Portainer ควบคุม Docker ได้

ขั้นที่ 3: ตรวจสอบว่า Container ทำงาน

docker ps | grep portainer

ขั้นที่ 4: เข้าถึง Web UI

เปิดเบราว์เซอร์ไปที่ https://YOUR_VPS_IP:9443 ครั้งแรกจะขอสร้าง Admin Password ตั้งรหัสผ่านที่แข็งแรงอย่างน้อย 12 ตัวอักษร

ความปลอดภัย: ไม่ควร Expose Port 9443 สาธารณะโดยตรง ควรตั้ง Nginx Reverse Proxy + Let's Encrypt Certificate หรือใช้ร่วมกับ Cloudflare Tunnel เพื่อซ่อน Port จาก Public Internet

ตั้งค่า Nginx Reverse Proxy สำหรับ Portainer

sudo nano /etc/nginx/sites-available/portainer
server {
    listen 80;
    server_name portainer.yourdomain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name portainer.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/portainer.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/portainer.yourdomain.com/privkey.pem;

    location / {
        proxy_pass https://localhost:9443;
        proxy_ssl_verify off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
sudo ln -s /etc/nginx/sites-available/portainer /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

คำถามที่พบบ่อยเกี่ยวกับ Portainer บน VPS

Portainer CE ใช้ฟรีตลอดไหม?

ใช่ Portainer Community Edition (CE) ใช้งานได้ฟรีตลอดไม่มีค่าใช้จ่าย รองรับ Docker Node ได้ไม่จำกัดจำนวน ถ้าต้องการฟีเจอร์เพิ่มเติมเช่น Role-Based Access Control ขั้นสูงหรือ Kubernetes Cluster Management เต็มรูปแบบ สามารถอัปเกรดเป็น Portainer Business Edition ได้

Portainer ต่างจาก Docker Desktop อย่างไร?

Docker Desktop ออกแบบมาสำหรับนักพัฒนาที่ใช้ macOS หรือ Windows บนเครื่องท้องถิ่น ส่วน Portainer CE ออกแบบมาสำหรับจัดการ Docker บน Server หรือ VPS ที่ไม่มี GUI โดยเฉพาะ ข้อดีของ Portainer คือทีมงานทุกคนสามารถเข้าถึงและจัดการ Container ผ่านเบราว์เซอร์จากที่ไหนก็ได้โดยไม่ต้อง SSH

ถ้า Portainer เกิดปัญหา Container อื่นจะพังด้วยไหม?

ไม่ Portainer เป็นแค่ Web UI ที่ต่อกับ Docker API การที่ Portainer หยุดทำงานหรือ Restart ไม่กระทบ Container อื่นบนเครื่องแต่อย่างใด Docker Engine ยังรันต่อไปตามปกติ เพียงแต่คุณจะไม่สามารถจัดการ Container ผ่าน Web UI ได้ชั่วคราวจนกว่า Portainer จะกลับมาทำงาน

Portainer รองรับ HTTPS แบบไม่ต้องตั้ง Reverse Proxy ได้ไหม?

รองรับ Port 9443 คือ HTTPS อยู่แล้วโดยใช้ Self-Signed Certificate ที่สร้างอัตโนมัติตอนติดตั้ง แต่ Browser จะแสดงคำเตือน "Connection Not Secure" เพราะไม่ใช่ Certificate จากองค์กรที่เชื่อถือได้ การตั้ง Nginx Reverse Proxy พร้อม Let's Encrypt Certificate แก้ปัญหานี้ได้และทำให้ทีมงานเข้าใช้ได้สะดวกขึ้น

ข้อกำหนดขั้นต่ำและ VPS ที่เหมาะสม

ก่อนติดตั้ง Portainer ควรตรวจสอบว่า VPS ของคุณมีทรัพยากรเพียงพอ รวมถึงระบบปฏิบัติการและ Kernel ที่รองรับ Docker:

ข้อกำหนดขั้นต่ำแนะนำ
RAM512 MB (Docker + Portainer)1 GB ขึ้นไป (รวม Application)
CPU1 vCore2 vCore ขึ้นไป
Disk10 GB20 GB ขึ้นไป (เผื่อ Image และ Volume)
OSUbuntu 20.04 / Debian 11Ubuntu 22.04 LTS หรือใหม่กว่า
KernelLinux Kernel 3.10+Kernel 5.x+ (รองรับ cgroup v2)

VPS ของ AsiaGB ทุกแผนใช้ Linux KVM Virtualization จึงรองรับ Docker ได้เต็มรูปแบบ ไม่มีข้อจำกัดด้าน Kernel Module เหมือน OpenVZ บางเจ้า

ฟีเจอร์หลักที่ใช้บ่อยใน Portainer

จัดการ Container

ไปที่ Containers → เห็น List ของทุก Container พร้อมสถานะ Running/Stopped สามารถ Start, Stop, Restart, Remove และดู Log หรือ Exec เข้าไปใน Shell ได้ในคลิกเดียว

Deploy Stack (docker-compose)

ไปที่ Stacks → Add Stack → วาง docker-compose.yml → คลิก Deploy ระบบจะ Pull Image และ Create Container ตามที่กำหนดไว้

version: '3'
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html

ดู Resource Usage

คลิกที่ Container ใดก็ได้ → Stats → ดู CPU%, Memory Usage, Network I/O, Disk I/O แบบ Real-time เหมาะสำหรับ Debug Performance

เปรียบเทียบ Portainer CE กับการใช้ Docker Command Line

งานDocker CLIPortainer Web UI
ดูรายการ Containerdocker ps -aคลิก Containers ในเมนู
ดู Logdocker logs -f containerคลิก Container → Logs
หยุด Containerdocker stop containerคลิกปุ่ม Stop สีแดง
Deploy Stackdocker compose up -dStacks → Add Stack → วาง YAML
ดู CPU/RAMdocker statsคลิก Container → Stats (Graph)
Pull Imagedocker pull image:tagImages → Pull → พิมพ์ชื่อ Image

สำหรับผู้ที่คุ้นเคยกับ Command Line อยู่แล้ว Portainer ไม่ได้แทนที่ทุกอย่าง แต่เพิ่ม Visibility และลด Error จาก Typo ได้มาก โดยเฉพาะเมื่อทำงานเป็นทีมหรือต้องมอบหมายงานให้คนที่ไม่คุ้นเคย Linux

การรักษาความปลอดภัย Portainer บน VPS

เนื่องจาก Portainer มีสิทธิ์ควบคุม Docker ทั้งหมดบนเซิร์ฟเวอร์ การรักษาความปลอดภัยจึงเป็นสิ่งสำคัญมาก ควรปฏิบัติตามแนวทางต่อไปนี้:

ตรวจสอบ Docker Socket Permission

# ตรวจว่า Docker Socket มีสิทธิ์อ่าน/เขียนถูกต้อง
ls -la /var/run/docker.sock

# ผลที่ถูกต้อง
# srw-rw---- 1 root docker 0 ... /var/run/docker.sock

# เพิ่ม User เข้า docker group (ไม่ต้องใช้ sudo ทุกครั้ง)
sudo usermod -aG docker $USER
newgrp docker

การ Backup และ Restore ข้อมูล Portainer

ข้อมูลการตั้งค่า Portainer ทั้งหมด (User, Environment, Stack configuration) ถูกเก็บใน Docker Volume ชื่อ portainer_data การ Backup ทำได้ง่ายด้วยคำสั่งต่อไปนี้:

Backup portainer_data

# หยุด Portainer ก่อน Backup เพื่อความปลอดภัยของข้อมูล
docker stop portainer

# Export Volume เป็นไฟล์ tar.gz
docker run --rm \
  -v portainer_data:/data \
  -v $(pwd):/backup \
  alpine tar czf /backup/portainer_backup_$(date +%Y%m%d).tar.gz -C /data .

# เปิด Portainer กลับมา
docker start portainer

Restore portainer_data

# สร้าง Volume ใหม่ (ถ้ายังไม่มี)
docker volume create portainer_data

# Restore จากไฟล์ Backup
docker run --rm \
  -v portainer_data:/data \
  -v $(pwd):/backup \
  alpine sh -c "cd /data && tar xzf /backup/portainer_backup_YYYYMMDD.tar.gz"

แนะนำ: ตั้ง Cron Job ให้รัน Backup อัตโนมัติทุกสัปดาห์ และ Upload ไฟล์ Backup ไปเก็บไว้นอกเซิร์ฟเวอร์ เช่น Object Storage หรือ Google Drive เพื่อป้องกันข้อมูลสูญหาย

การใช้งาน Portainer ร่วมกับ Docker Compose และ Stack

หนึ่งในฟีเจอร์ที่ทรงพลังที่สุดของ Portainer คือ Stacks ซึ่งช่วยให้คุณนำไฟล์ docker-compose.yml มา Deploy ผ่าน Web UI ได้โดยไม่ต้องพิมพ์คำสั่งใน Terminal เลยสักบรรทัด เหมาะมากสำหรับสถานการณ์ที่ต้องการให้สมาชิกในทีมที่ไม่คุ้นเคย Linux สามารถ Deploy แอปพลิเคชันได้เอง

ขั้นตอน Deploy Stack ใน Portainer

  1. Login เข้า Portainer Web UI
  2. ในเมนูซ้าย คลิก Stacks
  3. คลิก Add stack ที่มุมบนขวา
  4. ตั้งชื่อ Stack เช่น wordpress-stack
  5. วาง Content ของ docker-compose.yml ในช่อง Web Editor
  6. ถ้ามี Environment Variable ที่ต้องใช้ ให้ใส่ใน Environment Variables section
  7. คลิก Deploy the stack

Portainer จะ Pull Image ที่จำเป็น สร้าง Network และ Volume อัตโนมัติ แล้วเปิด Container ขึ้นมาตามที่กำหนดในไฟล์ คุณสามารถดูสถานะ Stack, Redeploy เมื่อ Image มี Version ใหม่ หรือลบ Stack ทั้งหมดได้จากหน้าจอเดียว

ตัวอย่าง Stack สำหรับ WordPress

version: '3.8'
services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: strongpassword
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp_data:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: strongpassword
      MYSQL_ROOT_PASSWORD: rootpassword
    volumes:
      - db_data:/var/lib/mysql

volumes:
  wp_data:
  db_data:

Monitoring และ Alert สำหรับ Container บน Portainer

Portainer CE มี Stats Dashboard ในตัวสำหรับดู Metrics แบบ Real-time แต่ถ้าต้องการ Alert เมื่อ Container หยุดทำงานหรือ Resource เกินขีดจำกัด แนะนำให้ใช้ร่วมกับเครื่องมือเพิ่มเติม:

ทั้งหมดนี้ Deploy ผ่าน Portainer Stacks ได้เลย ทำให้การจัดการระบบ Monitoring รวมอยู่ในที่เดียวโดยไม่ต้องออกไป SSH ทุกครั้ง

อัปเดต Portainer เป็น Version ใหม่

# หยุดและลบ Container เดิม
docker stop portainer
docker rm portainer

# Pull Image ใหม่
docker pull portainer/portainer-ce:latest

# Run ใหม่ (Volume ยังเก็บข้อมูลไว้)
docker run -d \
  -p 8000:8000 \
  -p 9443:9443 \
  --name portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

ต้องการ VPS รัน Docker และ Portainer?

VPS Linux Ubuntu เริ่มต้น 500 บาท/เดือน Full Root Access พร้อมรัน Docker, Portainer และทุก Container Stack ที่ต้องการ

ดูแพ็กเกจ VPS