ทำไมเราใช้ OS Base Image with Docker ถ้าคอนเทนเนอร์ไม่มี Guest OS


83

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

ฉันยังอ่านว่าคอนเทนเนอร์ไม่มีการติดตั้ง Guest OS แต่จะอาศัยเคอร์เนลระบบปฏิบัติการพื้นฐาน

ทั้งหมดนี้เป็นเรื่องปกติ สิ่งที่ฉันสับสนคือมีภาพ Docker ตั้งชื่อตามระบบปฏิบัติการ เราเห็นภาพอย่าง Ubuntu, Debian, Fedora, CentOS และอื่น ๆ

ประเด็นของฉันคืออะไรรูปเหล่านั้นจริงเหรอ? มันแตกต่างกันอย่างไรในการสร้างคอนเทนเนอร์ตามอิมเมจ Debian กว่าการสร้างเครื่องเสมือนและการติดตั้ง Debian

ฉันคิดว่าตู้คอนเทนเนอร์ไม่มีการติดตั้ง Guest OS แต่เมื่อเราสร้างรูปภาพเราจะยึดมันไว้ในภาพที่ตั้งชื่อตามระบบปฏิบัติการเดียว

นอกจากนี้ในตัวอย่างที่ผมเห็นเมื่อเราทำdocker run ubuntu echo "hello world"มันก็ดูเหมือนเรากำลังปั่นขึ้น VM กับ Ubuntu echo "hello world"และทำให้มันเรียกใช้คำสั่ง

ในแบบเดียวกับที่เราทำdocker run -it ubuntu /bin/bashดูเหมือนว่าเรากำลังเพิ่ม VM ด้วย Ubuntu และเข้าถึงโดยใช้บรรทัดคำสั่ง

อย่างไรก็ตามรูปภาพเหล่านั้นถูกตั้งชื่อตามระบบปฏิบัติการเกี่ยวกับอะไร? มันแตกต่างกันอย่างไรในการรันคอนเทนเนอร์ด้วยหนึ่งในอิมเมจเหล่านั้นและหมุน VM ด้วย Guest OS ที่เกี่ยวข้อง

เป็นความคิดที่ว่าเราเพิ่งแชร์เคอร์เนลกับโฮสต์ระบบปฏิบัติการ (ดังนั้นเราจึงสามารถเข้าถึงทรัพยากรฮาร์ดแวร์ของเครื่องโดยไม่จำเป็นต้องทำเวอร์ชวลไลเซชันฮาร์ดแวร์) แต่ยังคงใช้ไฟล์และไบนารีของแต่ละระบบที่แตกต่างกันตามลำดับ เพื่อรองรับแอปพลิเคชันใดที่เราต้องการเรียกใช้


2
ในความคิดของฉันวัตถุประสงค์ของคุณใน virtualisation เป็นกุญแจสำคัญ หากคุณต้องการห้องสมุดภาษาและอื่น ๆ บนระบบปฏิบัติการดังนั้นคอนเทนเนอร์ของระบบปฏิบัติการจึงเหมาะสมกับความต้องการของคุณ แต่ถ้าความต้องการของคุณเป็นเพียงแอปพลิเคชันเป็นส่วนประกอบคุณไม่จำเป็นต้องใช้ OS เป็นอิมเมจพื้นฐานของคุณ ฉันคิดว่าบทความนี้สามารถอธิบายได้อย่างชัดเจนblog.risingstack.com/…
metamorph

คำตอบ:


68

เนื่องจากลีนุกซ์ลีนุกซ์ทุกรุ่นทำงานเหมือนกัน (yup, มันค่อนข้างง่าย) ลีนุกซ์เคอร์เนลและแตกต่างกันเฉพาะในซอฟต์แวร์ userland, มันค่อนข้างง่ายที่จะจำลองสภาพแวดล้อมการกระจายที่แตกต่างกัน - เพียงแค่ติดตั้งซอฟต์แวร์ userland นั้นและอ้างว่าเป็นการแจกจ่ายอื่น การที่เฉพาะเจาะจงการติดตั้ง CentOS container ภายใน Ubuntu OS จะหมายความว่าคุณจะได้ userland จาก CentOS ในขณะที่ยังคงใช้เคอร์เนลเดิมไม่แม้แต่เคอร์เนลอินสแตนซ์อื่น

การทำเวอร์ช่วลไลเซชั่นแบบเบาเหมือนการแยกส่วนในระบบปฏิบัติการเดียวกัน การทำเวอร์ชวลไลเซชั่นจริงของ Au กำลังมีระบบปฏิบัติการอื่นที่เต็มเปี่ยมอยู่ภายใน OS โฮสต์ นั่นเป็นสาเหตุที่นักเทียบท่าไม่สามารถเรียกใช้ FreeBSD หรือ Windows ใน Linux

ถ้ามันจะง่ายขึ้นคุณสามารถคิดว่านักเทียบท่าเป็นสภาพแวดล้อม chroot ขั้นสูงและซับซ้อนมาก


3
นั่นเป็นเหตุผลที่ฉันสามารถโฮสต์โค้ด golang ที่คอมไพล์แล้วในคอนเทนเนอร์ขูดว่าง - เพราะโค้ดที่คอมไพล์ต้องการเฉพาะเคอร์เนล
Francis Norton

ดังนั้น guest OS จะทราบได้อย่างไรว่าใช้เคอร์เนลโฮสต์ของระบบปฏิบัติการ (และวิธีการดังกล่าว) AFAIK ฐานอิมเมจของนักเทียบท่าใช้อิมเมจระบบปฏิบัติการมาตรฐาน ในตัวอย่างของคุณไม่เหมือนกับการสร้าง CentOS แบบกำหนดเองซึ่งรู้วิธีใช้เคอร์เนลของผู้ปกครองหรือไม่ หรือมันเป็นเรื่องง่ายเหมือนระบบไฟล์ (aufs) เคล็ดลับที่นักเทียบท่าเปลี่ยนเส้นทางแขก (CentOS ') อ่าน / boot ไปยังโฮสต์ (Ubuntu)? ในกรณีดังกล่าว guest (CentOS) จะติดตั้งสำเนา / boot ของตัวเอง แต่จะไม่เคยอ่านหรือไม่
James S

ฉันชอบคำอธิบายของคุณ แต่คุณจะอธิบายการใช้งานคอนเทนเนอร์ Linux บน Windows ได้อย่างไร? Server 2016 และ Windows 10 มีเคอร์เนล Linux เพื่อเปิดใช้งาน Docker หรือไม่? นั่นเป็นสาเหตุที่รุ่นเหล่านั้นจำเป็น?
duct_tape_coder

นี้เป็นเรื่องง่ายที่พวกเขา Merey ทำงานภายใต้การทำงานแบบเสมือนสแต็คที่เต็มเปี่ยมของ Hyper-V ภายใน Linux VM พื้นเมือง: docs.microsoft.com/en-us/virtualization/windowscontainers/...
drookie

1

คอนเทนเนอร์ทำงานบนเคอร์เนลเดี่ยว ในคำอื่น ๆ คอนเทนเนอร์ทั้งหมดมีเคอร์เนลเดียว (โฮสต์ระบบปฏิบัติการ) ในขณะที่ไฮเปอร์ไวเซอร์อีกด้านหนึ่งมีหลายเมล็ด เครื่องเสมือนแต่ละเครื่องทำงานบนเคอร์เนลที่แตกต่างกัน

และ "นักเทียบท่ารันอูบุนตู" ก็เหมือนกับการสร้างสภาพแวดล้อม chroot

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.