บทความก่อนหน้านี้ได้พูดถึง Podman (Pod Manager) ไปบ้างแล้ว สำหรับในบทความนี้จะว่าด้วยการ Deploy แอปพลิเคชั่นท่าง่ายๆ ในการรัน Container บน MicroOS
1. รัน Container สำหรับ systemd (Containers as systemd Services)
2. รัน Container ใน Pod (Containers as Pod)
ก่อนจะเข้าสู่แต่ล่ะท่า…
แล้ว openSUSE MicroOS คืออะไร?
openSUSE MicroOS ระบบปฏิบัติการยุค “Container as a Service” ดิสโทรลูกจากดิสโทรแม่อย่าง SUSE Linux ตัวดิสโทร MicroOS ยังมาพร้อมกับออปชั่นติดตั้งระบบปฏิบัติการที่เราสามารถเลือกได้ซึ่งมีด้วยกัน 4 ออปชั่น
- MicroOS
– Minimal installation ยัดแพกเกจเฉพาะที่จำเป็น
– Services ต่าง ๆ ที่เคยยัดมาให้ รุ่นนี้ไม่มี default มาให้ เช่น LDAP, DNS, DHCP - MicroOS Container Host
– รุ่นนี้เหมาะสำหรับทำ Hosting container
– ยัด Podman Container runtime มาให้พร้อมใช้ - MicroOS Desktop (GNOME)
– สำหรับแฟนพันธ์แท้ GUI GNOME
– มีตัวจัดการซอฟต์แวร์มาให้ (yast sw_single)
– ยัด Podman มาให้เช่นกัน - MicroOS Desktop (KDE Plasma) (ALPHA) ไม่ใช่เหรียญแต่อย่างได 55+
– สำหรับผู้ที่หลงรัก GUI KDE
– ยัด Podman มาให้เช่นกัน
openSUSE MicroOS เหมาะกับคุณไหม?
ใช่ครับ! ถ้าสิ่งต่อไปนี้คือความต้องการของคุณ
… ต้องการสตาร์ท Container ตอนบูตระบบ (Container as a Systemd service)
… ต้องการเรียกใช้คอนเทนเนอร์
… ต้องการคอนฟิกและเรียกใช้ Stack รูปแบบ Container as a Service
ดาวน์โหลด openSUSE MicroOS ได้ที่ไหน?
ดาวน์โหลดฟรี ๆ ได้ที่นี่เลย https://en.opensuse.org/Portal:MicroOS/Downloads
คราวนี้เรามาลองใช้ Podman ทำการ Deploy MariaDB Container และ PhpMyAdmin บน MicroOS Container Host
*บทความนี้เหมาะกับผู้ที่เคยใช้ Linux แล้วเคยใช้ Docker มาบ้างแล้ว และขอข้ามขั้นตอนการติดตั้ง openSUSE MicroOS นะครับ เนื่องจากไม่ได้มีอะไรแตกต่างไปจากการติดตั้งระบบปฏิบัติการลีนุกซ์ทั่ว ๆ ไป
เริ่มต้นด้วยการทำ Bondding *กรณีทำ NIC Bonding ส่วนใครที่เซิร์ฟเวอร์ใช้เพียง Interface เดียว (eth0 ฯลฯ) ก็ข้ามขั้นตอนนี้ไปได้เลย
เนื่องจากตอนติดตั้ง MicroOS รับ IP Address จาก DHCP ขั้นตอนนี้จึงต้องทำการเซต Static IP Address ให้กับเซิร์ฟเวอร์ MicroOS Container Host
cat /etc/sysconfig/network/ifcfg-bond0
NAME=''
BOOTPROTO='static'
IPADDR='192.168.1.99/24'
STARTMODE='auto'
ZONE=''
BONDING_MASTER='yes'
BONDING_SLAVE0='eno1'
BONDING_SLAVE1='eno2'
BONDING_MODULE_OPTS='mode=active-backup miimon=100'
กำหนดค่า Default Gateway
vi /etc/sysconfig/network/ifroute-bond0
default 192.168.1.1 - bond0
วิธีการ Deploy MariaDB Container ด้วย Podman (Podman as a Systemd service)

