Podman vs Docker: เลือกอันไหนดี?

เผยแพร่แล้ว: 2022-11-23

หากคุณเข้าสู่โลกของการจำลองเสมือนและการบรรจุคอนเทนเนอร์ คุณอาจเคยพบ Podman และ Docker และคุณอาจสงสัยว่าพวกเขาแตกต่างกันอย่างไร

ในโพสต์นี้ เราจะสำรวจความแตกต่างระหว่าง Docker และ Podman และพยายามค้นหาว่าตัวเลือกใดที่เหมาะกับคุณ!

นักเทียบท่า

นักเทียบท่า

Docker เป็นเทคโนโลยีการบรรจุคอนเทนเนอร์ที่อำนวยความสะดวกในการจัดการการพึ่งพาภายในโครงการในทุกระดับ (การพัฒนาและการปรับใช้)

มีให้ใช้งานบน Linux, Windows และ Mac OS กลไกของ Docker จะเน้นที่คอนเทนเนอร์และการประสานกัน และนี่คือจุดที่การทำคอนเทนเนอร์แตกต่างจากการทำเวอร์ชวลไลเซชัน

Docker มีองค์ประกอบหลักสองส่วนคือ Docker CLI และ Docker Daemon

นักเทียบท่าภูต:

เป็นกระบวนการพื้นหลังคงที่ที่ช่วยจัดการอิมเมจ Docker คอนเทนเนอร์ เครือข่าย และปริมาณพื้นที่จัดเก็บ Docker ใช้ Docker Engine REST API เพื่อโต้ตอบกับ Docker daemon ซึ่งเข้าถึงได้ผ่านโปรโตคอล HTTP

นักเทียบท่า CLI:

นักเทียบท่า
เครดิตรูปภาพ: Redhat

เป็นไคลเอนต์บรรทัดคำสั่ง Docker สำหรับการโต้ตอบกับ Docker daemon เป็นสิ่งที่คุณใช้เมื่อคุณเรียกใช้คำสั่ง Docker

การทำงานของ Docker ขึ้นอยู่กับเคอร์เนล Linux และฟังก์ชันของเคอร์เนลนี้ เช่น cgroups และ namespaces ฟังก์ชันเหล่านี้แยกกระบวนการเพื่อให้สามารถทำงานได้อย่างอิสระ เนื่องจากวัตถุประสงค์ของคอนเทนเนอร์คือการเรียกใช้กระบวนการและแอปพลิเคชันหลายรายการแยกกัน

นี่คือสิ่งที่ทำให้สามารถเพิ่มประสิทธิภาพการใช้โครงสร้างพื้นฐานโดยไม่ลดระดับความปลอดภัยเมื่อเทียบกับระบบที่แยกจากกัน

เครื่องมือคอนเทนเนอร์ทั้งหมดเช่น Docker มาพร้อมกับโมเดลการปรับใช้แบบอิมเมจ โมเดลนี้ช่วยลดความยุ่งยากในการแชร์แอปพลิเคชันหรือชุดบริการในสภาพแวดล้อมต่างๆ

นอกจากนี้ Docker ยังช่วยปรับใช้แอปพลิเคชันโดยอัตโนมัติภายในสภาพแวดล้อมคอนเทนเนอร์ ด้วยเครื่องมือต่างๆ เหล่านี้ ผู้ใช้จะสามารถเข้าถึงแอปพลิเคชันได้อย่างเต็มที่ และสามารถเร่งการปรับใช้ ควบคุมเวอร์ชัน และมอบหมายได้

พ็อดแมน

Podman (POD MANager ) สร้าง รัน และจัดการคอนเทนเนอร์ OCI และอิมเมจคอนเทนเนอร์ ได้รับการพัฒนาโดย Red Hat และเดิมมีไว้สำหรับ Linux 8 สำหรับองค์กร มันถูกใช้สำหรับการจัดการคอนเทนเนอร์และทำหน้าที่เป็นผู้สืบทอดอย่างเป็นทางการของ Docker

พ็อดแมน

