SSD Nodes Learn 🎉 VPS เริ่ม $5.50/เดือน
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-08-13

เปรียบเทียบความแตกต่าง FreeBSD jails กับ Docker containers

เจาะลึกความแตกต่างระหว่าง FreeBSD jails และ Docker containers ทั้งด้านการจัดการ userland การใช้ layered images การควบคุมทรัพยากร และการทำงานของระบบเครือข่าย เพื่อเลือกใช้ให้เหมาะกับงาน

การเปรียบเทียบ FreeBSD jails กับ Docker containers ในย่อหน้าเดียว

FreeBSD jails และ Docker containers แก้ปัญหาเดียวกันด้วยรูปแบบที่แตกต่างกัน ทั้งสองเทคโนโลยีรัน userland แบบแยกส่วนบน kernel เดียวกัน จึงไม่ใช่ virtual machine ทั้งคู่ สิ่งที่แตกต่างกันคือสิ่งที่อยู่ภายใน Docker container จะรันกระบวนการเดียวจาก layered image ที่ดึงมาจาก registry ส่วน jail จะรัน FreeBSD userland ที่สมบูรณ์ ซึ่งประกอบด้วย /etc ของตนเอง, สคริปต์เริ่มต้นระบบ rc ของตนเอง, ฐานข้อมูล pkg ของตนเอง และสามารถรันกระบวนการได้มากเท่าที่ต้องการ ความแตกต่างเกือบทั้งหมดที่เหลือในหน้านี้ล้วนมีที่มาจากจุดนี้เพียงจุดเดียว

SSD Nodes ไม่มีอิมเมจ FreeBSD ให้บริการ คุณไม่สามารถเช่าเซิร์ฟเวอร์ FreeBSD บนแพลตฟอร์มนี้ได้ และเนื้อหาด้านล่างนี้ไม่ใช่คู่มือการติดตั้งสำหรับเครื่องที่คุณสามารถซื้อได้จากที่นี่ นี่เป็นการเปรียบเทียบรูปแบบการแยกส่วนสองแบบ เพื่อให้คุณสามารถตัดสินใจได้ว่า workload ของคุณต้องการแบบใด และเพื่อให้คุณสามารถอ่านการตั้งค่าของทีมงาน FreeBSD ได้โดยไม่ต้องคาดเดา

Jail คืออะไร

Jail ถูกนำมาใช้ใน FreeBSD 4.0 เมื่อเดือนมีนาคม 2000 ซึ่งเก่าแก่กว่า cgroups และมีอายุมากกว่า Docker ประมาณหนึ่งทศวรรษ กลไกนี้ทำงานผ่านการเรียกใช้งาน kernel เพียงครั้งเดียว jail(8) จะนำโครงสร้างไดเรกทอรีมาเริ่มต้นกระบวนการทำงานภายในโดยแนบ jail ID ไว้ จากนั้น kernel จะปฏิเสธการดำเนินการตามชุดคำสั่งที่กำหนดไว้สำหรับกระบวนการใดก็ตามที่มี ID ดังกล่าว กระบวนการที่อยู่ใน jail จะไม่สามารถมองเห็นกระบวนการภายนอก jail ไม่สามารถ mount หรือ unmount ระบบไฟล์ ไม่สามารถโหลด kernel module และไม่สามารถ bind เข้ากับ network address ที่ไม่ได้ถูกกำหนดให้ jail นั้นได้ ไม่มี namespace แยกประเภทให้ต้องเรียนรู้และไม่มีการเลือกเปิดใช้งานทีละฟีเจอร์: ข้อจำกัดทั้งหมดจะมาเป็นชุดเดียว โดยปรับแต่งได้ผ่านพารามิเตอร์ในไฟล์ config ของ jail

บนโฮสต์ jls จะแสดงรายการ jail ที่กำลังทำงานอยู่ และ jexec web sh จะพาคุณเข้าสู่ shell ภายใน jail ที่ระบุชื่อ web

คุณสามารถสร้าง jail ได้โดยการวาง FreeBSD userland ลงในไดเรกทอรี ซึ่งระบบพื้นฐานจะจัดการส่วนนี้ให้คุณ:

sudo bsdinstall jail /usr/local/jails/containers/web

คำสั่งดังกล่าวจะดึงชุด base distribution สำหรับ release ของคุณและรันขั้นตอนหลังการติดตั้งตามปกติ ดังนั้นคุณจึงต้องตั้งรหัสผ่าน 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;
}

เริ่มการทำงานของ jail แล้วตรวจสอบสถานะ:

sudo service jail start web
jls

jls ควรแสดงรายการ web พร้อมกับ JID, hostname และ IP address หาก jail ไม่ปรากฏขึ้น ให้รัน sudo jail -c web โดยตรง คำสั่งนี้จะใช้การตั้งค่าเดียวกันใน foreground และแสดงพารามิเตอร์ที่ไม่สามารถยอมรับได้ แทนที่จะทิ้งข้อผิดพลาดไว้ใน output ของ service