ค้นหา official MariaDB Image.
podman search -f is-official mariadb
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/library/mariadb MariaDB is a community-developed fork of MyS... 3886 [OK]
จากนั้น Pull image ลงมายังเครื่องของเรา
podman pull docker.io/library/mariadbTrying to pull
docker.io/library/mariadb:latest...Getting image source signaturesCopying blob c20afcf9b055 skipped: already exists Copying blob db98fc6f11f0 skipped: already exists Copying blob aa2333e25466 skipped: already exists Copying blob f611acd52c6c skipped: already exists Copying blob 83ee3a23efb7 skipped: already exists Copying blob f53ac4b825fd skipped: already exists Copying blob 54c5dc6dcf19 skipped: already exists Copying blob b1c71d744483 skipped: already exists Copying blob 863a8cc01d1c skipped: already exists Copying blob 5d1a793b093f skipped: already exists Copying blob 477cd2b3eba8 skipped: already exists Copying blob 402454543166 [--------------------------------------] 0.0b / 0.0bCopying config ade39f0469 done Writing manifest to image destinationStoring signaturesade39f0469a3fa0e5f907e4dd7861a4e77573b0757bd4055a7b4c52baea58590
ดูรายการ Images ที่ดึงมา
podman images
podman imagesREPOSITORY TAG IMAGE ID CREATED SIZEdocker.io/library/mariadb latest ade39f0469a3 13 days ago 413 MB
1. เริ่มต้นด้วยการสร้าง Network ขึ้นมาใหม่
พิพม์คำสั่ง podman network create <ชื่อที่ต้องการ>
podman network create db_network
คำสั่งดู Network ที่สร้างขึ้น
podman network ls
NAME VERSION PLUGINS
podman 0.4.0 bridge,portmap,firewall,tuning
db_network 0.4.0 bridge,portmap,firewall,tuning
จะเห็นได้ว่ามีชื่อ Network ใหม่ “db_network” เพิ่มขึ้นมา
(Default ของ Podman จะมีแค่ podman อันเดียว) โดยสามารถดู Setting Configuration ไฟล์ได้ที่พาท
/etc/containers/storage.conf
2. สร้าง directory แบบ persistent volume สำหรับ container
mkdir -p /opt/var/lib/mysql/data
สั่ง Run container จาก mariadb image
podman run –name db-mariadb -p 3306:3306 -v /opt/var/lib/mysql/data:/var/lib/mysql:Z -e MYSQL_ROOT_PASSWORD=suse -e MYSQL_DATABASE=mydb -e MYSQL_USER=my-user -e MYSQL_PASSWORD=suse -d mariadb
หรือจะรันแบบนี้ก็ได้ ผ่านการเรียก Environment variables จากไฟล์ .env แทน
cat .env
MYSQL_ROOT_PASSWORD=suse
MYSQL_USER=suse
MYSQL_PASSWORD=suse
MYSQL_DATABASE=mydb
podman run -d --name mariadb -p 3306:3306 -v /opt/var/lib/mysql/data:/var/lib/mysql:Z --env-file .env -d opensuse/mariadb
ดู container ที่สร้างขึ้นด้วยคำสั่ง podman ps -a
podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a08eef7d025c docker.io/library/mariadb mysqld About a minute ago Up About a minute ago 0.0.0.0:3306->3306/tcp db-mariadb
ดู meta-data ข้างใน Container ด้วยคำสั่ง Inspect
podman inspect db_mariadb
3. การเข้าถึง db-mariadb container
podman exec -it db_mariadb /bin/bash
root@a08eef7d025c:/#
ใช้คำสั่ง grep ดู UID ของ mysql ที่รันอยู่ใน Container
root@a08eef7d025c:/# grep mysql /etc/passwd
mysql:x:999:999::/home/mysql:/bin/sh
ลองดูโปรเซสภายใน Container ว่า mysqld รันที่ user อะไร
ps -aux | grep mysqld | grep -v grep
999 12408 0.0 0.8 1287608 94940 pts/0 Ssl+ 13:34 0:00 mysqld
(UID คือ 999)
การเข้าถึง MariaDB server ที่รันอยู่บน container
mysql -u root -h <IP of Container> -p
Podman as a Systemd service
สร้าง systemd unit file
mkdir -p .config/systemd/user/
cd .config/systemd/user/
podman generate systemd --name db-mariadb --files --new
/root/.config/systemd/user/container-db-mariadb.service
systemctl --user daemon-reload
จากนั้นให้ stop และ delete Container ทิ้ง
podman stop db-mariadb
podman rm db-mariadb
ดู status
systemctl --user status container-db-mariadb.service

สตาร์ท Containers ด้วย systemd
สร้าง link เซิอร์วิส container-db-mariadb เข้ากับ Container
systemctl --user enable --now container-db-mariadb.service
Created symlink /root/.config/systemd/user/multi-user.target.wants/container-db-mariadb.service → /root/.config/systemd/user/container-db-mariadb.service.
Created symlink /root/.config/systemd/user/default.target.wants/container-db-mariadb.service → /root/.config/systemd/user/container-db-mariadb.service.

Perfect! MariaDB is running
หรือจะสร้าง Systemd unit file ด้วยวิธีข้างล่างนี้ก็ได้เช่นกัน

