ทำความเข้าใจกับนักเทียบท่า

ฉันใช้ Docker มาหลายเดือนแล้วเพื่อจัดโครงสร้างกระบวนการพัฒนา/ส่งมอบของโครงการเว็บ ฉันเสนอให้ผู้อ่าน Habrakhabr แปลบทความเบื้องต้นเกี่ยวกับนักเทียบท่า - “ทำความเข้าใจนักเทียบท่า”.

นักเทียบท่าคืออะไร?

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

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

แพลตฟอร์มและเครื่องมือการจำลองเสมือนของคอนเทนเนอร์อาจมีประโยชน์ในกรณีต่อไปนี้:

  • บรรจุแอปพลิเคชันของคุณ (และส่วนประกอบที่คุณใช้) ลงในคอนเทนเนอร์นักเทียบท่า
  • การจัดจำหน่ายและการส่งมอบคอนเทนเนอร์เหล่านี้ให้กับทีมของคุณเพื่อการพัฒนาและการทดสอบ
  • การวางคอนเทนเนอร์เหล่านี้บนไซต์การผลิตของคุณ ทั้งในศูนย์ข้อมูลและในระบบคลาวด์

ฉันสามารถใช้นักเทียบท่าทำอะไรได้บ้าง

เผยแพร่แอปพลิเคชันของคุณอย่างรวดเร็ว

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

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

วางและกางออกได้ง่ายขึ้น

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

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

โหลดที่สูงขึ้นและน้ำหนักบรรทุกที่มากขึ้น

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

ส่วนประกอบนักเทียบท่าหลัก

นักเทียบท่าประกอบด้วยสององค์ประกอบหลัก:

  • นักเทียบท่า: แพลตฟอร์มการจำลองเสมือนแบบโอเพ่นซอร์ส
  • Docker Hub: แพลตฟอร์มที่เป็นบริการของเราสำหรับการจัดจำหน่ายและการจัดการคอนเทนเนอร์ Docker

บันทึก! Docker ได้รับการเผยแพร่ภายใต้ลิขสิทธิ์ Apache 2.0

สถาปัตยกรรมนักเทียบท่า

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

ทำความเข้าใจกับนักเทียบท่า

นักเทียบท่าเดมอน

ดังที่แสดงในแผนภาพ daemon ทำงานบนเครื่องโฮสต์ ผู้ใช้ไม่ได้โต้ตอบกับเซิร์ฟเวอร์โดยตรง แต่ใช้ไคลเอนต์เพื่อสิ่งนี้

ไคลเอ็นต์นักเทียบท่า

ไคลเอนต์นักเทียบท่าซึ่งเป็นโปรแกรมนักเทียบท่าเป็นอินเทอร์เฟซหลักของนักเทียบท่า รับคำสั่งจากผู้ใช้และโต้ตอบกับ docker daemon

ภายในนักเทียบท่า

เพื่อทำความเข้าใจว่านักเทียบท่าประกอบด้วยอะไรบ้าง คุณจำเป็นต้องรู้เกี่ยวกับองค์ประกอบสามประการ:

  • ภาพ
  • รีจิสทรี
  • ภาชนะบรรจุ

ภาพ

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

ทะเบียน

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

ตู้คอนเทนเนอร์

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

Docker ทำงานอย่างไร?

จนถึงตอนนี้เรารู้แล้วว่า:

  • เราสามารถสร้างภาพที่แอปพลิเคชันของเราอยู่
  • เราสามารถสร้างคอนเทนเนอร์จากรูปภาพเพื่อเรียกใช้แอปพลิเคชัน
  • เราสามารถแจกจ่ายรูปภาพผ่าน Docker Hub หรือรีจิสตรีรูปภาพอื่นได้

มาดูกันว่าส่วนประกอบเหล่านี้เข้ากันได้อย่างไร

รูปภาพทำงานอย่างไร?

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

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

หัวใจของทุกภาพคือภาพพื้นฐาน ตัวอย่างเช่น ubuntu ซึ่งเป็นอิมเมจพื้นฐานของ Ubuntu หรือ fedora ซึ่งเป็นอิมเมจพื้นฐานของการแจกจ่าย Fedora คุณยังสามารถใช้รูปภาพเป็นฐานในการสร้างรูปภาพใหม่ได้ ตัวอย่างเช่น หากคุณมีอิมเมจ apache คุณสามารถใช้อิมเมจดังกล่าวเป็นอิมเมจพื้นฐานสำหรับเว็บแอปพลิเคชันของคุณได้

บันทึก! โดยทั่วไปนักเทียบท่าจะดึงรูปภาพจากรีจิสทรี Docker Hub

สามารถสร้างอิมเมจ Docker ได้จากอิมเมจพื้นฐานเหล่านี้ เราเรียกขั้นตอนในการสร้างคำแนะนำเกี่ยวกับอิมเมจเหล่านี้ แต่ละคำสั่งจะสร้างภาพหรือระดับใหม่ คำแนะนำจะเป็นดังนี้:

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

คำแนะนำเหล่านี้ถูกจัดเก็บไว้ในไฟล์ Dockerfile. นักเทียบท่าอ่านข้อความนี้ Dockerfileเมื่อคุณสร้างอิมเมจ ให้ดำเนินการตามคำแนะนำเหล่านี้และส่งคืนอิมเมจสุดท้าย

รีจิสทรีนักเทียบท่าทำงานอย่างไร

