MicroOS Container: Podman ทางเลือกใหม่สำหรับผู้ใช้ Docker

สำหรับผู้ใช้ดิสโทรสาวก Red Hat จะสังเกตเห็นว่า Red Hat แทนที่ Docker daemon ด้วย CRI-O / Podman ตั้งแต่ RHEL 8 แล้ว (แล้วปล่อย CentOS ทิ้ง)

แล้ว Podman คืออะไร?

ตามคำจำกัดความที่เว็บไซต์อย่างเป็นทางการของ Podman กล่าวว่า…

Podman เป็น daemonless container engine สำหรับการพัฒนา, จัดการ และเรียกใช้ OCI Containers บนระบบ Linux System ของเรา
มันไม่จำเป็นต้องมีสิทธิ์ root ในการสร้างและรันคอนเทนเนอร์ ซึ่งหมายความว่า Podman สามารถทำงานใน environment โหมด root ได้ (run as root หรือ rootless mode)

Podman (Pod Manager Tool) เป็น daemonless container engine มาตรฐาน OCI (Open Container Initiative) ที่รันบนระบบปฏิบัติการ Linux รันคอนเทนเนอร์แบบไม่ต้องมีสิทธิ์ root, และไม่มี daemon, ย้ายแอปพลิเคชันข้ามแพลตฟอร์มได้อย่างไร้ขีดจำกัด!

credit image: Podman vs Docker

มาตรฐาน OCI (Open Container Initiative) ถือกำเนิดขึ้นภายใต้การกำกับดูแลของ Linux Foundation เพื่อป้องกันไม่ให้เกิดปัญหา vendor lock-in ในส่วนของ runtime และ image specification ประกาศใช้เป็นมาตรฐานเมื่อเดือนมิถุนายน 2015

บทความนี้จะเล่าถึงตัว Podman บนดิสโทร SUSE และ openSUSE Kubic ที่เตรียมพร้อม Podman มาให้เป็น default แล้ว (ต้อง  zypper in podman)

2 สิ่งสำคัญที่ Podman แตกต่างจาก Docker

1. Podman ไม่ใช้ daemon

ดังนั้น container engine จึงสื่อสารโต้ตอบโดยตรงกับ image registry (รีจีสทรีอิมเมจคอนเทนเนอร์และที่เก็บอิมเมจ) และเนื่องจาก Podman ไม่มี daemon และสามารถทำงานร่วมกับ systemd ได้เป็นอย่างดี สิ่งนี้ทำให้เราสามารถควบคุมคอนเทนเนอร์ผ่าน systemd ได้

2. Podman ใช้ Namespaces

เนื่องจาก Podman อาศัยเนมสเปซหลายตัวซึ่งมีกลไกการแยก system resources สำหรับกระบวนการของ Linux จึงไม่จำเป็นต้องมีสิทธิ์ root ในการสร้างและรันคอนเทนเนอร์ ซึ่งหมายความว่า Podman สามารถทำงานใน environment โหมด root ได้ (สภาพแวดล้อมที่ไม่มีใครเทียบได้ 55) ยิ่งไปกว่านั้นคอนเทนเนอร์ที่สร้างโดยผู้ใช้ที่ไม่มีสิทธิ์ไม่สามารถได้รับสิทธิพิเศษบน Host ที่สูงกว่ายูสเซอร์ผู้สร้างคอนเทนเนอร์ได้

แล้ว Namespaces คืออะไร?

namespaces ทำหน้าที่ในการ virtualized system resources ให้แต่ละ process (คุณสมบัตินี้อยู่ใน Linux kernel version 2.4.19 ตั้งแต่ปี 2002)

ซึ่งจะว่าไปแล้ว Podman มันก็คือ Linux + Namespace + Chroot

chroot เป็นการทำให้ application ที่เรา run ไม่เห็น path / (root) จริง ๆ แต่เป็น / (root) ปลอมที่ถูกสร้างขึ้นเพื่อให้ แต่ละ process และ child process

openSUSE Kubic คืออะไร?
(openSUSE MicroOS Container)

openSUSE Kubic (openSUSE MicroOS Container) เป็นดิสโทร Certified Kubernetes ที่ built on-top บนดิสโทร openSUSE อีกที (code ต้นน้ำจาก Tumbleweed) แต่ถ้าเป็นผลิตภัณฑ์ในตลาดที่ SUSE ขายอยู่จะเป็นตัว SUSE’s Container as a Service Platform (CaaSP) ครับ.

