กระบวนการภายในคอนเทนเนอร์ Docker มีลักษณะอย่างไร


33

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

ใครช่วยกรุณาให้ภาพรวมระดับสูงของสิ่งที่เกิดขึ้น?


3
ในขณะที่ไม่ถูกต้อง (และทำไมฉันจะไม่เขียนมันเป็นคำตอบ) ฉันคิดว่ามันง่ายกว่าที่จะคิดว่านักเทียบท่าเป็น chroot แฟนซีแล้วเป็นเครื่องเสมือน ไม่ถูกต้อง แต่มันช่วยเมื่อพยายามมองภาพในหัวของฉัน
coteyr

2
@coteyr - เป็นเรื่องตลกที่คุณพูดถึงความคล้ายคลึงกันฉันใช้อันนั้นในขณะที่พยายามอธิบายว่านักเทียบท่ากำลังทำอะไรอยู่ IMO Docker มีลักษณะเหมือน chroot มากกว่า virtualization
slm

คำตอบ:


53

นักเทียบท่าถูกโยนลงถังฝากเวอร์ชวลไลเซชันเพราะผู้คนคิดว่ามันเป็นฮาร์ดแวร์เสมือนจริงที่อยู่ด้านล่าง นี่คือการเรียกชื่อผิดที่แทรกซึมจากคำศัพท์ที่นักเทียบท่าใช้งานส่วนใหญ่เป็นคำว่าคอนเทนเนอร์

อย่างไรก็ตามนักเทียบท่าไม่ได้ทำอะไรที่มหัศจรรย์เกี่ยวกับการทำเวอร์ชวลฮาร์ดแวร์ของระบบ ค่อนข้างใช้ประโยชน์จากความสามารถของเคอร์เนล Linux เพื่อสร้าง "รั้ว" รอบ ๆ สิ่งอำนวยความสะดวกหลัก ๆ ซึ่งอนุญาตให้กระบวนการโต้ตอบกับทรัพยากรเช่นเครือข่ายระบบแฟ้มและการอนุญาต (เหนือสิ่งอื่นใด) เพื่อให้เห็นภาพลวงตาที่คุณกำลังโต้ตอบ ด้วยระบบการทำงานที่สมบูรณ์

นี่คือตัวอย่างที่แสดงให้เห็นถึงสิ่งที่เกิดขึ้นเมื่อเราเริ่มคอนเทนเนอร์ Docker จากนั้นป้อนผ่านการเรียก/bin/bashใช้

$ docker run -it ubuntu:latest /bin/bash
root@c0c5c54062df:/#

ตอนนี้จากภายในคอนเทนเนอร์นี้ถ้าเราเรียกใช้ps -eaf:

    SS01

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

    ss02

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

หมายเหตุ:กระบวนการนี้มี 4 sleep 1000คำสั่งที่กำลังแบ็กกราวด์

    ss03

ขอให้สังเกตว่าภายใน Docker container กระบวนการนั้นได้รับการกำหนด ID กระบวนการ (PID) 48-51 อย่างไร ดูพวกเขาในps -eafผลลัพธ์ในของพวกเขาเช่นกัน:

    ss04

อย่างไรก็ตามด้วยภาพถัดไปภาพ“ วิเศษ” ส่วนใหญ่ที่นักเทียบท่ากำลังแสดงนั้นถูกเปิดเผย

    SS05

มาดูกันว่าsleep 1000กระบวนการ4 กระบวนการเป็นเพียงแค่กระบวนการลูกกับกระบวนการ Bash ดั้งเดิมของเราหรือไม่ โปรดทราบว่า/bin/bashในความเป็นจริงแล้วกระบวนการย่อยของ Docker container นั้นเป็นกระบวนการย่อยของ daemon

ตอนนี้ถ้าเราต้องรอ 1000+ วินาทีเพื่อให้sleep 1000คำสั่งดั้งเดิมเสร็จสิ้นจากนั้นเรียกใช้คำสั่งใหม่อีก 4 รายการและเริ่มต้นนักเทียบท่าคอนเทนเนอร์อื่นเช่นนี้:

$ docker run -it ubuntu:latest /bin/bash
root@450a3ce77d32:/#

เอาต์พุตของโฮสต์คอมพิวเตอร์ps -eafจะเป็นดังนี้:

    SS06

และคอนเทนเนอร์ Docker อื่น ๆ ทั้งหมดจะปรากฏเป็นกระบวนการภายใต้ Docker daemon

ดังนั้นคุณจะเห็นได้ว่า Docker ไม่ได้จำลองเสมือนจริง ( ในแง่ดั้งเดิม ) มันสร้าง "รั้ว" รอบ ๆ ทรัพยากรเคอร์เนลที่หลากหลายและ จำกัด การมองเห็นพวกมันสำหรับกระบวนการ + ลูก ๆ


นักเทียบท่ายังสร้างพื้นที่ผู้ใช้แยกต่อการทำงานภาชนะ
Bhargav Nanekalva

3

ภายในคอนเทนเนอร์กระบวนการของคุณควรถูกแยกออก (กักกัน) ในความเป็นจริงคุณไม่ควรเห็นกระบวนการใด ๆ ยกเว้นกระบวนการที่คุณระบุ (อย่างน้อยเชลล์) มันไม่ได้สำหรับการทดสอบ "เป็นกันเอง" ความคล้ายคลึงกันอย่างเดียวกับ chroot คือโฮสต์เคอร์เนลถูกใช้ นักเทียบท่านั้นยอดเยี่ยมถ้าคุณต้องการแยกบางอย่างหรือใช้ซอฟต์แวร์สถาปัตยกรรมแพลตฟอร์มรุ่นอื่นที่แตกต่างจากที่ทำงานบนโฮสต์ (Java เวอร์ชันเก่ามากหรือ Python ที่ต่างกันพูด) ระวังให้ดีว่าโฟลเดอร์และไบนารีที่คุณติดต่ออาจไม่เหมือนกับโฟลเดอร์บนโฮสต์ มันไม่ใช่โฟลเดอร์ / bin เดียวกัน

แก้ไข: ความคล้ายคลึงกันกับ chroot มากกว่า VMs


1
แก้ไขแล้วฉันกำลังคิดโดยใช้ฝาครอบ Xen ดั้งเดิม เห็นได้ชัดว่าไม่ใช่กรณีเมื่อใช้ Windows ภายใต้ KVM / Qemu หรือใช้ VM 64 บิตบนโฮสต์ 32 บิตภายใต้ VirtualBox (ไม่ต้องถาม) มันคล้ายกับอาร์กิวเมนต์ pv vs hvm สำหรับ AWS
mckenzm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.