ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

จัดการ Docker ผ่านหน้าเว็บด้วย Portainer
Home จัดการ Docker ผ่านหน้าเว็บด้วย Portainer

จัดการ Docker ผ่านหน้าเว็บด้วย Portainer

เมื่อเซิร์ฟเวอร์รันคอนเทนเนอร์หลายสิบตัว การไล่ดูด้วยคำสั่ง docker ps และ docker logs เริ่มไม่สะดวก โดยเฉพาะเมื่อมีทีมงานที่ไม่ถนัดบรรทัดคำสั่งต้องเข้ามาดูสถานะด้วย

Portainer ให้หน้าจอเว็บที่ดูสถานะ อ่าน Log รีสตาร์ตคอนเทนเนอร์ และปรับใช้ Stack ใหม่ได้ แต่มีข้อควรระวังด้านความปลอดภัยที่ต้องเข้าใจก่อน เพราะโปรแกรมนี้เข้าถึง Docker ได้เต็มที่ ซึ่งเทียบเท่าสิทธิ์ root บนเครื่อง

สิ่งที่ต้องเตรียม

  • เซิร์ฟเวอร์ที่ติดตั้ง Docker แล้ว
  • โดเมนย่อยสำหรับเข้าหน้าจอ
  • เข้าใจว่าใครควรมีสิทธิ์เข้าถึงบ้าง

ขั้นตอนที่ 1: ติดตั้ง

sudo docker volume create portainer_data

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

sudo docker ps | grep portainer

ผูกพอร์ตกับ 127.0.0.1 เสมอ แล้วเข้าผ่าน Nginx ที่มี SSL และการยืนยันตัวตนอีกชั้น อย่าเปิดพอร์ต 9000 ออกสู่อินเทอร์เน็ตโดยตรง

ข้อควรรู้เรื่องความปลอดภัย การเมานต์ /var/run/docker.sock ทำให้คอนเทนเนอร์นี้สั่ง Docker ได้ทุกอย่าง รวมถึงการสร้างคอนเทนเนอร์ที่เมานต์ระบบไฟล์ของเครื่องแม่ ผู้ที่เข้าถึง Portainer ได้จึงมีอำนาจเทียบเท่า root ต้องปฏิบัติกับรหัสผ่านของมันเหมือนรหัส root

ขั้นตอนที่ 2: ตั้ง Nginx และ SSL

