Docker เป็นเครื่องมือที่ทรงพลังแต่การจัดการผ่าน command line อย่างเดียวอาจไม่เหมาะสำหรับทุกคนในทีม โดยเฉพาะ developer ที่ต้องการ deploy application หรือ QA ที่ต้องการดู log ของ container การจำคำสั่ง docker compose, docker logs, docker exec ทุกครั้งเป็นอุปสรรคที่ไม่จำเป็น Portainer คือ solution ที่ให้ web-based management UI สำหรับ Docker ที่สวยงาม ใช้งานง่าย และฟรีครับ
Portainer Community Edition ให้คุณจัดการ Docker containers, images, volumes, networks ทั้งหมดผ่าน browser deploy application ด้วย Docker Compose stack, monitor resource usage, ดู container logs แบบ real-time และจัดการ multiple Docker hosts จากที่เดียว บทความนี้จะพาคุณติดตั้ง Portainer ตั้งแต่เริ่มต้นจนถึงการใช้งานในระดับ production ครับ
Portainer เป็น lightweight container management platform ที่ทำงานเป็น Docker container ตัวมันเอง กิน resource น้อยมาก RAM แค่ 50-100MB เชื่อมต่อกับ Docker socket หรือ Docker API เพื่อจัดการ container ทั้งหมด รองรับ Docker standalone, Docker Swarm และ Kubernetes ครับ
จุดเด่นของ Portainer เมื่อเทียบกับ CLI คือทุกคนในทีมเข้าถึงได้ผ่าน browser ไม่ต้อง SSH เข้า server มี visual interface ที่เข้าใจง่าย มี role-based access control ให้ developer จัดการได้เฉพาะ container ของตัวเอง มี audit log ว่าใครทำอะไรเมื่อไหร่ และมี template สำเร็จรูปสำหรับ deploy application ยอดนิยมได้ด้วยคลิกเดียว
เมื่อเทียบกับ Yacht ที่เป็น Docker UI อีกตัว Portainer มี feature ครบกว่ามาก รองรับ Swarm และ K8s มี template และ stack management ส่วน Cockpit ที่เราเคยพูดถึงมี container module แต่ไม่ได้ออกแบบมาสำหรับ container management โดยเฉพาะ สำหรับ Kubernetes scale ใหญ่ Rancher เป็นตัวเลือกที่ดีกว่า แต่สำหรับ Docker standalone Portainer ดีที่สุดครับ
# ติดตั้ง Docker (ถ้ายังไม่มี) curl -fsSL https://get.docker.com | sudo sh sudo usermod -aG docker $USER # สร้าง volume สำหรับ Portainer data docker volume create portainer_data # ติดตั้ง Portainer CE docker run -d \ --name portainer \ --restart=always \ -p 8000:8000 \ -p 9443:9443 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latest # ตรวจสอบ docker ps | grep portainer # portainer/portainer-ce:latest ... Up 5 seconds
เปิด browser ไปที่ https://YOUR_SERVER_IP:9443 จะเห็นหน้า setup ให้สร้าง admin account ใส่ username และ password ที่ต้องการ จากนั้นเลือก environment type เป็น Docker แล้วคลิก Connect Portainer จะเชื่อมต่อกับ Docker socket อัตโนมัติ เข้า dashboard ได้เลยครับ
# docker-compose.yml
version: "3.8"
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: always
ports:
- "8000:8000"
- "9443:9443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
environment:
- TZ=Asia/Bangkok
security_opt:
- no-new-privileges:true
volumes:
portainer_data:
driver: local
docker compose up -d docker compose logs -f portainer
หลังจาก login เข้า Portainer จะเห็น Dashboard ที่แสดงภาพรวมของ Docker environment ทั้ง running containers, images, volumes, networks ครบทุกอย่าง สามารถคลิกเข้าไปจัดการแต่ละส่วนได้ทันที
ไปที่เมนู Containers จะเห็นรายการ container ทั้งหมดพร้อมสถานะ สามารถ start, stop, restart, kill, remove container ได้ด้วยคลิกเดียว คลิกที่ชื่อ container เพื่อดูรายละเอียด resource usage, environment variables, mounted volumes, network settings ทุกอย่างที่ docker inspect แสดงได้ Portainer แสดงให้ในรูปแบบที่อ่านง่ายกว่ามากครับ
# ผ่าน Portainer UI: # 1. คลิก "Add container" # 2. กรอก Name: my-nginx # 3. กรอก Image: nginx:alpine # 4. Port mapping: 8080 -> 80 # 5. Volume: /data/nginx -> /usr/share/nginx/html # 6. Restart policy: Always # 7. คลิก "Deploy the container" # เทียบเท่ากับ CLI: docker run -d \ --name my-nginx \ --restart=always \ -p 8080:80 \ -v /data/nginx:/usr/share/nginx/html \ nginx:alpine
คลิก Console ใน container detail เพื่อเปิด terminal ใน browser เลือก shell ที่ต้องการ (/bin/bash หรือ /bin/sh) แล้วใช้งานได้เลย ไม่ต้อง SSH เข้า server แล้ว docker exec เอง สะดวกมากสำหรับ debug production issues ครับ
Stacks เป็น feature ที่ทรงพลังที่สุดของ Portainer ให้คุณ deploy Docker Compose file ผ่าน web UI ไม่ต้อง SSH เข้า server ไม่ต้อง copy file ไปวาง แค่ paste docker-compose.yml แล้วคลิก Deploy
# ตัวอย่าง Stack: WordPress + MariaDB
# วาง YAML นี้ใน Portainer Stack editor
version: "3.8"
services:
wordpress:
image: wordpress:latest
restart: always
ports:
- "8888:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wp_user
WORDPRESS_DB_PASSWORD: WpP@ss2026
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
depends_on:
- db
db:
image: mariadb:11
restart: always
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wp_user
MYSQL_PASSWORD: WpP@ss2026
MYSQL_ROOT_PASSWORD: R00tP@ss2026
volumes:
- db_data:/var/lib/mysql
volumes:
wp_data:
db_data:
หลังจาก deploy stack คุณจะเห็นทุก container ของ stack นั้นจัดกลุ่มรวมกัน สามารถ start/stop ทั้ง stack ได้ด้วยคลิกเดียว update stack ด้วยการแก้ YAML แล้วคลิก Update ง่ายมากครับ ยังรองรับ Git repository integration ดึง docker-compose.yml จาก Git repo แล้ว auto-deploy เมื่อมี push ใหม่ได้ด้วย
Portainer มี App Templates สำเร็จรูปให้ deploy application ยอดนิยมได้ด้วยคลิกเดียว เช่น WordPress, PostgreSQL, Redis, Nginx, MariaDB, MongoDB, Elasticsearch, GitLab CE, Grafana, Prometheus และอีกหลายสิบ application คลิกเลือก template กรอก parameters แล้ว Deploy ได้เลย
# สร้าง Custom App Template
# ไปที่ Settings > App Templates
# เพิ่ม URL ของ template file:
# https://raw.githubusercontent.com/your-org/templates/main/templates.json
# ตัวอย่าง template JSON
{
"version": "2"
"templates": [
{
"type": 3
"title": "SiamCafe Blog Stack"
"description": "Full blog stack with Nginx + PHP + SQLite"
"categories": ["webserver"]
"platform": "linux"
"repository": {
"url": "https://github.com/siamcafe/blog-stack"
"stackfile": "docker-compose.yml"
}
}
]
}
Custom templates เป็นวิธีที่ดีที่สุดในการ standardize deployment ในองค์กร สร้าง template สำหรับ application stack ที่ใช้บ่อย developer คลิก deploy ได้เลยโดยไม่ต้องเขียน docker-compose.yml เอง ลดความผิดพลาดและ ensure consistency ครับ
Portainer สามารถจัดการ Docker หลาย host จากที่เดียว ต่อ development server, staging server และ production server ทั้งหมดใน Portainer เดียว สลับ environment ได้ด้วยคลิกเดียว
# วิธีที่ 1: Portainer Agent (แนะนำ) # ติดตั้ง Agent บน remote host docker run -d \ --name portainer_agent \ --restart=always \ -p 9001:9001 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /var/lib/docker/volumes:/var/lib/docker/volumes \ portainer/agent:latest # จากนั้นใน Portainer UI: # Settings > Environments > Add environment # เลือก Agent แล้วใส่ IP:9001 ของ remote host
# วิธีที่ 2: Docker API (ต้องเปิด TCP)
# บน remote host แก้ /etc/docker/daemon.json
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"]
"tls": true
"tlscacert": "/etc/docker/tls/ca.pem"
"tlscert": "/etc/docker/tls/server-cert.pem"
"tlskey": "/etc/docker/tls/server-key.pem"
"tlsverify": true
}
sudo systemctl restart docker
# ใน Portainer: Add environment > Docker API
# ใส่ IP:2376 + upload TLS certificates
แนะนำใช้ Agent เพราะ setup ง่ายกว่า ปลอดภัยกว่า ไม่ต้องเปิด Docker API port และ Agent ให้ feature เพิ่มเช่น browse host filesystem, ดู container stats ที่ละเอียดกว่า API mode ครับ
# เพิ่ม private registry ใน Portainer # Settings > Registries > Add registry # Docker Hub (default) # Registry type: DockerHub # Username: your-dockerhub-user # Password: your-access-token # Private registry (Harbor, GitLab, etc.) # Registry type: Custom registry # Registry URL: https://registry.example.com # Authentication: username/password # AWS ECR # Registry type: AWS ECR # Region: ap-southeast-1 # Access key + Secret key
เมื่อเพิ่ม registry แล้ว สามารถ pull image จาก private registry ได้ตรงใน Portainer UI ไม่ต้อง docker login บน server ทุกเครื่อง ทำให้ deploy private images ง่ายขึ้นมาก โดยเฉพาะเมื่อมี multiple Docker hosts ครับ
Portainer CE มี basic RBAC ที่แบ่ง user เป็น Administrator กับ Standard user โดย admin จัดการได้ทุกอย่าง standard user จัดการได้เฉพาะ resource ที่ได้รับสิทธิ์
# สร้าง User # Settings > Users > Add user # Username: developer1 # Password: DevP@ss2026 # Role: Standard user # สร้าง Team # Settings > Teams > Add team # Team name: Frontend Team # Members: developer1, developer2 # กำหนดสิทธิ์ Environment # Settings > Environments > manage access # Frontend Team: Read/Write access to Development only # DevOps Team: Read/Write access to all environments
สำหรับองค์กรที่ต้องการ RBAC ละเอียดมากขึ้น เช่น กำหนดสิทธิ์ระดับ container, stack หรือ registry ต้องใช้ Portainer Business Edition แต่สำหรับทีมส่วนใหญ่ CE ก็เพียงพอครับ
Portainer แสดง resource usage ของทุก container แบบ real-time ทั้ง CPU, memory, network I/O และ disk I/O คลิกที่ container เลือก Stats จะเห็น graph ที่อัพเดทอัตโนมัติ ช่วยให้เห็นว่า container ไหนกิน resource มากผิดปกติได้ทันที
# Container Logs ผ่าน Portainer UI # คลิก container > Logs # - Auto-refresh: เปิด/ปิดได้ # - Timestamps: แสดงเวลาทุกบรรทัด # - Search/Filter: ค้นหา keyword ใน log # - Download: export log เป็นไฟล์ # เทียบกับ CLI: docker logs -f --tail 100 --timestamps my-container docker logs --since 1h my-container | grep ERROR
สิ่งที่ Portainer ทำได้ดีกว่า CLI คือ log viewer ที่ search ได้, highlight keyword ได้ และ scroll ได้สะดวก ไม่ต้อง pipe ผ่าน grep หลายชั้น สำหรับ developer ที่ต้อง debug production issue สามารถเปิด log ของหลาย container พร้อมกันใน tab ต่างๆ ดู log ข้ามกันได้ง่ายมากครับ
Dashboard ของ Portainer แสดง overview ของทั้ง environment จำนวน running containers, stopped containers, images ที่ใช้อยู่, total volume size และ network count ช่วยให้ admin เห็นภาพรวมได้ทันทีโดยไม่ต้องรัน docker stats หรือ docker system df สำหรับ monitoring ที่ละเอียดกว่านี้แนะนำใช้ร่วมกับ Prometheus และ Grafana ครับ
# Backup Portainer data docker stop portainer docker run --rm \ -v portainer_data:/data \ -v $(pwd):/backup \ alpine tar czf /backup/portainer-backup-$(date +%Y%m%d).tar.gz -C /data . docker start portainer # Restore docker stop portainer docker run --rm \ -v portainer_data:/data \ -v $(pwd):/backup \ alpine sh -c "rm -rf /data/* && tar xzf /backup/portainer-backup-20260222.tar.gz -C /data" docker start portainer
# Automatic backup script #!/bin/bash BACKUP_DIR="/opt/backups/portainer" KEEP_DAYS=30 mkdir -p $BACKUP_DIR docker run --rm \ -v portainer_data:/data \ -v $BACKUP_DIR:/backup \ alpine tar czf /backup/portainer-$(date +%Y%m%d-%H%M).tar.gz -C /data . find $BACKUP_DIR -name "portainer-*.tar.gz" -mtime +$KEEP_DAYS -delete echo "Backup done: $(ls -la $BACKUP_DIR/*.tar.gz | tail -1)" # เพิ่มใน crontab # 0 2 * * * /opt/scripts/backup-portainer.sh >> /var/log/portainer-backup.log 2>&1
Portainer เก็บ configuration ทั้งหมดใน volume เดียว ทำให้ backup และ restore ง่ายมาก ข้อมูลที่อยู่ใน volume ได้แก่ user accounts, environment settings, stack configurations, custom templates และ edge configurations ทั้งหมด backup ทุกวันเพื่อป้องกัน data loss ครับ
ไม่ควรเปิด Portainer port 9443 ให้ public access โดยตรง ใช้ reverse proxy ด้วย Nginx หรือ Traefik ใส่ SSL certificate และจำกัด IP ที่เข้าถึงได้
# Nginx reverse proxy สำหรับ Portainer
# /etc/nginx/sites-available/portainer.conf
server {
listen 443 ssl http2;
server_name portainer.example.com;
ssl_certificate /etc/letsencrypt/live/portainer.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/portainer.example.com/privkey.pem;
# จำกัด IP (optional)
# allow 10.0.0.0/8;
# deny all;
location / {
proxy_pass https://127.0.0.1:9443;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
}
}
# หรือใช้ Traefik กับ Docker labels
services:
portainer:
image: portainer/portainer-ce:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.portainer.rule=Host(`portainer.example.com`)"
- "traefik.http.routers.portainer.tls.certresolver=letsencrypt"
- "traefik.http.services.portainer.loadbalancer.server.port=9443"
- "traefik.http.services.portainer.loadbalancer.server.scheme=https"
ตรวจสอบว่า Docker socket mount ถูกต้อง -v /var/run/docker.sock:/var/run/docker.sock ถ้าใช้ rootless Docker path จะต่างออกไป ตรวจด้วย docker info ว่า socket อยู่ที่ไหน ใช้ path นั้นแทนครับ
ตรวจ firewall ว่าเปิด port 9001 แล้ว ตรวจว่า agent container running อยู่ด้วย docker ps | grep agent และตรวจ network connectivity ด้วย telnet AGENT_IP 9001 ถ้า agent อยู่หลัง NAT ให้ใช้ Edge Agent แทนที่ใช้ outbound connection ครับ
ดู error message ใน Portainer UI ส่วนใหญ่เกิดจาก YAML syntax error, image pull failed หรือ port conflict ตรวจว่า image name ถูกต้อง registry accessible และ port ไม่ซ้ำกับ container อื่น ลอง validate YAML ก่อน deploy ครับ
ปกติ Portainer ใช้ RAM แค่ 50-100MB ถ้าสูงกว่านั้นอาจเกิดจากมี environment จำนวนมากที่ poll status อยู่ตลอด ลด polling interval ใน Settings หรือ remove environment ที่ไม่ใช้แล้ว ถ้ายังสูงลอง restart container ครับ
Portainer CE (Community Edition) เป็น open source ฟรี มี feature พื้นฐานครบ จัดการ Docker, Swarm, Kubernetes ได้ ส่วน Business Edition มี RBAC ละเอียดกว่า, registry management ที่ดีกว่า, GitOps deployment และ official support สำหรับทีมส่วนใหญ่ CE เพียงพอครับ
รองรับครับ Portainer จัดการ Kubernetes cluster ได้ทั้ง deploy applications, manage namespaces, view logs, exec into pods คล้าย Rancher แต่ lightweight กว่ามาก เหมาะสำหรับทีมเล็กถึงกลางที่ไม่ต้องการ complexity ของ Rancher
Portainer เบามาก ใช้ RAM แค่ 50-100MB และ CPU น้อยมาก เพราะเป็นแค่ web UI ที่เรียก Docker API ไม่ได้ run workload เอง ติดตั้งบน server ที่มี Docker อยู่แล้วได้เลยโดยไม่กระทบ performance ของ application containers ครับ
Portainer มี authentication, RBAC, HTTPS support และ audit log ในตัว แต่ต้องตั้งค่าให้ถูกต้อง ไม่ควรเปิด port 9443 ให้ public access ใช้ reverse proxy ด้วย Nginx หรือ Traefik ใส่ SSL certificate จำกัด IP ที่เข้าถึงได้ และเปลี่ยน admin password เป็น strong password ครับ
Rancher เหมาะสำหรับ Kubernetes cluster ขนาดใหญ่ มี feature ครบทั้ง cluster provisioning, fleet management ส่วน Portainer เหมาะสำหรับ Docker standalone และ small Kubernetes เบากว่า setup ง่ายกว่า ถ้าใช้ Docker เป็นหลักเลือก Portainer ถ้า K8s เป็นหลักเลือก Rancher ครับ
อ่านเพิ่มเติมเกี่ยวกับ IT Infrastructure และ DevOps Tools รวมถึง Network Solutions และ Server Management
ใช้ Docker Compose ร่วมกับ Portainer สำหรับ stack deployment หรืออ่าน Traefik Reverse Proxy เพื่อ expose Portainer ด้วย SSL อัตโนมัติ
สนใจระบบ เทรด Forex อัตโนมัติ หรือ สัญญาณเทรด XMSignal ติดตามได้ที่เว็บไซต์ครับ
Portainer เป็น Docker management UI ที่ดีที่สุดในโลก open source ให้ทุกคนในทีมจัดการ containers ได้ผ่าน browser ไม่ต้อง SSH ไม่ต้องจำ CLI commands ด้วย stack deployment, app templates, multi-environment management และ RBAC ทำให้ Docker operations เป็นเรื่องง่ายสำหรับทั้ง developer และ operations team ครับ
ติดตั้ง Portainer ใช้เวลาไม่ถึง 5 นาที แค่ docker run คำสั่งเดียว ได้ management UI ที่ครบทุก feature ทันที ลงทุนเวลาแค่เล็กน้อยแต่ได้ productivity ที่เพิ่มขึ้นมหาศาล โดยเฉพาะเมื่อทีมโตขึ้นและมี Docker hosts หลายเครื่อง Portainer จะเป็น single pane of glass ที่คุณขาดไม่ได้ครับ