VM หรือนักเทียบท่า?

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

คอนเทนเนอร์ Docker และ VM แตกต่างกันอย่างไร

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

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

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

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

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

ตู้คอนเทนเนอร์ - มันทำงานอย่างไร?

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

แต่ละคอนเทนเนอร์สามารถกำหนดค่าผ่านไฟล์ในโครงการ docker-compose ที่รวมอยู่ในโซลูชันหลัก docker-compose.yml คุณสามารถตั้งค่าพารามิเตอร์ต่างๆ ได้ที่นั่น เช่น ชื่อคอนเทนเนอร์ พอร์ต ตัวระบุ ขีดจำกัดของทรัพยากร การพึ่งพาระหว่างคอนเทนเนอร์อื่นๆ หากคุณไม่ระบุชื่อคอนเทนเนอร์ในการตั้งค่า Docker จะสร้างคอนเทนเนอร์ใหม่ทุกครั้งโดยกำหนดชื่อให้แบบสุ่ม

เมื่อคอนเทนเนอร์เริ่มต้นจากอิมเมจ Docker จะเมานต์ระบบไฟล์อ่าน/เขียนที่ด้านบนของเลเยอร์ด้านล่าง นี่คือที่ที่กระบวนการทั้งหมดที่เราต้องการให้คอนเทนเนอร์ Docker ทำงานจะทำงาน

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

รูปภาพเกี่ยวข้องกับคอนเทนเนอร์อย่างไร

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

หัวใจสำคัญของแต่ละภาพคือภาพพื้นฐานซึ่งระบุโดยคำสั่ง FROM - จุดเริ่มต้นเมื่อสร้างภาพ Dockerfile แต่ละเลเยอร์เป็นเลเยอร์แบบอ่านอย่างเดียวและแสดงด้วยคำสั่งเดียวที่แก้ไขระบบไฟล์ ซึ่งเขียนด้วย Dockerfile
ในการรวมเลเยอร์เหล่านี้ไว้ในอิมเมจเดียว Docker ใช้ระบบไฟล์ Union หลายเลเยอร์ขั้นสูง (AuFS สร้างขึ้นบน UnionFS) ทำให้ไฟล์และไดเร็กทอรีต่างๆ จากเลเยอร์ไฟล์ต่างๆ ทับซ้อนกันได้อย่างโปร่งใส สร้างระบบไฟล์ที่เกี่ยวข้อง

เลเยอร์มีข้อมูลเมตาที่อนุญาตให้คุณจัดเก็บข้อมูลที่เกี่ยวข้องเกี่ยวกับแต่ละเลเยอร์ในขณะรันไทม์และเวลาสร้าง แต่ละเลเยอร์มีลิงก์ไปยังเลเยอร์ถัดไป ถ้าเลเยอร์นั้นไม่มีลิงก์ เลเยอร์นี้จะเป็นเลเยอร์บนสุดของรูปภาพ

Dockerfile อาจมีคำสั่งเช่น:

  • จาก - จุดเริ่มต้นในการก่อตัวของภาพ;
  • ผู้ดูแล - ชื่อเจ้าของภาพ
  • RUN - การดำเนินการคำสั่งระหว่างการประกอบภาพ
  • เพิ่ม - คัดลอกไฟล์โฮสต์ไปยังรูปภาพใหม่ หากคุณระบุไฟล์ URL นักเทียบท่าจะดาวน์โหลดไปยังไดเร็กทอรีที่ระบุ
  • ENV - ตัวแปรสภาพแวดล้อม
  • CMD - เริ่มสร้างคอนเทนเนอร์ใหม่ตามรูปภาพ
  • ENTRYPOINT - คำสั่งถูกดำเนินการเมื่อคอนเทนเนอร์เริ่มทำงาน
  • WORKDIR เป็นไดเร็กทอรีสำหรับรันคำสั่ง CMD
  • USER - ตั้งค่า UID สำหรับคอนเทนเนอร์ที่สร้างจากอิมเมจ
  • VOLUME - เมานต์ไดเร็กทอรีโฮสต์ไปยังคอนเทนเนอร์
  • EXPOSE คือชุดของพอร์ตที่รับฟังในคอนเทนเนอร์

UnionFS ทำงานอย่างไร

ยูเนี่ยนเอฟเอส — บริการระบบไฟล์สแตก (FS) สำหรับ Linux และ FreeBSD FS นี้ใช้กลไกการคัดลอกเมื่อเขียน (Copy-On-Write, COW) หน่วยงานของ UnionFS เป็นเลเยอร์ แต่ละเลเยอร์ควรได้รับการพิจารณาว่าเป็นระบบไฟล์ที่สมบูรณ์แยกจากกันโดยมีลำดับชั้นไดเร็กทอรีจากรูท UnionFS สร้าง union mount สำหรับระบบไฟล์อื่น ๆ และอนุญาตให้คุณรวมไฟล์และไดเร็กทอรีจากระบบไฟล์ต่าง ๆ (เรียกว่า Branch) เป็นระบบไฟล์ที่เชื่อมโยงระบบเดียวอย่างโปร่งใสสำหรับผู้ใช้

เนื้อหาของไดเร็กทอรีที่มีพาธเดียวกันจะแสดงร่วมกันในไดเร็กทอรีรวมหนึ่งไดเร็กทอรี (ในเนมสเปซเดียวกัน) ของระบบไฟล์ที่เป็นผลลัพธ์

UnionFS รวมเลเยอร์ตามหลักการต่อไปนี้:

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

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

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

ที่มา: will.com

เพิ่มความคิดเห็น