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 เพิ่มเติมครับ
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.