معرفی و استفاده از Podman – بخش ۲

podman

در بخش ۱ به صورت کلی Podman معرفی شد و نحوه کارکرد آن توضیح داده شد. در این مطلب قصد داریم تا آن را نصب و استفاده کنیم.

نصب Podman در فدورا لینوکس

در فدورا لینوکس معمولا پادمن به صورت پیش فرض نصب می باشد، ولی به هر حال روش نصب به صورت زیر می باشد:

sudo dnf install podman

برای تأیید نصب، می‌توانید یک کانتینر hello-world سریع اجرا کنید:

$ podman pull hello-world
$ podman run hello-world

اگر همه چیز درست بود باید همچین خروجی را دریافت کنید:

podman

شروع با یک برنامه ساده 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، اما بدون پیچیدگی‌های کامل آن، انجام دهید.

 

ادامه دارد …

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.

این سایت از اکیسمت برای کاهش جفنگ استفاده می‌کند. درباره چگونگی پردازش داده‌های دیدگاه خود بیشتر بدانید.