Docker มันคืออะไรและมีจุดประสงค์อะไร


115

ฉันเคยได้ยินเกี่ยวกับ Docker เมื่อหลายวันก่อนและอยากจะข้ามไป

แต่แท้จริงแล้วฉันไม่รู้ว่า "ตู้คอนเทนเนอร์" นี้มีจุดประสงค์อะไร?

คอนเทนเนอร์คืออะไร?

สามารถแทนที่เครื่องเสมือนที่ทุ่มเทให้กับการพัฒนาได้หรือไม่?

จุดประสงค์ของการใช้ Docker ใน บริษัท คืออะไร? ประโยชน์หลัก?



ฉันคิดว่ามันง่ายกว่าshivab.com/blog/docker/2019/01/10/…
illusionist

คำตอบ:


119

VM:การใช้ซอฟต์แวร์ VM เช่น Ubuntu สามารถติดตั้งภายใน Windows ได้ และทั้งคู่จะวิ่งไปพร้อม ๆ กัน มันเหมือนกับการสร้างพีซีโดยมีส่วนประกอบหลักเช่น CPU, RAM, ดิสก์, การ์ดเครือข่าย ฯลฯ ภายในระบบปฏิบัติการและประกอบเข้าด้วยกันเพื่อให้ทำงานได้ราวกับเป็นพีซีจริง ด้วยวิธีนี้พีซีเสมือนจะกลายเป็น "แขก" ภายในพีซีจริงซึ่งมีระบบปฏิบัติการซึ่งเรียกว่าโฮสต์

คอนเทนเนอร์:เหมือนกับด้านบน แต่แทนที่จะใช้ระบบปฏิบัติการทั้งหมดจะลดส่วนประกอบที่ "ไม่จำเป็น" ของระบบปฏิบัติการเสมือนเพื่อสร้างเวอร์ชันขั้นต่ำ สิ่งนี้นำไปสู่การสร้าง LXC (Linux Containers) เร็วกว่า VM Machines

Docker:คอนเทนเนอร์นักเทียบท่าซึ่งแตกต่างจากเครื่องเสมือนและคอนเทนเนอร์ไม่จำเป็นต้องมีหรือรวมระบบปฏิบัติการแยกต่างหาก แต่ขึ้นอยู่กับการทำงานของเคอร์เนล Linuxและใช้การแยกทรัพยากร
วัตถุประสงค์ของ Docker:จุดมุ่งหมายหลักคือการปรับใช้แอปพลิเคชันภายในคอนเทนเนอร์ซอฟต์แวร์โดยอัตโนมัติและการทำงานอัตโนมัติของระบบปฏิบัติการเสมือนในระดับระบบปฏิบัติการบน Linux มีน้ำหนักเบากว่าคอนเทนเนอร์มาตรฐานและบู๊ตได้ในไม่กี่วินาที ggg

(สังเกตว่าไม่มี Guest OS ที่จำเป็นในกรณีของ Docker)


1
ฉันพยายามมองหาแหล่งข้อมูลเกี่ยวกับเวิร์กโฟลว์การปรับใช้การพัฒนาของนักเทียบท่า แต่ดูเหมือนจะไม่พบอะไรเลย ยกตัวอย่างเช่นฉันมีสภาพแวดล้อม lampp ที่มี laravel + angular4 ฉันแชร์ไฟล์บางไฟล์ให้เพื่อนร่วมทีมหรือไม่? ฉันจะแก้ไขแหล่งที่มาของแอปพลิเคชัน (php html js / ts) ได้อย่างไรถ้าฉันใส่ไว้ในคอนเทนเนอร์ เรายังสามารถใช้ git / svn กับซอร์สโค้ดของเราได้หรือไม่?
anaval

13
VM ย่อมาจาก "เครื่องเสมือน" ไม่จำเป็นต้องเรียกว่า "VM Machine" เพราะเมื่อนั้นกลายเป็น "Virtual machine machine" :)
Dzhuneyt

32

[หมายเหตุคำตอบนี้มุ่งเน้นไปที่คอนเทนเนอร์ Linux และอาจใช้กับระบบปฏิบัติการอื่นไม่ได้ทั้งหมด ]

คอนเทนเนอร์คืออะไร?

