คำแนะนำมาจากเป้าหมายและการออกแบบการจำลองเสมือนระดับระบบปฏิบัติการ
ตู้คอนเทนเนอร์ได้รับการออกแบบมาเพื่อแยกกระบวนการสำหรับผู้อื่นโดยให้userpaceและระบบไฟล์ของตัวเอง
นี่คือวิวัฒนาการเชิงตรรกะchroot
ซึ่งได้จัดทำระบบไฟล์แยกขั้นตอนต่อไปคือการแยกกระบวนการจากคนอื่น ๆ เพื่อหลีกเลี่ยงการเขียนทับหน่วยความจำและอนุญาตให้ใช้ทรัพยากรเดียวกัน (เช่นพอร์ต TCP 8080 เช่นจากหลายกระบวนการโดยไม่มีความขัดแย้ง
ความสนใจหลักในคอนเทนเนอร์นั้นเพื่อทำแพ็กเกจไลบรารีที่จำเป็นสำหรับกระบวนการโดยไม่ต้องกังวลเกี่ยวกับข้อขัดแย้งของเวอร์ชัน หากคุณใช้กระบวนการหลายรายการที่ต้องการไลบรารีเดียวกันสองเวอร์ชันใน userspace และระบบไฟล์เดียวกันคุณต้องปรับแต่ง LDPATH อย่างน้อยสำหรับแต่ละกระบวนการเพื่อให้พบไลบรารีที่เหมาะสมก่อนและบางไลบรารีไม่สามารถปรับแต่งด้วยวิธีนี้ เนื่องจากเส้นทางของพวกเขายากในการปฏิบัติการในเวลารวบรวมดูคำถามนี้เพื่อดูรายละเอียดเพิ่มเติม
ในระดับเครือข่ายคุณจะต้องกำหนดค่าแต่ละกระบวนการเพื่อหลีกเลี่ยงการใช้พอร์ตเดียวกัน
การรันหลายกระบวนการในที่เก็บเดียวกันต้องมีการปรับแต่งอย่างหนักและเมื่อสิ้นสุดวันนั้นก็มีจุดประสงค์เพื่อแยกออกจากกันถ้าคุณสามารถเรียกใช้กระบวนการหลายรายการภายใน userspace เดียวกันแบ่งปัน filesytem และทรัพยากรเครือข่ายเดียวกันทำไมจึงไม่ทำงาน บนโฮสต์เอง
นี่คือรายการที่ไม่ครบถ้วนสมบูรณ์ของการปรับแต่ง / ข้อผิดพลาดอย่างหนักที่ฉันสามารถนึกได้:
การจัดการบันทึก
ไม่ว่าจะเป็นโวลุ่มที่เมานต์หรือ interleaved บน stdout ทำให้การจัดการบางอย่าง หากใช้ปริมาณที่เมานต์คอนเทนเนอร์ของคุณควรมี "สถานที่" ของตัวเองบนโฮสต์หรือคอนเทนเนอร์สองตัวเดียวกันจะต่อสู้เพื่อทรัพยากรเดียวกัน เมื่อ interleaving บน stdout เพื่อใช้ประโยชน์จากdocker logs
มันสามารถกลายเป็นฝันร้ายสำหรับการวิเคราะห์หากไม่สามารถระบุแหล่งที่มาได้อย่างง่ายดาย
ระวังกระบวนการซอมบี้
หากหนึ่งในกระบวนการของคุณในคอนเทนเนอร์ล้มเหลว supervisord อาจไม่สามารถล้างค่า childs ในสถานะ zombie และโฮสต์ init จะไม่ได้รับสืบทอด เมื่อคุณหมดจำนวนของ pids ที่มีอยู่ (2 ^ 22 ดังนั้นประมาณ 4 ล้าน) สิ่งต่าง ๆ จะล้มเหลว
แยกความกังวล
หากคุณเรียกใช้สองสิ่งที่แยกกันเช่นเซิร์ฟเวอร์ apache และ logstash ภายในคอนเทนเนอร์เดียวกันซึ่งอาจช่วยให้การจัดการบันทึกง่ายขึ้น แต่คุณต้องปิด apache เพื่ออัปเดต logstash (ในความเป็นจริงคุณควรใช้ไดรเวอร์การบันทึกของ Docker) มันจะเป็นการหยุดที่สง่างามที่รอให้เซสชันปัจจุบันสิ้นสุดหรือไม่? หากเป็นการหยุดที่สง่างามอาจใช้เวลานานและใช้เวลานานในการหมุนเวอร์ชั่นใหม่ หากคุณทำการฆ่าคุณจะส่งผลกระทบต่อผู้ใช้สำหรับผู้จัดส่งบันทึกและควรหลีกเลี่ยง IMHO
ในที่สุดเมื่อคุณมีกระบวนการหลายขั้นตอนที่คุณกำลังสร้างระบบปฏิบัติการขึ้นใหม่และในกรณีนี้การใช้การจำลองเสมือนสำหรับฮาร์ดแวร์จะให้เสียงที่สอดคล้องกับความต้องการนี้มากขึ้น