Deploy MariaDB และ PhpMyAdmin Container ด้วย Podman บน openSUSE MicroOS

บทความก่อนหน้านี้ได้พูดถึง 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 ออปชั่น

  1. MicroOS
    – Minimal installation ยัดแพกเกจเฉพาะที่จำเป็น
    – Services ต่าง ๆ ที่เคยยัดมาให้ รุ่นนี้ไม่มี default มาให้ เช่น LDAP, DNS, DHCP
  2. MicroOS Container Host
    – รุ่นนี้เหมาะสำหรับทำ Hosting container
    – ยัด Podman Container runtime มาให้พร้อมใช้
  3. MicroOS Desktop (GNOME)
    – สำหรับแฟนพันธ์แท้ GUI GNOME
    – มีตัวจัดการซอฟต์แวร์มาให้ (yast sw_single)
    – ยัด Podman มาให้เช่นกัน
  4. 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

phpmyadmin container

คำสั่ง 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

Scroll to top