credit image: SUSE’s Container as a Service Platform (CaaSP)

แต่ในบทความนี้เราจะพูดถึงเจ้า Podman

สำหรับการใช้งาน Podman มันไม่แตกต่างอะไรจาก Docker เลย เช่น การสร้างอิมเมจคอนเทนเนอร์ และคำสั่งต่าง ๆ ล้วนแต่คล้ายกันกับ Docker Engine เช่น คำสั่ง
podman build ก็ทำงานแบบเดียวกันกับคำสั่ง docker build

แต่ ๆๆๆ

*คุณไม่สามารถ run โปรแกรม (Windows application) ใน Container ที่ run อยู่บน Linux Host OS ได้ แต่ VM สามารถทำได้นะ 555

รู้หรือไม่: VMs รันบน Guest OS ซึ่งรัน อยู่บน Hypervisor (VMware ฯลฯ)
ส่วน Containers รันอยู่บน Container Engine (Docker, Podman) ซึ่งติดตั้งรันอยู่บน Host OS

credit image: Containers VS VMs

ทำไง? อยากย้ายจาก Docker Engine ไป Podman

ไม่ถามสุขภาพสักคำ…
การย้ายจาก Docker Engine ไป Podman สามารถทำได้เลยเครับ และเรายังสามารถ deploy containers ได้โดย Host OS เพียงติดตั้ง Podman หรือแม้แต่เราจะ run container บนเครื่อง VM ก็ได้เช่นกัน

ความดีงามของแอปพลิเคชั่นที่อยู่ในรูปแบบ Containers คือ มันสามารถ scale ได้โดยใช้ซอฟต์แวร์พวก container orchestrator เช่น Kubernetes เป็นต้น

3 องค์ประกอบหลักของ Docker Engine

Docker Engine เป็นแอปพลิเคชั่นที่ทำงานในรูปแบบ Server-Client ที่ประกอบด้วย 3 ส่วน
1. Daemon (หัวหน้าใหญ่ที่คอยดู images, container และการเชื่อมต่อ network)
2. REST API
3. CLI Client (อันนี้แหละที่เป็นคำสั่งสร้าง container, pod แล้วสั่งมันให้ไปคุยกับ daemon)

credit image: @technopanti

ในการใช้งาน Containers บนดิสโทร SUSE Linux นั้น เครื่อง Container Host สนับสนุน environment support แบ่งออกเป็น 4 Tiers

Tier1: SUSE Enterprise base container (Certified container)
เป็น repository ที่เก็บ image enterprise-grade image ที่ผ่านการทำ security มาเรียบร้อย เพื่อนำไปใช้ในงานที่ต้องการความปลอดภัยและ support

Tier2: Container จาก SUSE และชุมชน openSUSE

Tier3: Third-party container (SLE base containers) จากบุคคลที่สามเช่น จากบริษัท Outsource

Tier4: Third-party container จากบุคคลที่สามที่สร้าง image ขึ้นผ่านเครื่องมือ KIWI (SLE packages using KIWI)

ตัวอย่างใช้ Podman

ติดตั้ง Podman ด้วย  Zypper

zypper in podman

Pull mage

podman pull nginx

List images

podman images

Run container

podman run -dt -p 8081:80/tcp -v /opt/http:/usr/share/nginx/html:ro --name hello-nginx nginx

ตัวอย่าง Commands ที่ใช้กับ Podman

  • สร้าง pod ชื่อ nginx ที่ run sh command ในแบบที่มี interactive terminal
    podman pod create -it nginx sh
  • สตาร์ท container
    podman pod start <pod_id>
  • list pod ที่มีอยู่ทั้งหมด
    podman pod ls
  • podman pod run -it nginx sh
    สร้างและ run pod ชื่อ nginx ที่ run sh แบบที่มี (i)nteractive (t)erminal
    (เท่ากับ command ที่ 1 และ 2 รวมกัน)
  • ตรวจสอบรายละเอียดของ pod
    podman pod inspect <pod name/id>
  • หยุดการทำงานของ pod
    podman pod stop
  • podman pod exec -it <pod name/id>
    เข้าไปยัง pod
  • podman container rm (-f) <pod name/id>
    ลบ container ถ้าใส่ -f จะ forece stop container ให้ด้วย

หรือออปชั่น — cgroup-parent value ตั้งค่า cgroup parent สำหรับ pod
— infra การสร้าง infra container ที่เชื่อมโยงกับ pod ที่จะแชร์ namespaces