รีจิสทรีเป็นที่เก็บข้อมูลสำหรับอิมเมจนักเทียบท่า เมื่อสร้างภาพแล้ว คุณสามารถเผยแพร่ไปยังรีจิสทรี Docker Hub สาธารณะหรือไปยังรีจิสทรีส่วนบุคคลของคุณได้

ด้วยไคลเอ็นต์นักเทียบท่า คุณสามารถค้นหาภาพที่เผยแพร่แล้วและดาวน์โหลดลงในเครื่องนักเทียบท่าเพื่อสร้างคอนเทนเนอร์ได้

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

คอนเทนเนอร์ทำงานอย่างไร?

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

จะเกิดอะไรขึ้นเมื่อคอนเทนเนอร์เริ่มทำงาน?

หรือใช้โปรแกรม dockerหรือใช้ RESTful API ไคลเอ็นต์นักเทียบท่าจะบอกนักเทียบท่า daemon ให้เริ่มคอนเทนเนอร์

$ sudo docker run -i -t ubuntu /bin/bash

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

  • รูปภาพใดที่จะใช้ในการสร้างคอนเทนเนอร์ ในกรณีของเรา ubuntu
  • คำสั่งที่คุณต้องการรันเมื่อคอนเทนเนอร์เริ่มทำงาน ในกรณีของเรา /bin/bash

จะเกิดอะไรขึ้นภายใต้ประทุนเมื่อเรารันคำสั่งนี้?

Docker ตามลำดับจะทำสิ่งต่อไปนี้:

  • ดาวน์โหลดอิมเมจ Ubuntu: นักเทียบท่าตรวจสอบความพร้อมใช้งานของรูปภาพ ubuntu บนเครื่องท้องถิ่น และหากไม่มี ให้ดาวน์โหลดจาก ศูนย์กลางนักเทียบท่า. หากมีรูปภาพก็จะใช้รูปภาพนั้นเพื่อสร้างคอนเทนเนอร์
  • สร้างคอนเทนเนอร์: เมื่อได้รับรูปภาพ นักเทียบท่าจะใช้มันเพื่อสร้างคอนเทนเนอร์
  • เริ่มต้นระบบไฟล์และติดตั้งระดับอ่านอย่างเดียว: คอนเทนเนอร์ถูกสร้างขึ้นในระบบไฟล์และรูปภาพถูกเพิ่มในระดับอ่านอย่างเดียว
  • เริ่มต้นเครือข่าย/บริดจ์: สร้างอินเทอร์เฟซเครือข่ายที่อนุญาตให้นักเทียบท่าสื่อสารกับเครื่องโฮสต์
  • การตั้งค่าที่อยู่ IP: ค้นหาและกำหนดที่อยู่
  • เริ่มกระบวนการที่ระบุ: เปิดตัวแอปพลิเคชันของคุณ
  • ประมวลผลและสร้างผลลัพธ์จากแอปพลิเคชันของคุณ: เชื่อมต่อและบันทึกอินพุต เอาต์พุต และสตรีมข้อผิดพลาดมาตรฐานของแอปพลิเคชันของคุณ เพื่อให้คุณสามารถติดตามว่าแอปพลิเคชันของคุณทำงานอย่างไร

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

เทคโนโลยีที่ใช้

Docker เขียนด้วยภาษา Go และใช้คุณสมบัติบางอย่างของเคอร์เนล Linux เพื่อใช้งานฟังก์ชันข้างต้น

เนมสเปซ

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

ซึ่งจะสร้างเลเยอร์ที่แยกออกจากกัน โดยแต่ละแง่มุมของคอนเทนเนอร์จะทำงานในเนมสเปซของตัวเอง และไม่สามารถเข้าถึงระบบภายนอกได้

รายการเนมสเปซบางส่วนที่นักเทียบท่าใช้:

  • ปี๊ด: เพื่อแยกกระบวนการ
  • สุทธิ: สำหรับการจัดการอินเทอร์เฟซเครือข่าย
  • ไอพีซี: เพื่อจัดการทรัพยากร IPC (ICP: การสื่อสารระหว่างกระบวนการ);
  • นาที: เพื่อจัดการจุดเมานท์
  • เวลาทำการ: เพื่อแยกเคอร์เนลและการควบคุมการสร้างเวอร์ชัน (UTC: Unix timesharing system)

กลุ่มควบคุม

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

ระบบไฟล์ยูเนี่ยน

Union File Sysem หรือ UnionFS เป็นระบบไฟล์ที่ทำงานโดยการสร้างเลเยอร์ ทำให้มีขนาดเล็กและรวดเร็วมาก นักเทียบท่าใช้ UnionFS เพื่อสร้างบล็อกที่ใช้สร้างคอนเทนเนอร์ นักเทียบท่าสามารถใช้ UnionFS ได้หลายรูปแบบ ได้แก่ AUFS, btrfs, vfs และ DeviceMapper

รูปแบบคอนเทนเนอร์

นักเทียบท่ารวมส่วนประกอบเหล่านี้ไว้ใน wrapper ที่เราเรียกว่ารูปแบบคอนเทนเนอร์ รูปแบบเริ่มต้นเรียกว่า libcontainer. นักเทียบท่ายังรองรับรูปแบบคอนเทนเนอร์ดั้งเดิมบน Linux โดยใช้ LXC. ในอนาคต Docker อาจรองรับรูปแบบคอนเทนเนอร์อื่นๆ ตัวอย่างเช่น การรวมเข้ากับ BSD Jails หรือ Solaris Zones

ที่มา: will.com

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