ด้วยเหตุนี้ Red Hat จึงยุติการสนับสนุน Docker แต่มั่นใจว่าสวิตช์จะง่ายสำหรับผู้ใช้ เนื่องจาก Podman ใช้ Docker แม้ว่าเดิมทีจะมีไว้เป็นเครื่องมือแก้ไขจุดบกพร่องเท่านั้น

จัดการระบบนิเวศคอนเทนเนอร์ทั้งหมดโดยใช้ไลบรารี libpod เนื่องจาก Podman ทำงานบนแพลตฟอร์ม Linux เท่านั้น REST API และไคลเอนต์จึงอยู่ในระหว่างการพัฒนาเพื่อให้ระบบ Mac และ Windows เรียกใช้บริการได้

อย่างไรก็ตาม,   ขณะนี้มีไคลเอนต์ระยะไกลที่ใช้ Varlink ซึ่งทำงานบนแพลตฟอร์ม Mac หรือ Windows ที่อนุญาตให้สื่อสารระยะไกลกับเซิร์ฟเวอร์ Podman ที่ใช้ Linux ไลบรารี libpod รองรับหลายวิธีในการอัปโหลดรูปภาพอย่างปลอดภัย รวมถึงความน่าเชื่อถือและการตรวจสอบรูปภาพ

นอกจากนี้ยังรองรับพ็อดเพื่อจัดการกลุ่มของคอนเทนเนอร์ร่วมกันและรูปแบบภาพที่หลากหลาย รวมถึงรูปแบบภาพ OCI และ Docker

ในสภาพแวดล้อมที่มีขนาดเล็กมากและสามารถจัดการได้ Podman ยังสามารถทำหน้าที่เป็นผู้นำของ Kubernetes ได้อีกด้วย มันเชื่อมช่องว่างระหว่างการจัดการเอกพจน์ของอินสแตนซ์แต่ละรายการจากช่วงปีแรก ๆ ของคอนเทนเนอร์โฆษณาและการประสานที่ทันสมัยด้วย Kubernetes

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

คำสั่ง podman generate kube ให้ไฟล์การกำหนดค่าที่เกี่ยวข้อง สิ่งเหล่านี้จะทำหน้าที่เป็นอินพุตแบบหนึ่งต่อหนึ่งสำหรับเครื่องมือ Kubernetes kubectl

Podman เวอร์ชันปัจจุบันสามารถสร้างไฟล์คอนฟิกูเรชันสำหรับ systemd ซึ่งถือว่าเหมาะสำหรับทุกคนที่ใช้ตัวสืบทอด init ที่แพร่หลายสำหรับการจัดเรียงคอนเทนเนอร์

พ็อดแมนสร้าง
เครดิตรูปภาพ: Redhat

Podman vs Docker: ความแตกต่าง

นักเทียบท่าได้สร้างตัวเองอย่างรวดเร็วในฐานะงานอดิเรกในการจัดการคอนเทนเนอร์ อย่างไรก็ตาม Docker มีข้อดีหลายประการ และเหนือสิ่งอื่นใด ประเภทของรูปภาพที่เติบโตอย่างรวดเร็ว ตลอดจนข้อเสียและความเสี่ยงด้านความปลอดภัยที่อาจเกิดขึ้น นอกจากนี้ Docker ไม่ได้รับการสนับสนุนในฐานะคอนเทนเนอร์สำหรับ Kubernetes อีกต่อไป

ความจริงที่ว่าคอนเทนเนอร์ซึ่งแตกต่างจากระบบเสมือนไม่ต้องการเคอร์เนลมักจะถูกมองว่าเป็นข้อดีอย่างหนึ่ง อย่างไรก็ตาม มีความเสี่ยงด้านความปลอดภัยที่สำคัญกับ Docker เนื่องจากคอนเทนเนอร์ Docker สามารถเรียกใช้ได้ด้วยสิทธิ์ระดับรูทเท่านั้น

อนุญาตให้กระบวนการที่ทำงานในคอนเทนเนอร์เข้าถึงเคอร์เนลด้วยสิทธิ์รูทและโจมตีระบบโฮสต์

