AI
น้องๆ เคยเจอปัญหาลงโปรแกรมทับกันมั้ย? หรืออยากลอง AI ตัวใหม่ แต่กลัวเครื่องพัง? Podman Rootless Containers นี่แหละคือพระเอกของเรา! มันคือการสร้าง "ห้อง" เล็กๆ ให้โปรแกรม AI แต่ละตัวอยู่ เหมือนคอนโดที่แต่ละห้องแยกจากกัน ไม่กวนกัน แถมยังปลอดภัย เพราะทำทุกอย่างด้วยสิทธิ์ user ธรรมดา ไม่ต้องเป็น root ให้เสี่ยงโดนแฮก
สมัยผมทำร้านเน็ต SiamCafe นี่ตัวดีเลย! เด็กๆ ชอบลงโปรแกรมแปลกๆ มาลอง บางทีก็ติดไวรัส กว่าจะแก้ได้แต่ละที... ถ้ามี Podman ตั้งแต่ตอนนั้น ชีวิตคงง่ายขึ้นเยอะ
ปกติเวลาใช้ Container ทั่วไป เราต้องใช้สิทธิ์ root ซึ่งก็คือสิทธิ์สูงสุดของเครื่อง ถ้า Container โดนแฮก คนร้ายก็จะได้สิทธิ์ root ไปด้วย ทีนี้ล่ะ งานเข้า! แต่ Rootless Container ไม่ต้องใช้สิทธิ์ root ไง แค่ user ธรรมดาก็สร้าง Container ได้ สบายใจกว่าเยอะ
Podman ก็คือเครื่องมือที่ช่วยให้เราจัดการ Container ได้ง่ายๆ เหมือน Docker นั่นแหละ แต่ Podman มันเน้นเรื่องความปลอดภัยมากกว่า และออกแบบมาให้ทำงานแบบ Rootless ได้ดีกว่า
Container ก็เหมือนกล่องที่บรรจุโปรแกรมและทุกอย่างที่โปรแกรมนั้นต้องการไว้ข้างใน (เช่น libraries, dependencies) แล้วเอาไปรันที่ไหนก็ได้ ไม่ต้องกังวลว่าเครื่องปลายทางจะมีอะไรขาดหายไป เพราะทุกอย่างอยู่ในกล่องหมดแล้ว
สมัยก่อนเวลาลงโปรแกรมทีนึง ต้องมานั่งไล่ลง dependencies ให้ครบ บางทีก็เจอปัญหา dependencies เวอร์ชั่นไม่ตรงกัน Container ช่วยแก้ปัญหานี้ได้ดีมากๆ
# ตัวอย่าง Dockerfile สำหรับสร้าง Container
FROM ubuntu:latest
RUN apt-get update && apt-get install -y python3 python3-pip
COPY . /app
WORKDIR /app
RUN pip3 install -r requirements.txt
CMD ["python3", "app.py"]
Image คือ template หรือพิมพ์เขียวของ Container พูดง่ายๆ ก็คือ Container ที่ยังไม่ได้รันนั่นเอง เราสามารถสร้าง Container จาก Image ได้หลายๆ ตัว
ลองนึกภาพเหมือนพิมพ์ขนม Image ก็คือแม่พิมพ์ ส่วน Container ก็คือขนมที่อบออกมาจากแม่พิมพ์นั้น
Namespace และ cgroups เป็นเทคโนโลยีที่ Linux ใช้ในการจำกัดทรัพยากรและแยกส่วนต่างๆ ของ Container ออกจากกัน ทำให้ Container แต่ละตัวไม่สามารถเข้ามายุ่งเกี่ยวกันได้
Namespace เหมือนการสร้าง "ห้อง" ให้แต่ละ Container ส่วน cgroups เหมือนการกำหนดขนาดของห้องและปริมาณทรัพยากรที่แต่ละห้องใช้ได้
ก่อนอื่นต้องติดตั้ง Podman ก่อน วิธีการติดตั้งก็ขึ้นอยู่กับ OS ที่ใช้ ถ้าใช้ Ubuntu ก็:
sudo apt update
sudo apt install podman
ถ้าใช้ OS อื่นก็ลอง Google ดูนะ มีวิธีติดตั้งเยอะแยะ
เราสามารถสร้าง Image ได้จาก Dockerfile หรือจะ pull Image สำเร็จรูปจาก Docker Hub ก็ได้
# Pull Image จาก Docker Hub
podman pull ubuntu:latest
# สร้าง Container จาก Image
podman run -it ubuntu:latest /bin/bash
คำสั่ง podman run -it จะสร้าง Container ใหม่จาก Image `ubuntu:latest` แล้วเปิด terminal ให้เราเข้าไปใช้งาน
สมมติว่าเรามี AI Model ที่เขียนด้วย Python และต้องการรันใน Container เราสามารถทำได้ดังนี้:
FROM python:3.9-slim-buster
WORKDIR /app
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
CMD ["python3", "main.py"]
podman build -t my-ai-model .
podman run --rm -p 8000:8000 my-ai-model
คำสั่ง podman run --rm -p 8000:8000 my-ai-model จะรัน Container จาก Image `my-ai-model` แล้ว map port 8000 ของ Container ไปยัง port 8000 ของเครื่อง host
Volume คือพื้นที่เก็บข้อมูลที่ Container สามารถเข้าถึงได้ ข้อมูลที่อยู่ใน Volume จะไม่หายไปเมื่อ Container ถูกลบ
# สร้าง Volume
podman volume create my-volume
# รัน Container พร้อม mount Volume
podman run -v my-volume:/data my-image
ข้อมูลที่อยู่ใน directory `/data` ใน Container จะถูกเก็บไว้ใน Volume `my-volume`
Podman จะสร้าง network ให้ Container แต่ละตัวโดยอัตโนมัติ ทำให้ Container สามารถสื่อสารกันได้
# สร้าง network
podman network create my-network
# รัน Container พร้อม join network
podman run --network my-network my-image
Container ที่อยู่ใน network `my-network` จะสามารถสื่อสารกันได้โดยใช้ชื่อ Container เป็น hostname
Podman ไม่ได้มีข้อดีอย่างเดียว Docker ก็มีข้อดีของมันเหมือนกัน ลองดูตารางเปรียบเทียบนี้:
| คุณสมบัติ | Podman | Docker |
|---|---|---|
| Rootless | รองรับ | ต้องใช้ root (โดยปกติ) |
| Daemon | ไม่ต้องมี daemon รันตลอดเวลา | ต้องมี daemon รันตลอดเวลา |
| ความซับซ้อน | อาจจะซับซ้อนกว่าเล็กน้อย | ใช้งานง่ายกว่า |
| Community | เล็กกว่า | ใหญ่กว่า |
| สนับสนุน Kubernetes | ดี | ดี |
ถ้าเน้นความปลอดภัย และอยากลองอะไรใหม่ๆ Podman ก็เป็นตัวเลือกที่ดี แต่ถ้าอยากได้อะไรที่ใช้งานง่าย และมี Community ใหญ่ๆ Docker ก็ยังเป็นตัวเลือกที่น่าสนใจ
ยังไงก็ลองศึกษาเพิ่มเติมจาก SiamCafe Blog นะครับ มีบทความดีๆ อีกเยอะเลย
สุดท้ายนี้ อยากฝากน้องๆ ว่า เทคโนโลยีเปลี่ยนแปลงตลอดเวลา อย่าหยุดเรียนรู้ครับ! แล้วเจอกันใหม่ที่ SiamCafe Blog นะครับ!
มาถึงเคล็ดลับที่ผมอยากแชร์จากประสบการณ์จริง สมัยทำร้านเน็ตคาเฟ่ SiamCafe.net นี่แหละ เรื่อง container ไม่ได้มีให้ใช้หรอก แต่หลักการจัดการทรัพยากร การดูแลระบบคล้ายๆ กันเลย ผมว่ามันคือ evolution ของการจัดการ server ยุคใหม่นี่เอง
Rootless Podman นี่ดีตรงที่มันปลอดภัยกว่าเยอะ แต่ก็ต้องแลกมาด้วยความซับซ้อนในการตั้งค่าบางอย่างนิดหน่อย ถ้าทำตามนี้ รับรองชีวิตง่ายขึ้นเยอะ
เรื่อง Mount Volume นี่สำคัญมาก สมัยก่อนผมเจอปัญหาลูกค้าเซฟไฟล์ลงเครื่องแล้วหายประจำ เพราะดันไปเซฟไว้ในที่ที่พอรีสตาร์ทเครื่องแล้วมันหายหมด Container ก็เหมือนกัน ถ้าไม่ Mount Volume ไว้ ไฟล์ที่อยู่ใน container มันจะหายไปพร้อมกับ container ตอน restart
จำไว้ว่า Container คืออะไรที่เปลี่ยนแปลงได้ตลอดเวลา ข้อมูลสำคัญต้องอยู่นอก Container เสมอ!
podman run -d -p 8080:80 -v /home/user/mydata:/var/www/html httpd
Code ข้างบนนี่คือตัวอย่างการ Mount Volume จาก /home/user/mydata บนเครื่องเรา ไปที่ /var/www/html ใน Container Apache
เรื่อง Network นี่ก็ปวดหัวเหมือนกัน สมัยก่อนต้องมานั่ง config IP address เอง container นี่ช่วยเราเยอะ แต่ก็ต้องเข้าใจว่ามันทำงานยังไง Rootless Podman มันจะสร้าง network namespace ของตัวเองขึ้นมา
ถ้าอยากให้ Container คุยกับ Container อื่น หรือคุยกับ Host ได้ ต้อง config port forwarding ให้ดีๆ หรือใช้ network mode ที่เหมาะสม
podman run -d -p 8080:80 --network host httpd
--network host นี่คือสั่งให้ Container ใช้ network ของ Host ไปเลย ง่ายดี แต่ก็ต้องระวังเรื่อง port conflict ด้วยนะ
สมัยก่อนเครื่องลูกร้านเน็ตใครแรงก็เล่นเกมลื่นกว่าเพื่อน ตอนนี้ container ก็เหมือนกัน ถ้าไม่จำกัด resource มันจะแย่งกันใช้จนเครื่องอืด
Podman ให้เราจำกัด CPU, Memory ได้ ลองใช้ดู จะช่วยให้ระบบเสถียรขึ้นเยอะ
podman run -d -m 512m --cpus 0.5 httpd
Code นี้จำกัด Memory ให้ Container ใช้ได้แค่ 512MB และ CPU 0.5 core
Image นี่เหมือน template ของ Container ถ้าไม่จัดการให้ดีๆ จะรกเครื่องมาก ลบ image ที่ไม่ได้ใช้แล้วบ้างนะครับ
ใช้ podman image prune ช่วยได้เยอะ
Docker ต้องใช้ root permission ในการ run container แต่ Rootless Podman ไม่ต้อง ทำให้ปลอดภัยกว่าเยอะ
เช็คเรื่อง port forwarding, firewall, และ network configuration ให้ดีๆ ครับ
ใช้ systemd user unit file ครับ ลองหา tutorial ใน SiamCafe Blog ดู อาจจะมีคนเขียนไว้แล้ว
ไม่ครับ บาง image อาจจะต้องปรับ configuration นิดหน่อยเพื่อให้มัน run ได้โดยไม่ต้องใช้ root
Rootless Podman เป็นเครื่องมือที่ทรงพลังมากในการจัดการ container โดยที่ไม่ต้องพึ่ง root permission ทำให้ระบบปลอดภัยขึ้นเยอะ แต่ก็ต้องเรียนรู้และทำความเข้าใจกับมันให้ดีๆ
หวังว่าบทความนี้จะเป็นประโยชน์กับทุกคนนะครับ ลองเอาไปปรับใช้กับงานของตัวเองดู ถ้าติดขัดตรงไหน ถามมาได้เลย ผมยินดีช่วยเหลือ iCafeForex ก็ใช้ container นะจะบอกให้ :)