در بخش ۱ به صورت کلی Podman معرفی شد و نحوه کارکرد آن توضیح داده شد. در این مطلب قصد داریم تا آن را نصب و استفاده کنیم.
نصب Podman در فدورا لینوکس
در فدورا لینوکس معمولا پادمن به صورت پیش فرض نصب می باشد، ولی به هر حال روش نصب به صورت زیر می باشد:
sudo dnf install podman
برای تأیید نصب، میتوانید یک کانتینر hello-world سریع اجرا کنید:
$ podman pull hello-world
$ podman run hello-world
اگر همه چیز درست بود باید همچین خروجی را دریافت کنید:
شروع با یک برنامه ساده Node.js در یک Pod
برای شروع این مثال، می خواهیم یک برنامه وب ساده با استفاده از Node.js راه اندازی کنیم. ابتدا، یک پوشه برای برنامه ایجاد کنید:
$ mkdir webapp && cd webapp
داخل پوشه webapp، یک فایل package.json ایجاد کنید که وابستگیهای مورد نیاز پروژه را فهرست کند:
{
"dependencies": {
"express": "*"
},
"scripts": {
"start": "node index.js"
}
}در مرحله بعد، یک فایل index.js ایجاد کنید که یک پاسخ ساده “Hello World” را نمایش دهد:
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send("Hello World!");
});
app.listen(8080, () => {
console.log("Listening on port 8080");
});
ایجاد Containerfile برای برنامه
اکنون، یک فایل با نام Containerfile در همان پوشه ایجاد کنید تا Image کانتینر برنامه را بسازید:
FROM node:alpine WORKDIR /usr/app COPY ./ ./ RUN npm install CMD ["npm", "start"]
این Containerfile یک Image سبک Node.js را دریافت میکند، وابستگیهای لازم را نصب میکند و برنامه را اجرا میکند.
ساخت Image با استفاده از Podman
برای Build کردن Image کانتینر برای برنامه، از دستور زیر استفاده کنید:
$ podman build -t webapp .
«t-» نام Image را webapp تعیین میکند و علامت «.» پوشه فعلی را به عنوان زمینه ساخت (build context) مشخص میکند.
ایجاد و اجرای یک پاد با Podman
حالا که Image آماده است، وقت آن رسیده که یک پاد (pod) ایجاد کنیم و کانتینر را درون آن اجرا کنیم. ابتدا، یک پاد ایجاد کنید:
$ podman pod create --name mypod -p 8080:8080
دستور گفته شده یک پاد به نام mypod ایجاد میکند و پورت ۸۰۸۰ روی میزبان را به پورت ۸۰۸۰ داخل پاد نگاشت میکند.
در مرحله بعد، کانتینر Node.js را داخل پاد اجرا کنید:
$ podman run -d --pod mypod --name webapp-container webapp
«pod– –» مشخص میکند که کانتینر باید درون mypod اجرا شود.
اضافه کردن یک کانتینر دیگر به Pod
یکی از ویژگیهای کلیدی پادها، قابلیت اجرای چندین کانتینر با منابع مشترک است. برای نمونه، می خواهیم یک کانتینر Redis را به پاد اضافه کنیم:
$ podman run -d --pod mypod --name redis-container redis
اکنون، هر دو کانتینر webapp و redis در یک pod اجرا میشوند و فضای نام شبکه (network namespace) را به اشتراک میگذارند. این بدان معناست که webapp میتواند از طریق localhost با redis ارتباط برقرار کند. (نکته اینکه در این مثال برنامه برای ارتباط با redis تنظیم نشده است.)
جهت بررسی عملکرد درست برنامه می توانید با استفاده از curl یک درخواست به آن ارسال کنید که در پاسخ باید Hello World را دریافت کنید:
$ curl http://localhost:8080
بررسی وضعیت کانتینر و Pod
وضعیت پاد و کانتینرهای آن را میتوان با استفاده از دستورهای زیر بررسی کرد:
$ podman pod ps $ podman ps --pod
این دستورها وضعیت پاد و کانتینرهای در حال اجرای آن را به شما نشان میدهند.
متوقف کردن و حذف Pod
برای stop کردن پاد و تمام کانتینرهای آن می توان از دستور زیر استفاده کرد:
$ podman pod stop mypod
برای حذف (remove) کردن پاد و تمام کانتینرهای آن می توان از دستور زیر استفاده کرد:
$ podman pod rm mypod
اجرای خودکار Pod ها و کانتینر ها
در مثال گفته شده ما فقط پاد و کانتینر های آن را اجرا کردیم. نکته ای که وجود دارد پس از reboot سیستم این پادها و کانتینر ها به صورت خودکار اجرا نخواهند شد. برای اجرای خودکار پادها و یا کانتینر ها باید از Quadlet استفاده کرد.
Quadlet قابلیتی در Podman است که به شما اجازه میدهد کانتینرها و پادها را مستقیماً با استفاده از systemd مدیریت کنید، بدون اینکه لازم باشد فایلهای سرویس systemd را بهصورت دستی بنویسید. در Quadlet شما فایلهای سادهای با پسوندهایی مثل
.pod
.volume
.container
.network
ایجاد میکنید و systemd بهصورت خودکار آنها را به یونیتهای قابل اجرا تبدیل میکند. این روش باعث میشود مدیریت کانتینرها ساختیافتهتر، پایدارتر و قابل اطمینانتر باشد و امکاناتی مثل اجرای خودکار هنگام Boot، ریاستارت خودکار و تعریف وابستگیها را فراهم میکند. Quadlet بهویژه برای اجرای کانتینرها بهصورت rootless و مدیریت آنها با دستور systemctl –user بسیار کاربردی است.
اکنون برای پاد و کانتینرهایی که در مثال قبل ایجاد کردیم، می خواهیم فایل های Quadlet را ایجاد کنیم تا پاد و کانتینرها به صورت خودکار پس از reboot سیستم اجرا شوند. نکته اینکه linger باید برای کاربر شما فعال شده باشد. برای بررسی این موضوع می توانید دستور زیر را اجرا کنید:
$ loginctl show-user $USER -p Linger
بجای USER$ نیز می توانید نام کاربری مورد نظر خودتان را بنویسید. در صورت غیر فعال بودن linger می توانید با استفاده از دستور زیر آن را برای کاربر فعال کنید:
sudo loginctl enable-linger $USER
بجای USER$ نیز می توانید نام کاربری مورد نظر خودتان را بنویسید. اکنون برای ایجاد فایل های Quadlet می توانید مراحل زیر را انجام دهید.
۱. ابتدا اگر پوشه های زیر وجود ندارند را ایجاد کنید:
$ mkdir -p ~/.config/containers/systemd
۲. فایل زیر را برای پاد ایجاد کنید:
$ vi ~/.config/containers/systemd/mypod.pod
تنظیمات زیر را درون فایل mypod.pod قرار دهید و ذخیره کنید:
[Pod]
PodName=mypod
PublishPort=8080:8080
گزینه ی PublishPort در واقع معادل p- در دستور podman است.
۳. فایل زیر را برای کانتینر برنامه ایجاد کنید:
$ vi ~/.config/containers/systemd/webapp-container.container
تنظیمات زیر را درون فایل webapp-container.container قرار دهید و ذخیره کنید:
[Container]
Pod=mypod.pod
Image=webapp[Unit]
Requires=redis-container.service
After=redis-container.service[Service]
Restart=always[Install]
WantedBy=default.target
گزینه Image همان ایمیج (با tag) کانتینر رو مشخص می کند.
در بخش [Unit] گزینهی Requires را روی redis-container.service تنظیم میکنیم تا برنامه فقط زمانی اجرا شود که پایگاه داده اجرا شده باشد. همچنین گزینهی After را تنظیم میکنیم تا اطمینان حاصل شود که هر دو کانتینر بهصورت همزمان (موازی) اجرا نشوند.
۴. فایل زیر را برای کانتینر redis ایجاد کنید:
$ vi ~/.config/containers/systemd/redis-container.container
تنظیمات زیر را درون فایل redis-container.container قرار دهید و ذخیره کنید:
[Container]
Pod=mypod.pod
Image=redis[Service]
Restart=always[Install]
WantedBy=default.target
۵. برای اینکه systemd فایل سرویس جدید را شناسایی کند، این دستور را اجرا کنید:
$ systemctl --user daemon-reload
۶. اکنون برای اجرای کانتینر می توانید دستور زیر را اجرا کنید:
$ systemctl --user start webapp-container
پس از اجرای دستور گفته شده از آنجایی که مشخص کردیم که webapp-container به redis-container وابستگی (Dependency) دارد، پس ابتدا کانتینر redis اجرا می شود و سپس کانتینر برنامه اجرا می شود. اگر بخواهیم دقیق تر بگوییم، ابتدا یک پاد که شامل infra کانتینر است ایجاد می شود، سپس redis کانتینر و بعد از آن کانتینر برنامه درون پاد اجرا خواهند شد.
۷. برای بررسی وضعیت سرویس کانتینر می توانید از دستورهای زیر استفاده کنید:
$ systemctl --user status webapp-container
$ podman ps
نتیجهگیری
پادهای Podman یک روش بسیار ساده و قوی برای گروهبندی و مدیریت کانتینرها فراهم میکنند. اگر برنامه ای دارید که شامل چند کانتینر است و آنها باید با هم کار کنند، پادهای Podman به شما امکان میدهند این کار را به روشی مشابه Kubernetes، اما بدون پیچیدگیهای کامل آن، انجام دهید.
ادامه دارد …