ความแตกต่างแรกชัดเจนเมื่อคุณใช้ครั้งแรก แม้ว่า Docker จะกำหนดให้ Docker daemon เริ่มทำงานก่อน แต่คอนเทนเนอร์ Podman สามารถเริ่มได้โดยตรงจากบรรทัดคำสั่ง ดังนั้นจึงไม่มีกระบวนการเบื้องหลัง และแอปพลิเคชันจะดำเนินการเมื่อจำเป็นเท่านั้น

จากมุมมองด้านความปลอดภัย นี่เป็นสิ่งที่ดีเพราะ Podman มีความเสี่ยงน้อยกว่าที่จะถูกโจมตีหาก daemon ไม่จำเป็นต้องทำงานตลอด 24 ชั่วโมงทุกวันด้วยสิทธิ์ของผู้ใช้ขั้นสูง Podman ไม่ต้องการกระบวนการพื้นหลังเนื่องจากสถาปัตยกรรมซึ่งแตกต่างโดยพื้นฐานจาก Docker

ในขณะที่ Docker ทำตามโมเดลไคลเอ็นต์เซิร์ฟเวอร์ โดยที่ไคลเอ็นต์ Docker สื่อสารกับ Docker daemon ผ่าน API แต่ Podman จะทำตามโมเดล fork-exec แต่ละคอนเทนเนอร์ทำงานเป็นกระบวนการย่อยของ Podman

เนมสเปซผู้ใช้ถูกสร้างขึ้นเมื่อใช้งานครั้งแรกเมื่อ Podman ถูกรันด้วยสิทธิ์ผู้ใช้ปกติ ในเนมสเปซผู้ใช้ Podman ทำงานด้วยสิทธิ์ระดับรูทและมีสิทธิ์ในการเมานต์ระบบไฟล์และสร้างคอนเทนเนอร์

ดังนั้นคอนเทนเนอร์ Podman จึงมีสิทธิ์เฉพาะผู้ใช้ที่ดำเนินการเท่านั้น การใช้เนมสเปซของผู้ใช้หมายความว่าผู้ใช้แต่ละคนสามารถสร้างและจัดการคอนเทนเนอร์ของตนเองได้ แต่ผู้ใช้รายอื่นและผู้ใช้ขั้นสูงจะมองไม่เห็นสิ่งเหล่านี้

เนื่องจาก Podman ดำเนินการโดยอิสระจาก Docker นักพัฒนาจึงมีเวลาเหลือเฟือและสามารถตอบสนองความต้องการของชุมชนได้ สิ่งที่น่าสนใจเพิ่มเติมสำหรับ Podman ได้แก่ คำสั่ง mount/unmount และการรวม systemd

โฮสต์สามารถใช้คำสั่ง mount/unmount เพื่อต่อเชื่อมระบบไฟล์ของคอนเทนเนอร์ เช่น เพื่อเข้าถึงหรือเปลี่ยนแปลงไฟล์ แล้วยกเลิกการต่อเชื่อมอีกครั้ง

ในขณะที่การมอนิเตอร์คอนเทนเนอร์โดยใช้ systemd ไม่ทำงานเนื่องจาก daemon ใน Docker ที่มี Podman คอนเทนเนอร์สามารถเริ่มต้น ตรวจสอบ และแม้แต่รีสตาร์ทผ่าน systemd

นอกจากนี้ Podman ยังมีคำสั่ง podman generate systemd ซึ่งสร้างบริการ systemd ที่สอดคล้องกันสำหรับคอนเทนเนอร์ที่เกี่ยวข้อง และทำให้ผู้ใช้ไม่ต้องสร้างบริการ systemd ซึ่งหมายความว่าการผสานรวมบนระบบโฮสต์จะพร้อมใช้งาน

ความแตกต่างที่สำคัญอีกประการระหว่าง Podman และ Docker คือสิ่งหลังจะไม่เปลี่ยนกฎไฟร์วอลล์หรือการติดตั้ง dnsmasq ปัจจุบันเนื่องจากความสามารถในการสร้างเครือข่ายภายใน ในทางตรงกันข้าม นักเทียบท่าต้องเขียนทับกฎไฟร์วอลล์เพื่อเปิดใช้งานการสื่อสารระหว่างคอนเทนเนอร์

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