บรรทัดที่ควรค่าแก่การอ่านซ้ำคือ exec.start = "/bin/sh /etc/rc" การเริ่ม jail จะเป็นการรันสคริปต์บูตตามปกติของ FreeBSD ภายใน jail นั้น ดังนั้น jail จะเริ่มบริการทุกอย่างที่เปิดใช้งานไว้ใน /etc/rc.conf ของตัวมันเอง ซึ่ง Docker container ไม่มีขั้นตอนที่เทียบเท่ากัน เนื่องจาก Docker จะรันเฉพาะกระบวนการ 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-RELEASE

bastille 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 web

bastille 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 copy ของ jail ขนาด 3 GB จึงแทบไม่เสียพื้นที่ดิสก์จนกว่าคุณจะเริ่มแก้ไขข้อมูล นี่คือวิธีที่ผู้ดูแลระบบ FreeBSD สร้าง jail ที่ "เหมือนกับ production" เพื่อซ้อมการอัปเกรด

การอัปเกรดระบบพื้นฐาน (base system) จะแยกจากแพ็กเกจ สำหรับ jail ที่เก็บสำเนา userland ของตัวเอง:

sudo freebsd-update -b /usr/local/jails/containers/web fetch install

Thin 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:web

rctl -hu jail:web จะแสดงการใช้งานปัจจุบันของ jail ในรูปแบบที่อ่านง่าย คุณจึงเห็นได้ว่ามีการใช้งานใกล้ถึงขีดจำกัดเพียงใดก่อนที่จะเกิดปัญหา การตั้งค่า action เป็น deny จะทำให้การจัดสรรทรัพยากรที่เกินขีดจำกัดล้มเหลวภายใน jail เอง คุณจึงเห็นข้อผิดพลาดจากการจัดสรรของแอปพลิเคชันโดยตรง แทนที่จะเห็นข้อความการสั่ง kill จากฝั่ง host

กฎที่เพิ่มด้วย 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 แต่เลเยอร์นี้รองรับเพียงชุดคำสั่ง system call บางส่วนของ Linux เท่านั้น และไม่ใช่คำตอบสำหรับภาพดิสก์ Linux ทั่วไป

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 ทั้งบริการ, เมื่อบริการของคุณเป็นแบบ FreeBSD native, เมื่อคุณต้องการ full 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 จะเหมาะสมกว่า

FreeBSD jails ปลอดภัยกว่า Docker containers หรือไม่

ทั้งสองอย่างใช้ kernel ของโฮสต์ร่วมกัน ดังนั้นบั๊กใน kernel จึงเป็นความเสี่ยงของทั้งคู่ และไม่ใช่ขอบเขตที่คุณควรเลือกใช้สำหรับโค้ดที่ไม่น่าเชื่อถืออย่างแท้จริง ความแตกต่างอยู่ที่จุดเริ่มต้น Jail เริ่มต้นด้วยการปฏิเสธการทำงานส่วนใหญ่และคุณต้องเปิดใช้งานทีละพารามิเตอร์ ส่วน Docker container เริ่มต้นด้วยสิทธิ์ root ภายในชุดของ namespaces โดยมีการลดขีดความสามารถ (capabilities) ลงบางส่วน และการเพิ่มความปลอดภัยต้องทำด้วยตนเอง ในทางปฏิบัติ การตั้งค่ามีความสำคัญมากกว่ารูปแบบ: jail ที่รันโดยเปิดใช้งาน allow.mount และ allow.raw_sockets ไม่ได้ปลอดภัยไปกว่า container ที่ได้รับการตั้งค่ามาอย่างระมัดระวัง

ฉันจะสำรองข้อมูล 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 หรือแค่ระบบพื้นฐานก็เพียงพอแล้ว

ระบบพื้นฐานเพียงพอแล้วและเป็นจุดเริ่มต้นที่ดีกว่า jail.conf, jls, jexec และ service jail start ครอบคลุมรูปแบบการทำงานทั้งหมด และเมื่อคุณเข้าใจคำสั่งเหล่านี้แล้ว คุณจะสามารถอ่านค่าโฮสต์ FreeBSD ใดๆ ได้โดยไม่ต้องเรียนรู้เครื่องมือเฉพาะของโฮสต์นั้นก่อน Bastille เป็นเลเยอร์อำนวยความสะดวกที่อยู่เหนือระบบพื้นฐาน: มันช่วยเตรียมการติดตั้ง (bootstrap), สร้าง thin jails, ใช้ template และเขียนกฎการเปลี่ยนเส้นทาง pf ให้คุณ ให้เรียนรู้คำสั่งพื้นฐานก่อน แล้วค่อยเพิ่ม Bastille เมื่อจำนวนของ jails ทำให้การพิมพ์คำสั่งเริ่มน่าเบื่อหน่าย