มันคือแอพ : คอนเทนเนอร์คือวิธีเรียกใช้แอพพลิเคชั่นที่แยกออกจากกัน แทนที่จะทำให้ฮาร์ดแวร์เป็นเสมือนเพื่อรันระบบปฏิบัติการหลาย ๆ ระบบคอนเทนเนอร์ต้องอาศัยการจำลองเสมือนระบบปฏิบัติการเพื่อรันแอพพลิเคชั่นหลายตัว ซึ่งหมายความว่าคุณสามารถเรียกใช้คอนเทนเนอร์บนฮาร์ดแวร์เดียวกันได้มากกว่า VM เนื่องจากคุณมีระบบปฏิบัติการที่รันเพียงสำเนาเดียวและคุณไม่จำเป็นต้องจัดสรรหน่วยความจำและแกน CPU ล่วงหน้าสำหรับแต่ละอินสแตนซ์ของแอป เช่นเดียวกับแอปอื่น ๆ เมื่อคอนเทนเนอร์ต้องการซีพียูหรือหน่วยความจำมันจะจัดสรรให้และปล่อยให้เป็นอิสระเมื่อเสร็จสิ้นทำให้แอปอื่น ๆ สามารถใช้ทรัพยากรที่ จำกัด เดียวกันได้ในภายหลัง

พวกเขาใช้ประโยชน์จากเคอร์เนลเนมสเปซ : โดยค่าเริ่มต้นแต่ละคอนเทนเนอร์จะได้รับสภาพแวดล้อมที่มีการกำหนดเนมสเปซต่อไปนี้:

  • Mount: ระบบไฟล์/ในคอนเทนเนอร์จะแตกต่างจาก/บนโฮสต์
  • PID: รหัสกระบวนการ, pid 1 ในคอนเทนเนอร์คือแอปพลิเคชันที่เปิดใช้งานของคุณ pid นี้จะแตกต่างกันเมื่อดูจากโฮสต์
  • เครือข่าย: คอนเทนเนอร์ทำงานด้วยอินเทอร์เฟซแบบย้อนกลับของตัวเอง (127.0.0.1) และ IP ส่วนตัวตามค่าเริ่มต้น นักเทียบท่าใช้เทคโนโลยีเช่นเครือข่ายบริดจ์ของลินุกซ์เพื่อเชื่อมต่อคอนเทนเนอร์หลายตัวเข้าด้วยกันในแลนส่วนตัวของตนเอง
  • IPC: การสื่อสารระหว่างกระบวนการ
  • UTS: รวมถึงชื่อโฮสต์
  • ผู้ใช้: คุณสามารถเลือกที่จะเลื่อนรหัสผู้ใช้ทั้งหมดเพื่อหักล้างจากโฮสต์ได้

แต่ละเนมสเปซเหล่านี้ยังป้องกันไม่ให้คอนเทนเนอร์มองเห็นสิ่งต่างๆเช่นระบบไฟล์หรือกระบวนการบนโฮสต์หรือในคอนเทนเนอร์อื่น ๆ เว้นแต่คุณจะลบการแยกนั้นออกอย่างชัดเจน

และเครื่องมือรักษาความปลอดภัยอื่น ๆ ของลินุกซ์ : คอนเทนเนอร์ยังใช้คุณลักษณะด้านความปลอดภัยอื่น ๆ เช่น SELinux, AppArmor, Capabilities และ Seccomp เพื่อ จำกัด ผู้ใช้ภายในคอนเทนเนอร์รวมถึงผู้ใช้รูทไม่ให้สามารถหลบหนีจากคอนเทนเนอร์หรือส่งผลเสียต่อโฮสต์

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

สามารถแทนที่เครื่องเสมือนที่ทุ่มเทให้กับการพัฒนาได้หรือไม่?

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

จุดประสงค์ของการใช้ Docker ใน บริษัท คืออะไร? ประโยชน์หลัก?

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

หรือ Devops : หนึ่งในเป้าหมายที่ดีที่สุดคือการใช้ประโยชน์จาก Docker ทันทีจากเครื่องมือการปรับใช้ CI / CD รวบรวมแอปพลิเคชันและสร้างอิมเมจที่ปรับใช้กับการพัฒนา CI prod และอื่น ๆ ทันทีคอนเทนเนอร์มักจะลดเวลาในการย้ายแอปพลิเคชัน ตั้งแต่การเช็คอินโค้ดจนกระทั่งพร้อมสำหรับการทดสอบทำให้นักพัฒนามีประสิทธิภาพมากขึ้น และเมื่อได้รับการออกแบบอย่างเหมาะสมก็สามารถนำรูปภาพเดียวกันกับที่ทดสอบและรับรองโดยนักพัฒนาและเครื่องมือ CI ไปใช้ในการผลิตได้ เนื่องจากภาพดังกล่าวมีการอ้างอิงแอปพลิเคชันทั้งหมดความเสี่ยงที่จะเกิดการแตกหักในการผลิตที่ทำงานในการพัฒนาจึงลดลงอย่างมาก

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


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

