มาลองเริ่มใช้ podman กันครับ

podman มันเกี่ยวอะไรกัน ipod หรือป่าว ขอตอบว่าไม่ใช่นะครับ เป็นตัว Container Engine ตัวนึงครับ แบบเดียวกับ docker เลยครับ แต่งานนี้มาจากทาง Linux ค่าย RedHat ครับ โดยใน blog นี้เป็นการสรุปจากการงมๆครับ โดยมองว่ามี Keyword ที่น่าสนใจ ดังนี้

  • podman ไม่จำเป็นต้องใช้ user ในกลุ่ม root ทำงาน เดี๋ยวผมลองใช้ user ในกลุ่ม non-root ทดสอบครับ เพื่อที่ run container ใน mode rootless ครับ
  • Container ถ้าถูกทำตามมาตรฐาน OCI ใช้งานได้เหมือนกันครับ
  • เนื่องจากเป็นการงมๆ ผมเลยของลองเล่น Opensource ที่มันจบ และเสร็จในตัวอย่าง Ghost ซึงเป็น CMS อีกค่านึงครับ ที่ไม่ใช้ฐานข้อมูลครับ
  • podman เป็น Linux Base Only - ค่ายอื่น อย่าง Windows อาจจะทำได้ แต่มีท่ายากขึ้นไปอีกครับ

มาลองกันครับ

  • ก่อนอื่นสิ่งที่ต้องมี OS Redhat ครับ โดยผมได้ใช้งาน redhat 8.2 และ ได้ register เป็น developer เพื่อใช้งานในการทดสอบครับ (ถ้าใครอยากลองเป็น redhat developer สามารถ เข้ามาได้ครับ)
    • เครื่อง หรือ VM ที่ใช้ทดสอบ อันนี้ต้องสามารถต่อ Internet ได้ด้วยนะครับ
    • ขั้นตอนในช่วงแรกใช้ root เพื่อติดตั้ง package ที่จำเป็นครับ
  • ติดตั้ง podman และ slirp4netns ด้วยคำสั่ง
sudo dnf install slirp4netns podman -y
  • อย่างมาในขั้นตอนนี้หลายคนน่าจะงงกันแล้ว ว่าทำไมต้องลง 2 ตัวด้วย
    • podman - เป็นต้ว Container Engine
    • slirp4netns - เป็นตัวที่สร้างช่องทางพิเศษที่เรียกว่า tap เพื่อให้ container ที่ run โดย user non-root สามารถต่อ network ได้
  • ลองเสร็จสิ้นกันแล้วลองมาตรวจสอบ version ของ podman ด้วยคำสั่ง
podman --version
  • อีกตัว version ของ slirp4netns ด้วยคำสั่ง
slirp4netns --version
  • ขยายขนาดของ user namespace ใน kernel มีขนาดสูงสุด ด้วยคำสั่ง
echo "user.max_user_namespaces=28633" > /etc/sysctl.d/userns.conf
  • บันทึกสิ่งที่แก้ไขไปใน /etc/sysctl.d/userns.conf ด้วยคำสั่ง
sysctl -p /etc/sysctl.d/userns.conf
  • ลองสร้าง user ขึ้นมาทดสอบ โดยกรณีนี้ ผมกำหนดว่าเป็น invsbch / invsoper ซึ่งเมื่อสร้าง user เสร็จตัว podman map ให้สามารถใช้งาน rootless container ได้อัตโนมัติครับ
useradd -u 1001 
echo invsbch:invsbch | chpasswd
useradd -u 1002 
echo invsoper:invsoper | chpasswd
  • เปิด putty อีก 1 session ครับ โดยใช้ user invsbch ที่ไม่ใช่ root
  • ค้นหา image จาก Ghost จาก docker hub ครับ
  • ตอนนี้เรารู้คำสั่งในการ pull image มาใช้่งานแล้ว แต่ผมอยากลองครับ 555
  • ลองหา image ghost ด้วยคำสั่ง podman search <ชื่อ image>
podman search ghost
  • ลองดึง image ghost มาด้วยคำสั่ง podman pull <ชื่อ image>
podman pulll ghost
  • รอมันดึงข้อมูลให้เสร็จครับ
  • ตรวจสอบ Mapping สำหรับ rootless container โดยการใช้คำสั่ง
podman unshare cat /proc/self/uid_map
[invsbch@localhost ~]$ podman unshare cat /proc/self/uid_map
         0       1000          1
         1     100000      65536
  • สำหรับผลที่ได้จากคำสั่ง podman unshare cat /proc/self/uid_map มี 3 Column ครับ ได่้แก่
    • Column แรก - ค่าเริ่มต้น (initial ID) ของ namespace
    • Column สอง - ค่าเริ่มต้น (initial ID) ของ parent namespace
    • Column สาม - ขนาดของ namespace
  • ทดสอบ run image ด้วยคำสั่ง (ผมเอาตัวอย่างมาจาก dockerhub นะครับ)
podman run -d --name testghost -e url=http://localhost:3001 -p 3001:2368 ghost
  • มาทดสอบหน้าเว็บ Ghost กันก่อนนะครับ เพื่อมาทดสอบดูว่า non-root ที่ run container ขึ้นมา มันมีศัพท์เฉพาะด้วยนะว่า rootless ว่าได้ไหม ถ้าจาก docker hub ของ Ghost ถ้าดูหน้าเว็บต้องใช้ url ดังนี้
    • หน้าเว็บ http://<<YOUR-IP>>:3001 ของผมใช้เป็น http://192.168.1.104:3001
    • หน้าเว็บ http://<<YOUR-IP>>:3001/ghost ของผมใช้เป็น http://192.168.1.104:3001/ghost
  • หลังจากดูแล้วว่า Ghost ทำงานได้สมบูรณ์แล้ว มาลองดูใน container กันครับ ตอนนี้เรายังใช้งาน user invsbch กันครับ มาลองดูว่ามี container ที่ run อยู่ครับ ด้วยคำสั่ง
  • เอาหละที่นี้ลองใช้ user invsoper มาลอง
  • คราวนี้มาลองใช้ user root ครับ
  • ตอนนี้เราเห็นว่า image มันแยกขาดกันเลยครับ

สรุป

  • podman เป็น Container Engine ที่ออกแบบมา เพื่อแก้ปัญหาของ docker ที่ต้องใช้ root ในการทำงานครับ
  • ไม่ใช้ root สามารถรัน image ได้ตามแนวคิดของ rootless ครับ แต่มีข้อจำกัดด้วย network ซึ่งทาง podman แก้ปัญหาโดยใช้ slirp4netns
  • ลองใช้คำสั่งกับ image เช่น search, pull, run พบว่ามันเหมือนกับ docker เลยครับ แค่เปลี่ยนคำว่า docker เป็น podman ครับ
  • เวลา run image เห็นว่ามันแยกกันชัดเจนครับ ขนาด root ยังไม่เห็น container ที่รัน โดย user อื่นครับ
  • สำหรับ Blog หน้าผมของลองเรื่องอื่นๆ เกี่ยวกับ podman เพิ่มเติมครับ