เปรียบเทียบความต่าง FreeBSD Jails กับ Docker Containers
เจาะลึกความแตกต่างระหว่าง FreeBSD Jails และ Docker Containers ทั้งด้านการจัดการ Userland การแยกส่วนทรัพยากร และระบบเครือข่าย เพื่อให้คุณเลือกใช้งานได้เหมาะสมกับ Workload ของคุณ
การเปรียบเทียบ FreeBSD jails กับ Docker containers ในย่อหน้าเดียว
FreeBSD jails และ Docker containers แก้ปัญหาเดียวกันด้วยรูปแบบที่ต่างกัน ทั้งคู่รัน userland แบบแยกส่วนบน kernel เดียวกัน จึงไม่ใช่ virtual machine ทั้งคู่ สิ่งที่ต่างกันคือสิ่งที่อยู่ภายใน Docker container รันหนึ่ง process จาก layered image ที่ดึงมาจาก registry ส่วน jail รัน FreeBSD userland ที่สมบูรณ์ มี /etc ของตัวเอง มี rc startup scripts ของตัวเอง มีฐานข้อมูล pkg ของตัวเอง และรันกี่ process ก็ได้ตามต้องการ ความแตกต่างเกือบทั้งหมดในหน้านี้ล้วนมีที่มาจากจุดนี้
SSD Nodes ไม่มี image ของ FreeBSD ให้บริการ คุณไม่สามารถเช่าเซิร์ฟเวอร์ FreeBSD บนแพลตฟอร์มนี้ได้ และเนื้อหาด้านล่างนี้ไม่ใช่คู่มือการติดตั้งสำหรับเครื่องที่คุณซื้อได้จากที่นี่ นี่เป็นการเปรียบเทียบรูปแบบการแยกส่วน (isolation model) สองแบบ เพื่อให้คุณระบุได้ว่า workload ของคุณต้องการแบบใด และเพื่อให้คุณสามารถอ่านการตั้งค่าของทีม FreeBSD ได้โดยไม่ต้องคาดเดา
Jail คืออะไร
Jail ถูกนำมาใช้ใน FreeBSD 4.0 เมื่อเดือนมีนาคม 2000 ซึ่งเก่าแก่กว่า cgroups และมีอายุมากกว่า Docker ประมาณหนึ่งทศวรรษ กลไกนี้ทำงานผ่านการเรียกใช้ kernel เพียงครั้งเดียว jail(8) จะนำโครงสร้างไดเรกทอรีมาเริ่มต้นกระบวนการทำงานภายในโดยแนบ jail ID ไว้ จากนั้น kernel จะปฏิเสธการดำเนินการตามชุดคำสั่งที่กำหนดไว้สำหรับกระบวนการใดก็ตามที่มี ID ดังกล่าว กระบวนการที่อยู่ใน jail จะไม่สามารถมองเห็นกระบวนการภายนอก jail ไม่สามารถ mount หรือ unmount ระบบไฟล์ ไม่สามารถโหลด kernel module และไม่สามารถ bind เข้ากับที่อยู่เครือข่ายที่ไม่ได้กำหนดไว้ให้ jail นั้นได้ โดยไม่มีประเภท namespace แยกต่างหากให้ต้องเรียนรู้และไม่มีการเลือกเปิดใช้งานรายฟีเจอร์ ข้อจำกัดทั้งหมดจะมาเป็นหน่วยเดียวและปรับแต่งได้ผ่านพารามิเตอร์ในไฟล์ config ของ jail
บนโฮสต์ jls จะแสดงรายการ jail ที่กำลังทำงานอยู่ และ jexec web sh จะนำคุณเข้าสู่ shell ภายใน jail ที่ระบุชื่อว่า web
คุณสามารถสร้าง jail ได้โดยการนำ FreeBSD userland ไปวางไว้ในไดเรกทอรี ซึ่งระบบพื้นฐานจะดำเนินการส่วนนี้ให้คุณ:
sudo bsdinstall jail /usr/local/jails/containers/webคำสั่งดังกล่าวจะดึงชุดการแจกจ่ายพื้นฐานสำหรับรุ่นที่คุณใช้งานและรันขั้นตอนหลังการติดตั้งตามปกติ คุณจึงสามารถตั้งรหัสผ่าน root และเลือกเขตเวลาได้เหมือนกับการตั้งค่าเซิร์ฟเวอร์ใหม่ ผลลัพธ์ที่ได้คือการติดตั้ง FreeBSD ที่อยู่ในโฟลเดอร์ จากนั้นคุณต้องระบุรายละเอียดใน /etc/jail.conf:
web {
host.hostname = "web.example.internal";
path = "/usr/local/jails/containers/web";
ip4.addr = "10.0.0.10";
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
mount.devfs;
}เริ่มการทำงานแล้วตรวจสอบสถานะ:
sudo service jail start web
jlsjls ควรแสดงรายการ web พร้อมกับ JID, hostname และที่อยู่ IP หาก jail ไม่ปรากฏขึ้น ให้รัน sudo jail -c web โดยตรง คำสั่งนี้จะใช้การตั้งค่าเดียวกันใน foreground และแสดงพารามิเตอร์ที่ไม่สามารถยอมรับได้ แทนที่จะทิ้งข้อผิดพลาดไว้ใน output ของ service
บรรทัดที่ควรทำความเข้าใจให้ชัดเจนคือ exec.start = "/bin/sh /etc/rc" การเริ่ม jail จะเป็นการรันสคริปต์บูตตามปกติของ FreeBSD ภายใน jail นั้น ดังนั้น jail จะเริ่มบริการทุกอย่างที่เปิดใช้งานไว้ใน /etc/rc.conf ของตัวมันเอง ซึ่ง Docker container ไม่มีขั้นตอนที่เทียบเท่ากัน เนื่องจากมันจะรันเฉพาะกระบวนการ entrypoint ของ image และหยุดทำงานเมื่อกระบวนการนั้นสิ้นสุดลง
วิธีการนำซอฟต์แวร์เข้ามาใช้งาน: ระหว่างอิมเมจและรีจิสทรีกับสภาพแวดล้อมที่คุณติดตั้งเอง
นี่คือความแตกต่างที่คุณจะสัมผัสได้ตั้งแต่วันแรก
สำหรับ Docker คุณเพียงระบุชื่อซอฟต์แวร์แล้วระบบจะจัดหามาให้ docker pull nginx จะดึงอิมเมจแบบแบ่งเลเยอร์และระบุด้วยเนื้อหา (content-addressed) ซึ่งมีผู้อื่นสร้างและทดสอบไว้แล้ว ส่วน docker compose up -d จะเริ่มการทำงานของอิมเมจนั้นพร้อมกับเชื่อมต่อโวลุ่มและเครือข่ายให้เสร็จสรรพ รีจิสทรีคือหัวใจสำคัญของผลิตภัณฑ์นี้ คุณค่าส่วนใหญ่ในขั้นตอนการทำงานของ Docker คือการที่โครงการนับพันโครงการเผยแพร่อิมเมจที่ใช้งานได้จริง ซึ่งทำให้การ รัน Docker บน VPS เป็นงานที่ใช้เวลาสั้นๆ แทนที่จะเป็นโครงการใหญ่
FreeBSD ไม่มีรีจิสทรีสาธารณะสำหรับอิมเมจ jail มาให้โดยค่าเริ่มต้น คุณต้องสร้าง userland เปล่าๆ ขึ้นมาแล้วติดตั้งซอฟต์แวร์ลงไปในนั้น เช่นเดียวกับการตั้งค่าเซิร์ฟเวอร์เปล่า วิธีนี้อาจต้องพิมพ์คำสั่งมากกว่า แต่มีความโปร่งใสมากกว่า เพราะสิ่งที่รันอยู่ใน jail คือสิ่งที่ pkg ติดตั้งลงไป โดยใช้ชุดแพ็กเกจเดียวกันกับที่โฮสต์ใช้งาน
เครื่องมือต่างๆ ช่วยให้งานนี้สั้นลง BastilleBSD เป็นตัวจัดการ jail ที่นิยมใช้และอยู่ในรูปแบบแพ็กเกจ:
sudo pkg install bastille
sudo sysrc bastille_enable=YES
sudo bastille setup
sudo bastille bootstrap 15.1-RELEASEbastille setup จะกำหนดค่าเครือข่าย พื้นที่จัดเก็บข้อมูล และไฟร์วอลล์ให้คุณ bastille bootstrap จะดาวน์โหลดรีลีสมาเพียงครั้งเดียว และ jail ทุกตัวที่คุณสร้างหลังจากนั้นจะนำรีลีสนั้นกลับมาใช้ใหม่ FreeBSD 15.1 คือรีลีสสำหรับใช้งานจริงในปัจจุบัน ซึ่งออกมาเมื่อเดือนมิถุนายน 2026 ให้แทนที่ด้วยรีลีสที่คุณใช้งานอยู่
การสร้าง jail จึงทำได้ด้วยคำสั่งเดียว และการติดตั้งซอฟต์แวร์ลงไปก็ทำได้อีกเพียงคำสั่งเดียว:
sudo bastille create web 15.1-RELEASE 10.17.89.10/24
sudo bastille pkg web install nginx
sudo bastille service web nginx start
sudo bastille console webbastille console web จะให้ shell สำหรับล็อกอินเข้าไปใน jail และ bastille list จะแสดงสิ่งที่อยู่บนโฮสต์ หากต้องการทำซ้ำขั้นตอนการสร้าง Bastille templates จะเก็บขั้นตอนต่างๆ ไว้ในไฟล์และนำไปปรับใช้กับ jail ซึ่งถือเป็นสิ่งที่ใกล้เคียงกับ Dockerfile มากที่สุดในโลกนี้ เทมเพลตจะถูกนำมาใช้ซ้ำกับ jail แต่ละตัว โดยไม่มีสิ่งใดที่ถูกสร้างสำเร็จรูปมาให้
สรุปสั้นๆ ตามความเป็นจริงคือ Docker มอบสิ่งที่คนอื่นสร้างไว้ให้คุณ ส่วน Jails มอบสิ่งที่ตัวคุณเองติดตั้ง หากซอฟต์แวร์ในรายการที่คุณต้องการมีให้ใช้งานในรูปแบบ container image เท่านั้น นั่นก็ถือเป็นการตัดสินใจที่จบลงก่อนที่จะต้องพิจารณาปัจจัยอื่นใดอีก
สถานะและการอัปเกรด: ส่วนที่ ZFS เปลี่ยนแปลง
Docker แยกสถานะของระบบออกมาโดยเจตนา ระบบไฟล์ของคอนเทนเนอร์เป็นแบบชั่วคราว ข้อมูลของคุณจะอยู่ใน named volume หรือ bind mount และการอัปเกรดคือการใช้ docker compose pull ตามด้วย docker compose up -d คอนเทนเนอร์จะถูกแทนที่ และทุกอย่างที่คุณไม่ได้เก็บไว้ใน volume จะสูญหายไป นี่คือคุณสมบัติเมื่อคุณปฏิบัติตามกฎ แต่จะเป็นเหตุการณ์ข้อมูลสูญหายเมื่อคุณลืมมัน ซึ่งเป็นเหตุผลว่าทำไม การเลือกระหว่าง bind mounts และ named volumes จึงมีความสำคัญอย่างมากใน Compose stack
Jail ไม่ได้แยกสถานะออกจากกัน และ ZFS คือเหตุผลที่ทำให้แนวทางนี้ใช้งานได้ Jail ทั้งหมดคือ dataset เดียว:
sudo zfs snapshot zroot/jails/containers/web@pre-upgrade
sudo pkg -j web upgrade
sudo zfs rollback zroot/jails/containers/web@pre-upgradeตรวจสอบชื่อ dataset ที่แท้จริงด้วย zfs list ก่อนที่คุณจะรันคำสั่งนี้ พาธด้านบนคือโครงสร้างที่คู่มือใช้งาน การทำ snapshot ใช้เวลาประมาณหนึ่งวินาทีและแทบไม่ใช้พื้นที่จัดเก็บจนกว่าเนื้อหาภายใน Jail จะมีการเปลี่ยนแปลง หากการอัปเกรดทำให้บริการใช้งานไม่ได้ การทำ rollback จะคืนค่า userland ทั้งหมดกลับสู่สถานะก่อนหน้า รวมถึงฐานข้อมูลแพ็กเกจและไฟล์คอนฟิกที่คุณแก้ไขด้วยตนเองตอนตี 2 Docker ไม่มีฟีเจอร์นี้ในตัว เพราะโมเดลของมันตั้งสมมติฐานว่าคุณไม่เคยต้องการมัน
zfs clone คืออีกครึ่งหนึ่งที่สำคัญ การทำ clone จาก snapshot คือการสร้าง Jail ใหม่ที่เขียนข้อมูลได้ซึ่งใช้บล็อกข้อมูลร่วมกับ parent โดยไม่มีการเปลี่ยนแปลง ดังนั้นการสร้างสำเนา staging ของ Jail ขนาด 3 GB จึงแทบไม่ใช้พื้นที่ดิสก์จนกว่าคุณจะเริ่มแก้ไขข้อมูล นี่คือวิธีที่ผู้ดูแลระบบ FreeBSD สร้าง Jail ที่ "เหมือนกับระบบผลิตจริง" เพื่อซ้อมการอัปเกรด
การอัปเกรดระบบพื้นฐาน (base system) จะแยกจากแพ็กเกจ สำหรับ Jail ที่เก็บสำเนา userland ของตัวเอง:
sudo freebsd-update -b /usr/local/jails/containers/web fetch installThin jails ช่วยหลีกเลี่ยงการทำงานซ้ำซ้อน โดยจะ mount base ที่เป็นแบบอ่านอย่างเดียว (read-only) ร่วมกันผ่าน nullfs และให้แต่ละ Jail มีเลเยอร์ที่เขียนข้อมูลได้ขนาดเล็กเป็นของตัวเอง ดังนั้นคุณจึงแพตช์ base เพียงครั้งเดียวและทุก Jail จะเห็นผลลัพธ์นั้น Bastille จะสร้าง thin jails เป็นค่าเริ่มต้น
ระบบเครือข่าย: การเปิดพอร์ตเทียบกับการตัดสินใจด้านแอดเดรส
Docker จัดการระบบเครือข่ายให้คุณและขอให้คุณระบุข้อยกเว้นในการเปิดพอร์ต คอนเทนเนอร์จะถูกวางไว้บน bridge และสามารถติดต่อกันได้ผ่านชื่อบริการบนเครือข่ายที่ผู้ใช้กำหนดเอง ส่วน -p 8080:80 จะทำหน้าที่เปิดเผยคอนเทนเนอร์หนึ่งตัวไปยังโฮสต์ Docker จะเขียนกฎ packet filter ของตัวเองเพื่อให้สิ่งนี้เกิดขึ้น ซึ่งเป็นวิธีที่ พอร์ตของคอนเทนเนอร์ที่ถูกเปิดไว้สามารถข้ามผ่าน ufw ได้โดยตรง
Jail บังคับให้คุณต้องเลือกรุ่นการทำงานตั้งแต่ต้น ซึ่งมีอยู่ 2 รูปแบบ
Shared IP. ip4.addr = "10.0.0.10" จะเพิ่มแอดเดรสนั้นเข้าไปยังอินเทอร์เฟซที่มีอยู่ของโฮสต์และจำกัดให้ jail ใช้งานเฉพาะแอดเดรสนั้น Jail จะไม่มี network stack เป็นของตัวเอง จึงไม่สามารถรัน firewall ของตนเองได้ นอกจากนี้ยังไม่สามารถ bind เข้ากับทุกแอดเดรสได้จริง: socket ใน jail ที่ร้องขอ 0.0.0.0 จะถูก kernel เขียนทับให้เป็นแอดเดรสของ jail นั้นเอง Jail สองตัวไม่สามารถฟังพอร์ต 80 ของแอดเดรสเดียวกันพร้อมกันได้ ดังนั้นคุณต้องกำหนดแอดเดรสให้แต่ละตัว หรือวาง reverse proxy ไว้ด้านหน้า
VNET. การเพิ่ม vnet; เข้าไปใน jail จะทำให้มันได้รับ network stack เต็มรูปแบบ ได้แก่ อินเทอร์เฟซของตัวเอง, ตาราง routing ของตัวเอง และกฎ firewall ของตัวเอง คุณต้องเชื่อมต่อมันเข้ากับโฮสต์ด้วย epair ซึ่งเป็นสายเคเบิลเสมือนที่มีปลายด้านหนึ่งอยู่แต่ละฝั่ง และวางฝั่งโฮสต์ไว้บน bridge นี่คือรูปแบบที่ใกล้เคียงที่สุดกับสิ่งที่ Docker มอบให้คุณ และเป็นโหมดที่อยู่เบื้องหลัง jail ประเภท -V และ -B ของ Bastille
การส่งต่อพอร์ตของโฮสต์เข้าไปยัง jail คือกฎการเปลี่ยนเส้นทาง pf โดย Bastille จะครอบการทำงานนี้ไว้:
sudo bastille rdr web tcp 80 80ไม่มี EXPOSE และไม่มีการเปิดพอร์ตอัตโนมัติ จะไม่มีสิ่งใดเข้าถึง jail ได้เว้นแต่แอดเดรสหรือกฎการเปลี่ยนเส้นทางจะอนุญาต ซึ่งทำให้การเริ่มต้นใช้งานช้ากว่าและมี firewall ที่เงียบกว่ามาก
การจำกัดทรัพยากร: cgroups เทียบกับ rctl
Docker จำกัดการใช้งานของคอนเทนเนอร์ด้วย cgroups โดยการจำกัดจะถูกกำหนดไว้ในที่เดียวกับที่นิยามคอนเทนเนอร์ไว้ นั่นคือ --memory=1g --cpus=1.5 บนบรรทัดคำสั่ง หรือคีย์ที่สอดคล้องกันในไฟล์ Compose หากคุณเก็บ stack ของคุณไว้ใน ไฟล์ Docker Compose บน VPS อยู่แล้ว การจำกัดทรัพยากรจะอยู่คู่กับบริการที่ถูกจำกัดและถูกบันทึกไปพร้อมกันใน git
FreeBSD ใช้ rctl ซึ่งเป็นระบบย่อยที่คุณต้องเปิดใช้งานเอง การบันทึกบัญชีทรัพยากรจะถูกปิดไว้โดยค่าเริ่มต้นเนื่องจากมีภาระงานเล็กน้อยในการจัดสรรแต่ละครั้ง ให้เพิ่ม tunable ลงใน /boot/loader.conf แล้วรีบูตเครื่อง:
kern.racct.enable=1จากนั้นกำหนดกฎและตรวจสอบการใช้งาน:
sudo rctl -a jail:web:vmemoryuse:deny=1g
rctl -hu jail:webrctl -hu jail:web จะแสดงการใช้งานปัจจุบันของ jail ในหน่วยที่มนุษย์อ่านเข้าใจได้ คุณจึงเห็นว่าการใช้งานใกล้ถึงขีดจำกัดเพียงใดก่อนที่จะเกิดปัญหา การกระทำ deny จะทำให้การจัดสรรทรัพยากรที่เกินขีดจำกัดล้มเหลวภายใน jail เอง คุณจึงเห็นข้อผิดพลาดในการจัดสรรของแอปพลิเคชันแทนที่จะเห็นข้อความการสั่ง kill บนโฮสต์
กฎที่เพิ่มด้วย rctl -a จะหายไปเมื่อรีบูตเครื่องครั้งถัดไป บริการ rctl ของ FreeBSD จะโหลดกฎเหล่านี้ใหม่จาก /etc/rctl.conf ดังนั้นให้เขียนกฎลงในไฟล์ดังกล่าวและเปิดใช้งานบริการ:
sudo sysrc rctl_enable=YESนี่คือจุดที่ Docker มีความสะดวกมากกว่าอย่างชัดเจน การจำกัดทรัพยากรในไฟล์ Compose จะถูกตรวจสอบไปพร้อมกับบริการที่ถูกจำกัดนั้น ในขณะที่กฎ rctl เป็นเพียงบรรทัดหนึ่งในไฟล์แยกต่างหากที่อ้างถึง jail ซึ่งถูกนิยามไว้ที่อื่น
เมื่อคำตอบคือเครื่องเสมือน: bhyve
Jail ใช้งาน kernel ร่วมกับโฮสต์ ดังนั้นบางอย่างจึงไม่สามารถเข้าถึงได้โดยเด็ดขาด Jail ไม่สามารถรัน kernel เวอร์ชันอื่น ไม่สามารถโหลด kernel module และไม่สามารถรัน Linux binary ในลักษณะเดียวกับที่ Linux container ทำได้ FreeBSD มีเลเยอร์ความเข้ากันได้กับ Linux ที่เรียกว่า linuxulator แต่เลเยอร์นี้รองรับเพียงชุดย่อยของ Linux system call เท่านั้น และไม่ใช่คำตอบสำหรับ Linux image ทั่วไป
bhyve คือ hypervisor ของ FreeBSD และเป็นเครื่องมือที่เหมาะสมเมื่อคุณต้องการขอบเขตของเครื่องที่แท้จริง เช่น ระบบปฏิบัติการอื่น, kernel อื่น หรือผู้เช่าที่คุณไม่ต้องการให้ใช้ kernel ร่วมด้วย คุณต้องแลกมาด้วยหน่วยความจำที่ถูกจองไว้แทนที่จะแชร์กัน และต้องดูแล kernel เพิ่มอีกหนึ่งตัว นี่เป็นการตัดสินใจแบบเดียวกับที่คุณต้องทำบน Linux ระหว่างการใช้ container กับเครื่องเสมือนเต็มรูปแบบ และเป็นการตัดสินใจที่กำหนดว่าคุณจำเป็นต้องใช้ VPS ที่รองรับ nested virtualization หรือไม่
ระบบนิเวศ ซึ่งเป็นเหตุผลที่แท้จริงที่ทีมส่วนใหญ่เลือกใช้ Docker
สิ่งที่กล่าวมาข้างต้นทั้งหมดเป็นเรื่องของรูปแบบการทำงาน แต่สิ่งที่ทีมส่วนใหญ่ใช้ตัดสินใจเลือกคือขนาดของโลกที่รายล้อมเทคโนโลยีแต่ละตัว
Docker มาพร้อมกับ Docker Hub และ GHCR, docker compose, Kubernetes เมื่อเซิร์ฟเวอร์เครื่องเดียวไม่เพียงพอ, CI runners ที่รองรับคอนเทนเนอร์มาตั้งแต่ต้น และคำสั่ง quickstart เพียงคำสั่งเดียวในไฟล์ README ของเกือบทุกโปรเจกต์ ในขณะที่ Jails มาพร้อมกับ FreeBSD ports tree ซึ่งมีขนาดใหญ่และได้รับการดูแลอย่างดี รวมถึงชุดแอปพลิเคชันสำเร็จรูปที่มีจำนวนน้อยกว่ามาก เมื่อโปรเจกต์ใดโปรเจกต์หนึ่งเผยแพร่เฉพาะ container image วิธีการของ FreeBSD คือการอ่านเอกสารประกอบและประกอบชิ้นส่วนต่างๆ ด้วยตนเอง
Jails สร้างความคุ้มค่าในอีกด้านหนึ่งของข้อแลกเปลี่ยนนี้ คุณควรเลือกใช้ Jails เมื่อคุณใช้งาน ZFS อยู่แล้วและให้ความสำคัญกับการทำ snapshot และ rollback ทั้งบริการ, เมื่อบริการของคุณเป็น native บน FreeBSD, เมื่อคุณต้องการ userland เต็มรูปแบบแยกตามผู้เช่าแทนที่จะเป็นเพียงกระบวนการเดียว หรือเมื่อคุณต้องการให้ kernel, packet filter, ระบบไฟล์ และเอกสารประกอบได้รับการดูแลไปพร้อมกันในฐานะระบบเดียว ประเด็นสุดท้ายนี้คือสิ่งที่ผู้คนหมายถึงเมื่อเรียก FreeBSD ว่ามีความสอดคล้อง (coherent) ซึ่งมีรายละเอียดเพิ่มเติมใน การเปรียบเทียบ Linux และ FreeBSD ในฐานะแพลตฟอร์มเซิร์ฟเวอร์ และใน สิ่งที่ FreeBSD 15 เปลี่ยนแปลงสำหรับการใช้งานเซิร์ฟเวอร์
บทสรุปส่งท้าย หากทีมของคุณมีความเชี่ยวชาญใน Docker อยู่แล้ว ต้นทุนในการย้ายระบบนั้นมีอยู่จริงและผลตอบแทนที่ได้รับต้องมีความชัดเจน อย่าเปลี่ยนเพียงเพราะต้องการคุณภาพในการแยกส่วน (isolation) เพราะทั้งสองรูปแบบมีความใกล้เคียงกันมากจนการตั้งค่าของคุณมีความสำคัญมากกว่า ให้เปลี่ยนก็ต่อเมื่อคุณต้องการการทำ rollback ทั้งบริการที่รองรับโดย ZFS หรือเพราะคุณใช้งาน FreeBSD อยู่แล้ว
FAQ
ฉันสามารถรัน Docker images บน FreeBSD ได้หรือไม่?
ไม่สามารถรัน Linux images ได้ และไม่ใช่แนวทางที่รองรับอย่างเป็นทางการ FreeBSD มีการรองรับ OCI container: sudo pkg install -y podman-suite จะติดตั้ง Podman ซึ่งรันคอนเทนเนอร์ผ่าน ocijail ซึ่งเป็น runtime ที่สร้าง jails จริงขึ้นมาเบื้องหลัง จำเป็นต้องมีการ mount fdescfs ไว้ที่ /dev/fd สำหรับตัวตรวจสอบคอนเทนเนอร์ และ pf สำหรับทำ NAT (network address translation) ของคอนเทนเนอร์ OCI images ที่เป็น native ของ FreeBSD จะทำงานได้ดีที่สุด ส่วน Linux images จำเป็นต้องใช้เลเยอร์ความเข้ากันได้ของ Linux เพิ่มเติม และ ณ เดือนสิงหาคม 2026 พอร์ต Podman บน FreeBSD ยังคงถูกระบุว่าเป็นรุ่นทดลอง หากการใช้งานของคุณเป็น stack ของ Linux images ให้รันบน Linux จะดีกว่า สำหรับตระกูล RHEL นั่นหมายถึงการ ติดตั้ง Docker บน Rocky Linux หรือ AlmaLinux ซึ่ง Podman จะปรากฏขึ้นมาเป็นแพ็กเกจที่ครอบครองคำสั่ง docker อยู่ก่อนแล้วตั้งแต่ก่อนที่คุณจะติดตั้งสิ่งใดลงไป
FreeBSD jails ปลอดภัยกว่า Docker containers หรือไม่?
ทั้งสองอย่างใช้ kernel ของโฮสต์ร่วมกัน ดังนั้นบั๊กใน kernel จึงเป็นความเสี่ยงของทั้งคู่ และไม่ใช่ขอบเขตที่คุณควรเลือกใช้สำหรับโค้ดที่ไม่น่าเชื่อถืออย่างแท้จริง ความแตกต่างอยู่ที่จุดเริ่มต้น Jail เริ่มต้นด้วยการปฏิเสธการทำงานส่วนใหญ่และคุณต้องเปิดใช้งานทีละพารามิเตอร์ ส่วน Docker container เริ่มต้นด้วยสิทธิ์ root ภายในชุดของ namespaces โดยมีการตัดความสามารถ (capabilities) บางอย่างออก และการเพิ่มความปลอดภัยต้องทำด้วยตนเอง ในทางปฏิบัติ การตั้งค่ามีความสำคัญมากกว่ารูปแบบ: jail ที่รันโดยเปิดใช้งาน allow.mount และ allow.raw_sockets ไม่ได้ปลอดภัยไปกว่าคอนเทนเนอร์ที่ได้รับการตั้งค่ามาอย่างระมัดระวัง
ฉันจะสำรองข้อมูล jail ได้อย่างไร?
ให้ทำ snapshot ของ dataset แล้วส่งข้อมูลนั้นออกไป ใช้ sudo zfs snapshot zroot/jails/containers/web@backup จากนั้น zfs send snapshot นั้นไปยัง pool อื่นหรือไฟล์ที่คุณคัดลอกออกจากเครื่อง เนื่องจาก jail เก็บ userland ทั้งหมดไว้ใน dataset เดียว snapshot จึงบันทึกทั้งแพ็กเกจที่ติดตั้งและข้อมูล ณ จุดเวลาที่สอดคล้องกัน รวมถึงไฟล์ config ทุกไฟล์ที่คุณแก้ไขด้วยตนเอง ซึ่งตรงกันข้ามกับนิสัยของ Docker ที่คุณต้องสำรองข้อมูล named volumes และไฟล์ Compose แล้วค่อยสร้างส่วนที่เหลือขึ้นใหม่จาก image
ฉันจำเป็นต้องใช้ BastilleBSD หรือแค่ base system ก็เพียงพอแล้ว?
base system เพียงพอแล้วและเป็นจุดเริ่มต้นที่ดีกว่า jail.conf, jls, jexec และ service jail start ครอบคลุมรูปแบบการทำงานทั้งหมด และเมื่อคุณเข้าใจคำสั่งเหล่านี้แล้ว คุณจะสามารถอ่านค่าโฮสต์ FreeBSD ใดก็ได้โดยไม่ต้องเรียนรู้เครื่องมือเฉพาะของโฮสต์นั้นก่อน Bastille เป็นเลเยอร์อำนวยความสะดวกที่อยู่เหนือระบบ: มันช่วย bootstrap releases, สร้าง thin jails, ใช้ templates และเขียนกฎการ redirect pf ให้คุณ ให้เรียนรู้คำสั่งพื้นฐานก่อน แล้วค่อยเพิ่ม Bastille เมื่อจำนวนของ jails ทำให้การพิมพ์คำสั่งเริ่มยุ่งยากเกินไป