jail قدیمیترین روش کانتینر در دنیای یونیکس است. هر jail فایلسیستم، کاربران، فرایندها و IP خودش را دارد، ولی هسته را با میزبان به اشتراک میگذارد.
۱. ساخت پوشهی jail
اگر ZFS دارید، هر jail یک dataset باشد تا بتوانید جداگانه از آن snapshot بگیرید:
zfs create -o mountpoint=/usr/local/jails tank/jails
zfs create tank/jails/www۲. نصب سیستم پایه در jail
REL=$(freebsd-version -u | sed 's/-p[0-9]*$//') # e.g. 15.0-RELEASE
fetch -o /tmp/base.txz "https://download.freebsd.org/releases/amd64/${REL}/base.txz"
tar -xf /tmp/base.txz -C /usr/local/jails/www --unlink
cp /etc/resolv.conf /usr/local/jails/www/etc/
cp /etc/localtime /usr/local/jails/www/etc/۳. تعریف در jail.conf
/etc/jail.conf:
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.clean;
mount.devfs;
devfs_ruleset = 4;
www {
host.hostname = "www.corp.sahor.ir";
path = "/usr/local/jails/${name}";
ip4.addr = "vtnet0|192.168.10.31/24";
allow.raw_sockets = 0;
}نام کارت شبکه (vtnet0) را با خروجی ifconfig جایگزین کنید. IP جداگانه روی همان کارت بهصورت alias اضافه میشود.
۴. اجرا
sysrc jail_enable=YES
sysrc jail_list+=www
service jail start www
jls۵. کار داخل jail
jexec www sysrc nginx_enable=YES
jexec www env ASSUME_ALWAYS_YES=yes pkg bootstrap
jexec www pkg install -y nginx
jexec www service nginx start
fetch -qo - http://192.168.10.31/ | head -3پیکربندی Nginx داخل jail در مسیر /usr/local/jails/www/usr/local/etc/nginx/ روی میزبان قابل ویرایش است.
اگر فایروال PF روی میزبان دارید، برای IP جدید jail قانون pass اضافه کنید.
۶. بهروزرسانی
# Base system of the jail
freebsd-update -b /usr/local/jails/www fetch install
# Packages inside the jail
pkg -j www upgrade -y
service jail restart www۷. snapshot پیش از تغییر
zfs snapshot tank/jails/www@before-upgrade
# if something breaks:
service jail stop www && zfs rollback tank/jails/www@before-upgrade && service jail start wwwبرای مدیریت دهها jail، ابزارهایی مثل bastille (از pkg) ساخت و بهروزرسانی را سادهتر میکنند. ولی دانستن روش دستی بالا برای عیبیابی ضروری است.