นักเทียบท่าไม่ใช่วิธีการจำลองเสมือน มันต้องอาศัยเครื่องมืออื่น ๆ ที่ใช้การจำลองเสมือนจริงบนคอนเทนเนอร์หรือการจำลองเสมือนระดับระบบปฏิบัติการ ในตอนแรก Docker ใช้ไดรเวอร์ LXC จากนั้นย้ายไปยัง libcontainer ซึ่งตอนนี้เปลี่ยนชื่อเป็น runc นักเทียบท่าส่วนใหญ่มุ่งเน้นไปที่การปรับใช้แอปพลิเคชันภายในคอนเทนเนอร์ของแอปพลิเคชันโดยอัตโนมัติ คอนเทนเนอร์ของแอปพลิเคชันได้รับการออกแบบมาเพื่อทำแพคเกจและเรียกใช้บริการเดียวในขณะที่คอนเทนเนอร์ของระบบได้รับการออกแบบให้ทำงานหลายกระบวนการเช่นเครื่องเสมือน ดังนั้น Docker จึงถือเป็นเครื่องมือจัดการคอนเทนเนอร์หรือเครื่องมือการปรับใช้แอปพลิเคชันในระบบที่บรรจุแล้ว
เพื่อที่จะทราบว่ามันแตกต่างจากการจำลองเสมือนอื่น ๆ อย่างไรให้ผ่านการจำลองเสมือนและชนิดของมัน จากนั้นจะเข้าใจได้ง่ายขึ้นว่าอะไรคือความแตกต่าง
virtualization
ในรูปแบบที่ถูกคิดมันถูกพิจารณาว่าเป็นวิธีการแบ่งเมนเฟรมหลักเหตุผลเพื่อให้แอพพลิเคชั่นหลายตัวทำงานพร้อมกัน อย่างไรก็ตามสถานการณ์เปลี่ยนไปอย่างมากเมื่อ บริษัท และชุมชนโอเพ่นซอร์สสามารถจัดหาวิธีการจัดการคำสั่งสิทธิพิเศษไม่ทางใดก็ทางหนึ่งและอนุญาตให้ระบบปฏิบัติการหลายระบบสามารถทำงานพร้อมกันบนระบบ x86 เดียว
hypervisor
ไฮเปอร์ไวเซอร์จัดการกับการสร้างสภาพแวดล้อมเสมือนจริงที่เครื่องเสมือนแขกทำงาน ควบคุมดูแลระบบของแขกและทำให้แน่ใจว่ามีการจัดสรรทรัพยากรให้กับแขกตามที่จำเป็น ไฮเปอร์ไวเซอร์ตั้งอยู่ระหว่างเครื่องฟิสิคัลและเครื่องเสมือนและให้บริการการจำลองเสมือนสำหรับเครื่องเสมือน เพื่อให้ตระหนักถึงมันจะขัดขวางการทำงานของระบบปฏิบัติการแขกบนเครื่องเสมือนและจำลองการทำงานบนระบบปฏิบัติการของเครื่องโฮสต์
การพัฒนาอย่างรวดเร็วของเทคโนโลยีการจำลองเสมือนส่วนใหญ่ในระบบคลาวด์ได้ผลักดันให้มีการใช้งานการจำลองเสมือนเพิ่มเติมโดยอนุญาตให้เซิร์ฟเวอร์เสมือนหลายตัวถูกสร้างขึ้นบนเซิร์ฟเวอร์ทางกายภาพเดียวด้วยความช่วยเหลือของไฮเปอร์ไวเซอร์เช่น Xen, VMware Player, KVM เป็นต้น การรวมการสนับสนุนฮาร์ดแวร์ในตัวประมวลผลสินค้าเช่น Intel VT และ AMD-V
ประเภทของการจำลองเสมือน
วิธีการจำลองเสมือนสามารถจัดประเภทตามวิธีที่เลียนแบบฮาร์ดแวร์กับระบบปฏิบัติการของแขกและจำลองสภาพแวดล้อมการปฏิบัติการของแขก ในขั้นต้นมี virtualization สามประเภท:
- การแข่งขัน
- paravirtualization
- การจำลองเสมือนตามคอนเทนเนอร์
การแข่งขัน
การจำลองหรือที่เรียกว่าการจำลองเสมือนแบบเต็มรูปแบบรันเคอร์เนลระบบปฏิบัติการเสมือนในซอฟต์แวร์ทั้งหมด ไฮเปอร์ไวเซอร์ที่ใช้ในประเภทนี้เรียกว่าไฮเปอร์ไวเซอร์ประเภท 2 มันถูกติดตั้งที่ด้านบนของระบบปฏิบัติการโฮสต์ซึ่งรับผิดชอบในการแปลรหัสเคอร์เนลระบบปฏิบัติการของผู้เยี่ยมชมเป็นคำแนะนำซอฟต์แวร์ การแปลทำในซอฟต์แวร์ทั้งหมดและไม่จำเป็นต้องมีส่วนร่วมของฮาร์ดแวร์ การจำลองทำให้สามารถเรียกใช้ระบบปฏิบัติการที่ไม่ได้แก้ไขซึ่งสนับสนุนสภาพแวดล้อมที่ถูกจำลอง ข้อเสียของการทำเวอร์ช่วลไลเซชั่นประเภทนี้เป็นค่าใช้จ่ายทรัพยากรระบบเพิ่มเติมที่นำไปสู่การลดลงของประสิทธิภาพเมื่อเทียบกับการทำเวอร์ช่วลไลเซชั่นประเภทอื่น
ตัวอย่างในหมวดหมู่นี้ ได้แก่ VMware Player, VirtualBox, QEMU, Bochs, Parallels เป็นต้น
paravirtualization
Paravirtualization หรือที่รู้จักในชื่อ Type 1 hypervisor รันบนฮาร์ดแวร์โดยตรงหรือ "bare-metal" และให้บริการการจำลองเสมือนโดยตรงกับเครื่องเสมือนที่รันอยู่ ช่วยให้ระบบปฏิบัติการฮาร์ดแวร์เสมือนจริงและฮาร์ดแวร์จริงทำงานร่วมกันเพื่อให้ได้ประสิทธิภาพสูงสุด โดยทั่วไปแล้วไฮเปอร์ไวเซอร์เหล่านี้มีรอยเท้าที่ค่อนข้างเล็กและไม่ต้องการทรัพยากรที่กว้างขวาง
ตัวอย่างในหมวดหมู่นี้ ได้แก่ Xen, KVM เป็นต้น
การจำลองเสมือนตามคอนเทนเนอร์
การจำลองเสมือนตามคอนเทนเนอร์หรือที่เรียกว่าการจำลองเสมือนระดับระบบปฏิบัติการเปิดใช้งานการดำเนินการแยกหลายรายการภายในเคอร์เนลระบบปฏิบัติการเดียว มีประสิทธิภาพและความหนาแน่นที่ดีที่สุดและมีการจัดการทรัพยากรแบบไดนามิก สภาพแวดล้อมการปฏิบัติการเสมือนจริงที่แยกได้จากการทำเสมือนจริงประเภทนี้เรียกว่าคอนเทนเนอร์และสามารถดูได้ว่าเป็นกลุ่มของกระบวนการที่ติดตาม
แนวคิดของคอนเทนเนอร์ถูกสร้างขึ้นโดยคุณลักษณะเนมสเปซที่เพิ่มใน Linux kernel เวอร์ชัน 2.6.24 คอนเทนเนอร์เพิ่ม ID ไปยังทุกกระบวนการและเพิ่มการตรวจสอบการควบคุมการเข้าถึงใหม่ให้กับการเรียกระบบทุกครั้ง มันเข้าถึงได้โดยโคลน ()เรียกระบบที่ช่วยให้การสร้างอินสแตนซ์ที่แยกจากกันของ namespaces ก่อนหน้านี้ทั่วโลก
เนมสเปซสามารถใช้งานได้หลายวิธี แต่วิธีที่พบมากที่สุดคือการสร้างคอนเทนเนอร์แยกต่างหากที่ไม่มีการมองเห็นหรือการเข้าถึงวัตถุนอกคอนเทนเนอร์ กระบวนการที่ทำงานอยู่ภายในคอนเทนเนอร์ดูเหมือนว่ากำลังทำงานอยู่บนระบบ Linux ปกติแม้ว่าพวกเขาจะแบ่งปันเคอร์เนลพื้นฐานกับกระบวนการที่อยู่ในเนมสเปซอื่นเช่นเดียวกับวัตถุประเภทอื่น ตัวอย่างเช่นเมื่อใช้เนมสเปซผู้ใช้รูทภายในคอนเทนเนอร์จะไม่ถือว่าเป็นรูทภายนอกคอนเทนเนอร์เพิ่มความปลอดภัยเพิ่มเติม
ระบบย่อย Linux Control Groups (cgroups) ซึ่งเป็นองค์ประกอบหลักถัดไปเพื่อเปิดใช้งานการจำลองเสมือนแบบคอนเทนเนอร์ใช้สำหรับจัดกลุ่มกระบวนการและจัดการการใช้ทรัพยากรรวมของพวกเขา มักใช้เพื่อ จำกัด หน่วยความจำและปริมาณการใช้ CPU ของคอนเทนเนอร์ เนื่องจากระบบ Linux ที่บรรจุแล้วมีเพียงหนึ่งเคอร์เนลและเคอร์เนลมีการมองเห็นอย่างเต็มรูปแบบในคอนเทนเนอร์จึงมีการจัดสรรทรัพยากรและการกำหนดตารางเวลาเพียงระดับเดียวเท่านั้น
เครื่องมือการจัดการหลายอย่างพร้อมใช้งานสำหรับคอนเทนเนอร์ Linux รวมถึง LXC, LXD, systemd-nspawn, lmctfy, Warden, Linux-VServer, OpenVZ, Docker เป็นต้น
ตู้เทียบกับเครื่องเสมือน
แตกต่างจากเครื่องเสมือนคอนเทนเนอร์ไม่จำเป็นต้องบูตเคอร์เนลระบบปฏิบัติการดังนั้นคอนเทนเนอร์สามารถสร้างได้ในเวลาไม่ถึงหนึ่งวินาที คุณลักษณะนี้ทำให้การจำลองเสมือนบนภาชนะเป็นเอกลักษณ์และเป็นที่ต้องการมากกว่าวิธีการจำลองเสมือนอื่น ๆ
เนื่องจากการจำลองเสมือนแบบคอนเทนเนอร์ใช้เพิ่มค่าใช้จ่ายเพียงเล็กน้อยหรือไม่มีเลยให้กับเครื่องโฮสต์การจำลองเสมือนตามคอนเทนเนอร์จึงมีประสิทธิภาพใกล้เคียง
สำหรับการจำลองเสมือนแบบคอนเทนเนอร์ไม่ต้องใช้ซอฟต์แวร์เพิ่มเติมใด ๆ ซึ่งแตกต่างจากการจำลองเสมือนแบบอื่น
คอนเทนเนอร์ทั้งหมดบนเครื่องโฮสต์ใช้ตัวกำหนดตารางเวลาของเครื่องโฮสต์ที่ต้องการประหยัดทรัพยากรเพิ่มเติม
สถานะคอนเทนเนอร์ (อิมเมจ Docker หรือ LXC) มีขนาดเล็กเมื่อเทียบกับอิมเมจเครื่องเสมือนดังนั้นอิมเมจคอนเทนเนอร์จึงง่ายต่อการกระจาย
การจัดการทรัพยากรในคอนเทนเนอร์สามารถทำได้ผ่าน cgroups Cgroups ไม่อนุญาตให้คอนเทนเนอร์ใช้ทรัพยากรมากกว่าที่จัดสรรให้ อย่างไรก็ตาม ณ ตอนนี้ทรัพยากรทั้งหมดของเครื่องโฮสต์จะมองเห็นได้ในเครื่องเสมือน แต่ไม่สามารถใช้งานได้ สิ่งนี้สามารถรับรู้ได้โดยการรันtop
หรือhtop
บนคอนเทนเนอร์และเครื่องโฮสต์ในเวลาเดียวกัน ผลลัพธ์ในทุกสภาพแวดล้อมจะมีลักษณะใกล้เคียงกัน
ปรับปรุง:
นักเทียบท่าเรียกใช้คอนเทนเนอร์ในระบบที่ไม่ใช่ Linux อย่างไร
หากคอนเทนเนอร์เป็นไปได้เนื่องจากคุณสมบัติที่มีอยู่ในเคอร์เนล Linux คำถามที่ชัดเจนคือระบบที่ไม่ใช่ Linux ใช้คอนเทนเนอร์ได้อย่างไร ทั้ง Docker สำหรับ Mac และ Windows ใช้ Linux VM เพื่อเรียกใช้คอนเทนเนอร์ Docker Toolbox ใช้เพื่อเรียกใช้คอนเทนเนอร์ใน Virtual Box VMs แต่นักเทียบท่ารุ่นล่าสุดใช้ Hyper-V ใน Windows และ Hypervisor.framework ใน Mac
ตอนนี้ฉันจะอธิบายว่า Docker for Mac ใช้งานคอนเทนเนอร์อย่างไรในรายละเอียด
Docker สำหรับ Mac ใช้https://github.com/moby/hyperkitเพื่อจำลองความสามารถด้านไฮเปอร์ไวเซอร์และ Hyperkit ใช้ hypervisor.framework ในแกนกลาง Hypervisor.framework เป็นโซลูชันไฮเปอร์ไวเซอร์ดั้งเดิมของ Mac ไฮเปอร์คิตยังใช้ VPNKit และ DataKit ในการกำหนดชื่อเครือข่ายและระบบไฟล์ตามลำดับ
Linux VM ที่ Docker รันใน Mac เป็นแบบอ่านอย่างเดียว อย่างไรก็ตามคุณสามารถทุบตีมันโดยการเรียกใช้:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
.
ตอนนี้เราสามารถตรวจสอบเวอร์ชันเคอร์เนลของ VM นี้:
# uname -a
Linux linuxkit-025000000001 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:86_64 Linux
.
คอนเทนเนอร์ทั้งหมดทำงานภายใน VM นี้
มีข้อ จำกัด บางประการสำหรับ hypervisor.framework เนื่องจาก Docker นั้นไม่ได้เปิดเผยdocker0
อินเตอร์เฟสเครือข่ายใน Mac ดังนั้นคุณไม่สามารถเข้าถึงคอนเทนเนอร์จากโฮสต์ ณ ตอนนี้docker0
ใช้ได้เฉพาะภายใน VM
Hyper-v เป็นไฮเปอร์ไวเซอร์เนทีฟใน Windows พวกเขายังพยายามยกระดับความสามารถของ Windows 10 ในการใช้งานระบบ Linux ด้วย