- Docker ถูกวิจารณ์มาอย่างต่อเนื่องในเรื่องช่องโหว่ด้านความปลอดภัยและการใช้ทรัพยากร เนื่องจากมีโครงสร้างแบบ background daemon (
dockerd)
- Podman ใช้ สถาปัตยกรรมแบบไม่พึ่ง daemon ทำให้คอนเทนเนอร์รันโดยตรงภายใต้สิทธิ์ของผู้ใช้ ช่วยลดพื้นผิวการโจมตีและเพิ่มความเสถียร
- รองรับ การทำงานร่วมกับ Systemd, การออกแบบที่เป็นมิตรกับ Kubernetes, และ ชุดเครื่องมือที่แยกตามแนวคิด Unix อย่าง Buildah/Skopeo ช่วยเพิ่มประสิทธิภาพในการปฏิบัติการ
- ยังคงเข้ากันได้กับ Docker CLI ในระดับสูง ทำให้เวิร์กโฟลว์เดิมส่วนใหญ่ยังใช้งานได้ทันทีเพียงแค่
alias docker=podman
- แม้ในสภาพแวดล้อมการใช้งานจริง ก็ช่วยให้การจัดการความปลอดภัยและทรัพยากรง่ายขึ้น และสำหรับโปรเจ็กต์ใหม่ Podman กำลังกลายเป็น ตัวเลือกที่สมเหตุสมผลและมองไปข้างหน้ามากกว่า
ข้อจำกัดและปัญหาด้านความปลอดภัยของ Docker
- Docker มีโครงสร้างที่ daemon
dockerd ต้องทำงานอยู่ตลอดด้วยสิทธิ์ root
- หากพบช่องโหว่ใน daemon โฮสต์ทั้งเครื่องอาจตกอยู่ในความเสี่ยง
- ตัวอย่างประเด็นด้านความปลอดภัยสำคัญ
- 2019: runC container escape (CVE-2019-5736)
- 2022: ช่องโหว่ Linux Dirty Pipe, cgroups v1 escape
- 2024: runC “Leaky Vessels”, ช่องโหว่ BuildKit
- 2024: แคมเปญ cryptojacking ผ่านการเปิดเผย Docker API
- เหตุการณ์เหล่านี้เกิดซ้ำ ๆ จนสะท้อนให้เห็นถึง ความเสี่ยงเชิงโครงสร้างของสถาปัตยกรรมแบบพึ่ง daemon
สถาปัตยกรรม daemonless ของ Podman
- Podman ไม่ใช้ background daemon
- เมื่อรัน
podman run คอนเทนเนอร์จะทำงานเป็น child process โดยตรง ของผู้ที่สั่งรันคำสั่ง
- เนื่องจากรันในโหมด rootless แม้จะมีสิทธิ์ root ภายในคอนเทนเนอร์ แต่บนโฮสต์ก็ยังเป็นเพียงสิทธิ์ของผู้ใช้ทั่วไป
- ข้อดี
- เพิ่มความปลอดภัย: หากเกิด container escape ขอบเขตความเสียหายจะเล็กลง
- เพิ่มความเสถียร: ต่อให้คอนเทนเนอร์หนึ่งล่ม คอนเทนเนอร์อื่นก็ไม่ถูกกระทบ
- ใช้ทรัพยากรอย่างมีประสิทธิภาพ: ไม่มี daemon ที่ไม่จำเป็นต้องค้างอยู่ในระบบ จึงใช้หน่วยความจำน้อยลง
ความสามารถที่แตกต่างของ Podman
- การทำงานร่วมกับ Systemd
- ใช้
podman generate systemd เพื่อสร้างไฟล์ systemd unit อัตโนมัติ
- จัดการบริการได้ด้วยคำสั่งมาตรฐาน
systemctl
- ความเป็นมิตรกับ Kubernetes
- มีแนวคิด Pod ฝังมาเป็นพื้นฐาน จึงเหมาะกับการพัฒนาแอปแบบหลายคอนเทนเนอร์
- ใช้
podman generate kube เพื่อสร้าง Kubernetes YAML ได้ทันที
- แนวคิดแบบ Unix
- Podman โฟกัสที่การรันคอนเทนเนอร์ ส่วนการ build image ใช้ Buildah และการจัดการ registry ใช้ Skopeo
- ทำให้เลือกใช้เครื่องมือที่เหมาะกับแต่ละหน้าที่ได้
กระบวนการย้ายและความเข้ากันได้
- การย้ายจาก Docker ไป Podman ทำได้แบบ แทบไม่สะดุด
- CLI เข้ากันได้ จึงสามารถใช้
podman แทน docker ได้ตรง ๆ
- Dockerfile เดิมก็ยังทำงานได้เหมือนเดิม
- จุดที่ต่างกัน
- ในโหมด rootless จะ bind พอร์ตต่ำกว่า 1024 ไม่ได้ → แนะนำให้ใช้ reverse proxy
- ต้องจัดการสิทธิ์ของ volume
- เครื่องมือที่พึ่งพา Docker socket สามารถใช้โหมด Docker API compatibility ของ Podman ได้
การนำไปใช้จริงและข้อดี
- หลังจากใช้ Podman ในสภาพแวดล้อมการปฏิบัติงานจริง
- ภาระในการตรวจสอบด้านความปลอดภัยลดลง และได้ rootless security เป็นค่าพื้นฐาน
- รูปแบบการใช้ทรัพยากรง่ายขึ้นและคาดการณ์ได้มากขึ้น
- แม้ Docker จะยังได้รับความนิยม แต่ ถ้าเป็นโปรเจ็กต์ใหม่หรือมีอิสระในการเลือกเทคโนโลยี Podman เหมาะสมกว่า
- ผสานเข้ากับระบบจัดการของ Linux ได้อย่างเป็นธรรมชาติ
- รองรับสถาปัตยกรรมที่มุ่งไปทาง Kubernetes
- มอบสภาพแวดล้อมการรันคอนเทนเนอร์ที่ปลอดภัยและสมเหตุสมผลกว่า
สรุปคู่มือย้าย FastAPI
- ใช้ Dockerfile เดิมได้ทันที
- แทนที่ด้วย
podman build, podman run ได้อย่างง่ายดาย
- ใช้
podman generate systemd เพื่อลงทะเบียนเป็นบริการ systemd
- รองรับสภาพแวดล้อมหลายบริการ เช่น DB โดยใช้ Pod
- เวิร์กโฟลว์ Docker Compose สามารถรองรับได้ด้วย
podman-compose หรือการแปลงผ่าน kompose
8 ความคิดเห็น
ที่นี่เขียนไว้ว่าสามารถเปลี่ยนผ่านได้โดยไม่ต้องหยุดระบบ แต่พอเป็นสภาพแวดล้อมใช้งานจริงกลับมีอะไรแปลกๆ เยอะพอสมควรครับ ตัวอย่างเช่น บนสภาพแวดล้อม mac เมื่อใช้การตั้งค่าเริ่มต้นที่ใช้การบีบอัด zstd อิมเมจที่ build ขึ้นมาจะไปกินพื้นที่ใน registry ค่อนข้างมากอะไรทำนองนั้น..
ทั้ง Docker และ Podman....
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
securityContext:
runAsNonRoot: true
runAsUser: UID
จริง ๆ แล้วความเข้ากันได้กับ Docker ยังไม่ค่อยดี เลยทำให้การใช้งานไม่ได้ดีขนาดนั้น...
เพราะคิดเรื่อง rootless เลยย้ายไปใช้ Podman แล้วสุดท้ายก็กลับมาใช้ Docker อีกครับ
อย่างที่ท่านอื่นบอก ถ้าจะใช้กับ Kubernetes ก็ใช้ containerd ไปเลยดีกว่า
ผมก็สงสัยเหมือนกันว่า ถ้า
Docker composeทำงานได้ไม่ดีและข้อดีก็คือเข้ากันได้กับ Kubernetes มากกว่า แบบนั้นใช้ Kubernetes ไปเลยไม่ดีกว่าเหรอผมเองก็เคยจะลองใช้ แต่เพราะมันไม่สามารถทำงานได้ในครั้งเดียว และยังแมปพอร์ตต่ำกว่า 1024 ได้โดยตรงไม่ได้ด้วย เลยใช้ k3s ควบคู่กับ
nerdctlสำหรับบิลด์อิมเมจแทนแม้จะรู้สึกอยากเปลี่ยนมาใช้มาสักพักแล้ว แต่ตอนที่เคยลองก่อนหน้านี้กลับพบว่าไม่เหมือนอย่างที่นักพัฒนาพูดกัน เพราะมีโปรเจ็กต์
docker composeจำนวนมากเกินไปที่ทำงานได้ไม่ถูกต้อง...ก็ Docker ไม่รองรับ network นี่นา
เท่าที่ทราบ มันน่าจะรองรับฟีเจอร์ด้านเครือข่ายได้เหมือนกับ Docker
ตอนนี้ยังมีอะไรที่ใช้งานได้ไม่สมบูรณ์อยู่ไหม?
ความเห็นจาก Hacker News
chrootกับ jail โค้ดสำหรับ deploy ของฉันจะรันซอฟต์แวร์จากนอกสภาพแวดล้อม jail แล้วใช้ptraceเฝ้าดูไฟล์ที่โปรเซสเปิด จากเอาต์พุตนี้ก็สรุปรายการ dependency ออกมาแล้วแพ็กเกจมัน ผลลัพธ์คือ deployment มีขนาดเล็ก คงสภาพไม่เปลี่ยนแปลง และปลอดภัยขึ้น พอ Docker ออกมาก็ทำให้นึกถึงวิธีเก่า ๆ และสงสัยว่ามีเครื่องมือคล้ายกันไหมที่คอยมอนิเตอร์การใช้งานไฟล์ของคอนเทนเนอร์ Docker เพื่อลดขนาดชุด deploy จริง ๆgit push live masterก็ deploy ได้แล้ว ฉันใช้ Docker มาเยอะ แต่แบบนี้ง่ายที่สุดสำหรับการ deploy ฉันเข้าใจข้อดีของ Docker แต่การตั้งค่า HTTP บน Ubuntu หรือ OpenBSD ก็ไม่ได้ยากขนาดนั้น เลยสงสัยว่าความสามารถในการทำซ้ำได้แบบ Docker คุ้มกับภาระในการดูแลที่เพิ่มขึ้นจริงหรือไม่ลิงก์ไปยังโค้ดที่เกี่ยวข้อง
--connectionเพื่อเลือกสภาพแวดล้อมที่ต้องการได้ ถ้าจำเป็น Podman ก็สร้าง VM อัตโนมัติให้ได้ด้วย (ใช้ lima) และ Podman Desktop ก็มีเลเยอร์เข้ากันได้กับ Docker เพื่อลดปัญหาความเข้ากันได้podman generate systemdที่บทความพูดถึง ตอนนี้ deprecated แล้ว ทางเลือกคือ Podman Quadlets ซึ่งทำงานคล้าย docker-compose.yaml ที่นิยามอยู่ในไฟล์ unit ของ systemdนี่,
นี่,
นี่