Podman Network Drivers

ส่วน Podman Network Drivers บน Podman จะมีแค่ bridge (และมีส่วนของปลั๊กอิน bridge,portmap,firewall,tuning) bridge: เป็น default network driver ถ้าไม่ระบุอะไรจะเป็น bridge ทั้งหมด เป็น Standalone mode ครับ และเราสามารถสร้างหรือกำหนด Network ขึ้นมาใหม่ได้ (user-defined bridge network) เช่น กำหนด maria-bridge ให้เป็น Network สำหรับสื่อสารแอปพลิเคชั่นกับ Database (อารมณ์คล้าย ๆ กับสร้าง VLAN นั้นแหละครับ)

podman network create maria-bridge
  • ดูรายชื่อ Network
podman network ls

NAME    VERSION  PLUGINS
podman  0.4.0    bridge,portmap,firewall,tuning

  • ลองสร้างคอนเทนเนอร์ Web server โดยใช้ nginx
podman run -dt --pod new:web_server -p 8080:80 nginx

สร้าง Network ใหม่สำหรับ MariaDB

podman network create maria-bridge

การ Deploy the Database

$ export MYSQL_ROOT_PASSWORD=p@ssw0rd
$ PODID= $( podman run --network=maria-bridge --name some-mariadb -e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD -d mariadb:latest )
  • สร้าง Directory เก็บไฟล์ฐานข้อมูล
mkdir -p /opt/var/lib/mysql/data
chown 27:27 /opt/var/lib/mysql/data
  • สร้างและ run container บน Network ชื่อ maria-bridge
podman run -dt --network=maria-bridge --pod new:mariadb -p 3306:3306 -v /opt/var/lib/mysql/data:/var/lib/mysql/data:Z -e MYSQL_ROOT_PASSWORD=p@ssw0rd -e MYSQL_DATABASE=mydb -e MYSQL_USER=mydb -e MYSQL_PASSWORD=p@ssw0rd -d mariadb
  • ค้นหา IP address ของ container ที่เราสร้างขึ้น
POD_IP=$( podman inspect $PODID | jq -r '.[] | .NetworkSettings | .IPAddress' )
  • ลองสร้าอง PHPMyAdmin container
podman run -dt --pod new:web_myadmin -p 8081:80 phpmyadmin

Image registry คืออะไร?

Image เป็นอีกส่วนที่สำคัญที่สุดของ container ecosystem เพราะทุก container ต้อง run จาก image

ดิสโทร SUSE ก็จะมี container ecosystem เก็บ Image registry อยู่ที่ registry.opensuse.org
ส่วน Docker ก็อยู่ที่ docker.io เป็นต้น

credit image: @technopanti

Tips and Tricks

คำสั่ง ดูการใช้งาน disk space สำหรับแต่ละ container

podman system df -v

คำสั่ง ลบ docker image ที่ไม่ได้ใช้เพื่อ clean up host disk usage

podman system prune -a

Podman รันคอนเทนเนอร์แบบไม่ต้องมีสิทธิ์ root, และไม่มี daemon, ย้ายแอปพลิเคชันข้ามแพลตฟอร์มได้อย่างไร้ขีดจำกัด

สรุป: Podman เป็นการอิมพลีเม้นท์การบริหารจัดการ Container อีกแบบหนึ่ง ที่ไปแก้ปัญหาที่เกิดขึ้นใน Docker คือเรื่องของการที่ต้องมี Daemon ที่ทำให้เกิดปัญหาตามมา เช่น Single Point of failure และหากเกิดความล้มเหลวจะอาจเกิด Orphan Process รวมถึงการปฏิบัติการใด ๆ ต้องอาศัยสิทธิ Root ของผู้ใช้งาน เป็นต้น ด้วยเหตุนี้เอง Podman จึงวางโครงสร้างใหม่ให้ทำงานผ่านทาง runC Container runtime process แทน (ตามรูปด้านล่าง)

credit image: Podman vs Docker

source:
[1] https://documentation.suse.com/sles/15-SP2/single-html/SLES-container/index.html#cha-podman-overview
[2] https://thenewstack.io/deploy-a-pod-on-centos-with-podman/
[3] https://kubic.opensuse.org/
[4] https://en.opensuse.org/Kubic:Installation#Installation_of_openSUSE_Kubic

Scroll to top