2
@tyress หากโฮสต์ของคุณเป็น Linux คุณสามารถต่อเชื่อมอุปกรณ์เข้ากับคอนเทนเนอร์ Linux ได้โดยตรง ฉันเคยเห็นมันทำกับอุปกรณ์เสียง แต่สามารถเพิ่มอะไรก็ได้ใน / dev การดำเนินการนี้จะข้ามการแยกคอนเทนเนอร์บางส่วน แต่เหมาะสมสำหรับงานบางอย่างเช่นแอปเดสก์ท็อป
BMitch

เป็นที่น่าอัศจรรย์ ฉันไม่ได้คิดถึงเรื่องนั้น
Tyress

@BMitch: คำตอบที่สะอาดและสง่างามขอบคุณ !! ฉันคิดว่าตอนนี้ฉันสามารถนึกภาพออกได้แล้วว่าคอนเทนเนอร์คืออะไร.. อย่างไรก็ตามมันจะดีมากถ้าคุณสามารถอัปเดตคำตอบของคุณว่าคอนเทนเนอร์เกี่ยวข้องกับนักเทียบท่าอย่างไร? ในการเปรียบเทียบคอนเทนเนอร์และ VM นักเทียบท่าเทียบเท่ากับไฮเปอร์ไวเซอร์หรือไม่?
rahulaga_dev

1
Docker เป็นเครื่องมือที่ใช้คอนเทนเนอร์พร้อมกับการจัดเตรียมระบบนิเวศที่จำเป็นเช่นรีจิสทรีบนฮับนักเทียบท่าและสภาพแวดล้อมเดสก์ท็อปที่ฝัง VM เพื่อเรียกใช้คอนเทนเนอร์ Linux
BMitch

7

คำถามเดียวกันนี้กระทบหัวฉันเมื่อหลายวันก่อนและสิ่งที่ฉันพบหลังจากเข้าไปในนั้นมาทำความเข้าใจกันด้วยคำง่ายๆ

ทำไมใคร ๆ ก็นึกถึงนักเทียบท่าและตู้คอนเทนเนอร์ในเมื่อทุกอย่างดูดีด้วยกระบวนการสถาปัตยกรรมและการพัฒนาแอพพลิเคชั่นในปัจจุบัน !!

ลองยกตัวอย่างว่าเรากำลังพัฒนาแอปพลิเคชันโดยใช้บริการ nodeJs, MongoDB, Redis, RabbitMQ และอื่น ๆ [คุณสามารถนึกถึงบริการอื่น ๆ ได้]

ตอนนี้เราเผชิญกับสิ่งต่อไปนี้เป็นปัญหาในการพัฒนาแอปพลิเคชันและกระบวนการจัดส่งหากเราลืมเกี่ยวกับการมีอยู่ของนักเทียบท่าหรือทางเลือกอื่น ๆ ของแอปพลิเคชันการจัดตู้คอนเทนเนอร์

  1. ความเข้ากันได้ของบริการ (nodeJs, mongoDB, Redis, RabbitMQ เป็นต้น) กับระบบปฏิบัติการ (แม้ว่าจะพบเวอร์ชันที่เข้ากันได้กับ OS แล้วก็ตามหากมีสิ่งที่ไม่คาดคิดเกิดขึ้นเกี่ยวกับเวอร์ชันเราจำเป็นต้องเปิดความเข้ากันได้อีกครั้งและแก้ไข)

  2. หากส่วนประกอบของระบบสองส่วนต้องการไลบรารี / การพึ่งพากับเวอร์ชันที่แตกต่างกันในแอปพลิเคชันใน OS (ซึ่งจำเป็นต้องมีการตรวจสอบซ้ำทุกครั้งในกรณีที่แอปพลิเคชันทำงานโดยไม่คาดคิดเนื่องจากปัญหาไลบรารีและเวอร์ชันอ้างอิง)

  3. ที่สำคัญที่สุดคือหากมีคนใหม่เข้าร่วมทีมเราพบว่าการตั้งค่าสภาพแวดล้อมใหม่เป็นเรื่องยากมากคน ๆ นั้นต้องทำตามคำสั่งชุดใหญ่และเรียกใช้คำสั่งหลายร้อยคำสั่งเพื่อตั้งค่าสภาพแวดล้อมในที่สุดและต้องใช้เวลาและความพยายาม

    ผู้คนต้องตรวจสอบให้แน่ใจว่าพวกเขาใช้ OS เวอร์ชันที่ถูกต้องและตรวจสอบความเข้ากันได้ของบริการกับ OS และนักพัฒนาแต่ละคนต้องปฏิบัติตามทุกครั้งในขณะที่ตั้งค่า

  4. นอกจากนี้เรายังมีสภาพแวดล้อมที่แตกต่างกันเช่นการพัฒนาการทดสอบและการผลิตหากนักพัฒนาคนหนึ่งพอใจที่จะใช้ระบบปฏิบัติการหนึ่งระบบและคนอื่น ๆ ก็พอใจกับระบบปฏิบัติการอื่นและในกรณีนี้เราไม่สามารถรับประกันได้ว่าแอปพลิเคชันของเราจะทำงานในลักษณะเดียวกันในสองสถานการณ์ที่แตกต่างกันนี้ .