sudo nano /etc/nginx/sites-available/portainer
server {
    listen 80;
    server_name docker.example.com;

    # จำกัดให้เข้าได้เฉพาะจากออฟฟิศหรือ VPN
    allow 203.0.113.0/24;
    allow 10.0.0.0/24;
    deny all;

    location / {
        proxy_pass http://127.0.0.1:9000;
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade    $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
sudo ln -s /etc/nginx/sites-available/portainer /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d docker.example.com --agree-tos -m [email protected] --redirect

การจำกัดด้วย IP เป็นชั้นป้องกันที่สำคัญที่สุด เพราะแม้รหัสผ่านจะหลุด ผู้โจมตีจากภายนอกก็ยังเข้าไม่ได้

ขั้นตอนที่ 3: ตั้งค่าครั้งแรก

เปิด https://docker.example.com ภายใน 5 นาทีหลังเริ่มคอนเทนเนอร์ เพื่อสร้างบัญชีผู้ดูแล หากช้ากว่านั้น Portainer จะล็อกตัวเองเพื่อความปลอดภัย ต้องรีสตาร์ตคอนเทนเนอร์แล้วเข้าใหม่

sudo docker restart portainer

ตั้งรหัสผ่านที่ยาวอย่างน้อย 16 ตัวอักษร แล้วเลือก Get Started เพื่อจัดการ Docker บนเครื่องนี้

ขั้นตอนที่ 4: สิ่งที่ทำได้จากหน้าจอ

  • Containers ดูสถานะ เริ่ม หยุด รีสตาร์ต ดู Log แบบเรียลไทม์ และเปิดคอนโซลเข้าไปในคอนเทนเนอร์
  • Stacks วาง Docker Compose ลงไปแล้วปรับใช้ได้ทันที รวมถึงดึงจาก Git Repository
  • Images ดึงอิมเมจใหม่ ลบอิมเมจที่ไม่ได้ใช้เพื่อคืนพื้นที่
  • Volumes ดูว่า Volume ไหนถูกใช้อยู่ และ Volume ไหนค้างอยู่โดยไม่มีคอนเทนเนอร์ใช้
  • Networks ดูโครงสร้างเครือข่ายระหว่างคอนเทนเนอร์

ฟีเจอร์ที่มีประโยชน์ที่สุดในงานประจำวันคือการดู Log พร้อมค้นหาข้อความ และการเปิดคอนโซลเข้าไปในคอนเทนเนอร์โดยไม่ต้อง SSH

ขั้นตอนที่ 5: สร้าง Stack จากหน้าเว็บ

ไปที่ Stacks แล้ว Add stack ตั้งชื่อแล้ววางเนื้อหา Compose ลงไป

services:
  whoami:
    image: traefik/whoami
    restart: unless-stopped
    ports:
      - "127.0.0.1:8081:80"

Portainer จะสร้างและรันให้ทันที และจัดการเป็นกลุ่มเดียวกัน ทำให้หยุดหรือลบทั้งชุดได้ในคลิกเดียว

สำหรับระบบงานจริง แนะนำให้ใช้ตัวเลือก Repository ที่ดึง Compose จาก Git แทนการวางข้อความ เพราะได้ประวัติการเปลี่ยนแปลงและย้อนกลับได้

ขั้นตอนที่ 6: กำหนดสิทธิ์ทีมงาน

ไปที่ Users แล้วสร้างผู้ใช้เพิ่ม จากนั้นสร้าง Team แล้วกำหนดสิทธิ์ต่อทรัพยากร

  • ให้ทีมพัฒนาเห็นเฉพาะคอนเทนเนอร์ของตัวเอง โดยตั้ง Access control ที่ระดับ Stack
  • ให้สิทธิ์อ่านอย่างเดียวกับทีมที่ต้องการดูสถานะเท่านั้น
  • สงวนบทบาท Administrator ไว้กับผู้ดูแลระบบจริงเท่านั้น

เปิดการยืนยันตัวตนสองขั้นตอนให้ทุกบัญชีที่เป็นผู้ดูแล ในเมนู My account แล้ว Two-factor authentication

ขั้นตอนที่ 7: สำรองการตั้งค่า

# ส่งออกการตั้งค่าจากหน้าเว็บที่ Settings แล้ว Backup Portainer
# หรือสำรอง Volume โดยตรง
sudo docker run --rm \
  -v portainer_data:/data \
  -v /var/backups:/backup \
  alpine tar czf /backup/portainer-$(date +%F).tar.gz -C /data .

ขั้นตอนที่ 8: อัปเดต

sudo docker stop portainer
sudo docker rm portainer
sudo docker pull portainer/portainer-ce:latest

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

ข้อมูลทั้งหมดอยู่ใน Volume จึงไม่หายเมื่อสร้างคอนเทนเนอร์ใหม่

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

เข้าหน้าแรกแล้วขึ้นว่าหมดเวลาตั้งค่า

Portainer ล็อกตัวเองหลังเริ่มทำงานเกิน 5 นาทีโดยไม่มีการสร้างบัญชี รีสตาร์ตคอนเทนเนอร์แล้วรีบเข้าไปตั้งค่า

เห็นคอนเทนเนอร์แต่ดู Log ไม่ได้

ตรวจว่า Nginx ส่งต่อ WebSocket ตามคอนฟิกในขั้นตอนที่ 2 และเวลาที่ Proxy รอตอบไม่สั้นเกินไป

กังวลเรื่องความปลอดภัยของ docker.sock

ทางเลือกที่ปลอดภัยกว่าคือใช้ Portainer Agent ร่วมกับ socket proxy ที่จำกัดคำสั่งที่เรียกได้ แต่สำหรับเซิร์ฟเวอร์เดียวที่มีผู้ดูแลไม่กี่คน การจำกัดด้วย IP และ 2FA ตามคู่มือนี้เพียงพอในทางปฏิบัติ

ลบคอนเทนเนอร์ผิดตัว

ตั้งสิทธิ์ให้ทีมที่ไม่จำเป็นต้องแก้ไขเป็นแบบอ่านอย่างเดียว และใช้ Stack เพื่อจัดกลุ่มให้ชัดเจนว่าอะไรเป็นของระบบไหน

ต้องการ Cloud VPS ที่พร้อมใช้งาน Docker ติดต่อ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security