เมื่อใดที่คุณควรย้ายจาก Docker ไปยัง Podman

หากคุณกำลังปรับใช้คอนเทนเนอร์ในสภาพแวดล้อมที่ใช้ RHEL ในกรณีนั้น คุณจะไม่มีตัวเลือกมากมายนอกจากใช้ Podman เนื่องจากเป็น RHEL ดั้งเดิม คุณยังสามารถโยกย้ายหรือเลือก Podman บน Docker ได้หากคุณมีการปรับใช้ขนาดเล็กที่มีคอนเทนเนอร์น้อย

อย่างไรก็ตาม หากคุณต้องการความซับซ้อนมากกว่านั้น ให้มีหลายคอนเทนเนอร์และสแต็กของคอนเทนเนอร์ประสานงานที่มี docker-compose/podman-compose ผ่านเครือข่าย ใช้ Docker ดีกว่าเพราะจัดการเครือข่ายได้ดีกว่ามาก

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

การโยกย้ายจาก Podman ไปยัง Docker

หากคุณอยู่ในบรรทัดคำสั่ง การเปลี่ยนจาก Docker Engine เป็น Podman นั้นค่อนข้างง่าย ที่ง่ายที่สุด คำสั่ง $ alias docker=podman ใช้เวลาส่วนใหญ่ทำงาน

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

Windows หรือ macOS ไม่ใช่ระบบปฏิบัติการที่รองรับ วิธีนามแฝงใช้งานได้เพราะคำสั่ง Docker จำนวนมากมีเทียบเท่ากับ Podman

แต่ก็มีข้อยกเว้นเช่นกัน เนื่องจากคำสั่ง Docker บางคำสั่งไม่มีคำสั่งเทียบเคียงในโลกของ Podman ในทำนองเดียวกัน คำสั่งบางคำสั่งจะทำงานแตกต่างกันใน Docker มากกว่าในจักรวาลของ Podman ในขณะนี้ การดำเนินการนี้มีผลเฉพาะกับการจัดการไดรฟ์ข้อมูลที่ได้รับการตั้งค่าแล้วเท่านั้น

สวิตช์จะยากขึ้นเล็กน้อยเมื่อใช้เครื่องมือกราฟิกเช่น Docker Desktop โดยเฉพาะอย่างยิ่งควรส่งผลกระทบต่อนักพัฒนาที่ทำงานกับ Windows หรือ macOS

ผู้ใช้ Docker Desktop จะต้องคุ้นเคยกับบรรทัดคำสั่ง และเช่นเดียวกันกับการเขียน Docker อย่างไรก็ตาม มีโครงการเขียนพ็อดแมน ซอฟต์แวร์นี้เขียนด้วย Python ทำหน้าที่แทนการเขียน Docker

คำสุดท้าย

การเปลี่ยน Docker โดย Podman นั้นถือว่าใกล้จะเสร็จแล้ว สำหรับผู้ใช้และผู้ดูแลระบบ ลักษณะส่วนใหญ่ของการเปลี่ยนแปลงนี้เป็นเรื่องง่าย คุณสมบัติของ Docker หลายอย่างมีสิ่งที่เทียบเท่าใน Podman

ประโยชน์ที่แท้จริงคือการขาดกระบวนการดีมอนเอกพจน์และสิทธิ์รูท ไม่ต้องพูดถึงการใช้กลุ่มคอนเทนเนอร์ตามธรรมชาติ อย่างไรก็ตาม เป็นมูลค่าการกล่าวขวัญว่า Docker ยังคงเป็นเทคโนโลยีหลักเกี่ยวกับคอนเทนเนอร์ แต่สิ่งนี้มักจะเปลี่ยนแปลงในระยะยาว

คุณยังสามารถสำรวจคำสั่ง Docker เพื่อจัดการคอนเทนเนอร์