ทั้งหมดนี้ทำให้ชีวิตของเรายากในกระบวนการของการพัฒนา , การทดสอบและการจัดส่งสินค้าการใช้งาน

ดังนั้นเราจึงต้องการสิ่งที่จัดการกับปัญหาความเข้ากันได้และช่วยให้เราทำการเปลี่ยนแปลงและแก้ไขในส่วนประกอบของระบบใด ๆ โดยไม่ส่งผลกระทบต่อส่วนประกอบอื่น ๆ

ตอนนี้เราคิดเกี่ยวกับนักเทียบท่าเพราะมีจุดประสงค์เพื่อบรรจุแอปพลิเคชันและทำให้แอปพลิเคชันใช้งานได้โดยอัตโนมัติและจัดส่งได้อย่างง่ายดาย

ป้อนคำอธิบายภาพที่นี่

นักเทียบท่าแก้ปัญหาข้างต้นอย่างไร -

  1. เราสามารถเรียกใช้คอมโพเนนต์บริการ (nodeJs, MongoDB, Redis, RabbitMQ) ในคอนเทนเนอร์ที่แตกต่างกันโดยมีการอ้างอิงและไลบรารีของตัวเองในระบบปฏิบัติการเดียวกัน แต่มีสภาพแวดล้อมที่แตกต่างกัน

  2. เราจะต้องมีการทำงานเพียงแค่การกำหนดค่านักเทียบท่าครั้งเดียวแล้วทั้งหมดพัฒนาทีมงานของเราสามารถเริ่มต้นด้วยคำสั่งนักเทียบท่าวิ่งที่เรียบง่ายที่เราได้บันทึกจำนวนมากของเวลาและความพยายามที่นี่ :)

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

คอนเทนเนอร์ทั้งหมดใช้ทรัพยากรระบบปฏิบัติการเดียวกันดังนั้นจึงใช้เวลาน้อยลงในการบูตและใช้งาน CPU อย่างมีประสิทธิภาพโดยมีต้นทุนฮาร์ดแวร์น้อยลง

ฉันหวังว่านี่จะเป็นประโยชน์


2

ให้ฉันพยายามให้คำตอบที่ง่ายที่สุด:

แต่แท้จริงแล้วฉันไม่รู้ว่า "ตู้คอนเทนเนอร์" นี้มีจุดประสงค์อะไร?

คอนเทนเนอร์คืออะไร?

เพียงแค่ใส่ที่: แพคเกจที่มีซอฟแวร์ โดยเฉพาะอย่างยิ่งแอปพลิเคชันและการอ้างอิงทั้งหมดที่รวมเข้าด้วยกัน สภาพแวดล้อมของแอปพลิเคชันปกติที่ไม่ได้เทียบท่าจะเชื่อมต่อโดยตรงกับระบบปฏิบัติการในขณะที่คอนเทนเนอร์ Docker เป็นเลเยอร์นามธรรมของระบบปฏิบัติการ

และคอนเทนเนอร์แตกต่างจากอิมเมจตรงที่คอนเทนเนอร์เป็นอินสแตนซ์รันไทม์ของอิมเมจคล้ายกับที่อ็อบเจ็กต์เป็นอินสแตนซ์รันไทม์ของคลาสในกรณีที่คุณคุ้นเคยกับ OOP

สามารถแทนที่เครื่องเสมือนที่ทุ่มเทให้กับการพัฒนาได้หรือไม่?

ทั้ง VMs และ Docker container ต่างก็เป็นเทคนิค virtualisation ซึ่งให้สิ่งที่เป็นนามธรรมอยู่เหนือโครงสร้างพื้นฐานของระบบ

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

จุดประสงค์ของการใช้ Docker ใน บริษัท คืออะไร? ประโยชน์หลัก?

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

นอกจากนี้เนื่องจากคอนเทนเนอร์ Docker เป็นแบบอ่านอย่างเดียวจึงบังคับใช้หลักการ DevOps ที่สำคัญ: บริการการผลิตควรไม่มีการเปลี่ยนแปลง

ประโยชน์ทั่วไปบางประการของการใช้:

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