Podman as a Systemd service
วิธีการรัน Containers ภายใน Pod
สร้าง pod ขึ้นมาใหม่ ชื่อ webapp
ซึ่งในตัวอย่างนี้เราจะสร้าง Mariadb และ PhpMyAdmin Containers ลงใน Pod ที่ชื่อ webapp
note: ในหนึ่ง Pod จะมีคอนเทนเนอร์เดียวหรือหลายคอนเทนเนอร์ก็ได้ และคอนเทนเนอร์ทั้งหมดใน Pod สามารถสื่อสารกันผ่าน localhost เนื่องจากใช้ network namespace เดียวกัน
podman pod create -name db -p 8080:80
สร้างไฟล์ .env
cat .env
MYSQL_ROOT_PASSWORD=p@ssw0rd
MYSQL_USER=user1
MYSQL_PASSWORD=user1pass
MYSQL_DATABASE=testdb
สร้าง Mariadb Container
podman run --d -v /opt/mysql-data:/var/lib/mysql/data:Z --pod db --env-file .env --name mariadb opensuse/mariadb
podman run -d --pod db --env-file .env --name mariadb -d opensuse/mariadb
Podman flags: อธิบายออปชั่นที่ใช้ run container ที่ควรรู้
(–rm option) สั่งลบคอนเทนเนอร์โดยอัตโนมัติและลบระบบไฟล์เมื่อคอนเทนเนอร์ทหยุดการทำงานไป (exit) จึงเหมาะกับการสร้างคอนเทนเนอร์ขึ้นมาใช้งานในระยะสั้น ๆ
กรณีที่ต้องการสร้าง container และต้องการให้ลบทิ้งเมื่อทำงานเสร็จให้ใช้ –rm ออปชั่น
(-d option) คือการรัน container ใน detached mode
เมื่อรัน container แล้วจะแสดง container id ออกมาทางหน้าจอ console และสามารถพิมพ์คำสั่งอื่นได้ ส่วน process จะรันอยู่ใน background จนกว่าจะสั่งให้ container นั้นหยุดทำงาน
(-it option) เป็นโหมด Interactive shell สามารถรับคำสั่ง (Command) จากผู้ใช้งาน
เป็นส่วนที่มีไว้ให้ผู้ใช้งานสามารถที่จะปฏิสัมพันธ์ (Interfacing) หรือจะเรียกใช้คำสั่งที่อยู่ในไฟล์
(–volume or -v option) เมื่อสร้างอิมเมจหรือรันคอนเทนเนอร์จากอิมเมจ ออปชั่นนี้เอาไว้ mount ไดเร็กทอรี local ลงในไดเร็กทอรีคอนเทนเนอร์ที่จำเป็น เช่น
(–pod <name>) กำหนด Container ให้กับ Pod
-v /opt/var/lib/mysql/data:/var/lib/mysql/data:Z
ในการสร้าง Pod ใหม่ด้วยคอนเทนเนอร์ใหม่เราเพียงแค่ระบุพารามิเตอร์ –pod new: <name>
การใช้ new: เป็นการบอกกับ Podman ว่าคุณต้องการสร้าง Pod ใหม่แทนที่จะพยายามกำหนดคอนเทนเนอร์ให้กับ Pod ที่มีอยู่
เช่น –pod new:webapp
podman run -dt --name=mariadb --pod new:webapp --env-file .env -d opensuse/mariadb
ดู Containers ใน Pod
podman ps -a --pod
สร้าง PhpMyAdmin Container ใน Pod ชื่อ db
podman run -d --pod db --env-file .env -e PMA_HOST=127.0.0.1 --name phpmyadmin phpmyadmin:latest
การเข้าถึง mariadb และ phpmyadmin containers
podman exec -it phpmyadmin /bin/bash
และ
podman exec -it mariadb /bin/bash
วิธีการ Import Database
mysql -h 10.88.0.13 --user=root --password=p@sswr0d testdb < my-data.sql
โดย 10.88.0.13 คือ IP Address ของ Pod
วิธีดู IP Address
podman exec -it mariadb /bin/bash
root@db:/var/www/html# cat /etc/hosts
ดู Pod ด้วยคำสั่ง podman pod ps

ดู Containers ใน Pod ทั้งหมด
podman ps -a --pod

จากนั้นเปิด web browser เข้า PhpMyAdmin <IP Address>:8080


คำสั่ง restart ทุก container ภายใน Pod (จะรีสตาร์ท container ทั้งหมดใน Pod)
podman pod restart
คำสั่ง ดู Pod คอนฟิก
podman pod inspect db
คำสั่งดู namespace information
podman ps --ns -a
คำสั่งดูขนาดไฟล์ทั้งหมดใน Pod
podman ps -a -s
แล้ว Podman เก็บ Container ไว้ที่ไหน?
(store container)
podman info
โดย Podman จะเก็บ container ไว้ที่ directory:
/var/lib/containers/storage/volumes/
สำหรับ Setting Storage Configuration คอนฟิกไฟล์จะอยู่ที่:
root user : /etc/containers/storage.conf และ
users : $HOME/.config/containers/storage.conf
เป็นอันสำเร็จสำหรับการ Deploy Container ด้วย Podman ครับ หวังว่าบทความนี้จะเป็นประโยชน์ไม่มากก็น้อยสำหรับผู้อ่านนะครัช!
source:
https://movimientolibre.com/apuntes/podman-03-pods-mysql-phpmyadmin/https://fedoramagazine.org/manage-containers-with-podman-compose/https://github.com/containers/podman-composehttps://www.suse.com/c/podman-on-opensuse/https://github.com/abalage/pods-compose/blob/master/README.mdhttps://balagetech.com/managing-podman-pods-with-pods-compose/
https://www.gitmemory.com/issue/containers/podman/7303/672969334
https://documentation.suse.com/sles/15-SP1/html/SLES-all/cha-transactional-updates.html