Docker คืออะไร? จุดประกายสำหรับการปฏิวัติตู้คอนเทนเนอร์

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

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

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

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

นักเทียบท่า

Docker คืออะไร?

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

Dockerfile

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

Paige Niedringhaus ที่ ITNext มีรายละเอียดที่ดีของไวยากรณ์ของ Dockerfile

อิมเมจ Docker

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

นักเทียบท่าทำงาน

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

Docker Hub

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

Docker Engine

Docker Engine เป็นหัวใจหลักของ Docker ซึ่งเป็นเทคโนโลยีไคลเอนต์เซิร์ฟเวอร์พื้นฐานที่สร้างและรันคอนเทนเนอร์ โดยทั่วไปเมื่อมีคนพูดถึงDockerโดยทั่วไปและไม่ได้พูดถึง บริษัท หรือโครงการโดยรวมพวกเขาหมายถึง Docker Engine Docker Engine มีให้เลือก 2 เวอร์ชัน ได้แก่ Docker Engine Enterprise และ Docker Engine Community

Docker Community Edition

Docker เปิดตัวEnterprise Editionในปี 2560 แต่ข้อเสนอดั้งเดิมที่เปลี่ยนชื่อเป็น Docker Community Edition ยังคงเป็นโอเพ่นซอร์สและไม่มีค่าใช้จ่ายและไม่สูญเสียคุณสมบัติใด ๆ ในกระบวนการ Enterprise Edition ซึ่งมีราคา 1,500 ดอลลาร์ต่อโหนดต่อปีได้เพิ่มคุณสมบัติการจัดการขั้นสูงซึ่งรวมถึงการควบคุมสำหรับคลัสเตอร์และการจัดการรูปภาพและการตรวจสอบช่องโหว่ บล็อก BoxBoat มีการสรุปความแตกต่างระหว่างรุ่นต่างๆ

นักเทียบท่าพิชิตโลกคอนเทนเนอร์ได้อย่างไร

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

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

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

Docker Compose, Docker Swarm และ Kubernetes

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

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

ข้อดีของ Docker

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

คอนเทนเนอร์ Docker ช่วยให้สามารถแยกและควบคุมปริมาณได้

คอนเทนเนอร์นักเทียบท่าไม่เพียง แต่แยกแอปออกจากกันเท่านั้น แต่ยังแยกจากระบบพื้นฐานด้วย สิ่งนี้ไม่เพียง แต่สร้างขึ้นเพื่อสแต็กซอฟต์แวร์ที่สะอาดขึ้นเท่านั้น แต่ยังช่วยให้กำหนดวิธีที่แอปพลิเคชันคอนเทนเนอร์ที่กำหนดใช้ทรัพยากรระบบได้ง่ายขึ้นเช่น CPU, GPU, หน่วยความจำ, I / O, ระบบเครือข่ายและอื่น ๆ นอกจากนี้ยังช่วยให้มั่นใจได้ว่าข้อมูลและรหัสจะแยกจากกัน (ดู“ คอนเทนเนอร์นักเทียบท่าไม่มีสถานะและไม่เปลี่ยนรูป” ด้านล่าง)

คอนเทนเนอร์ Docker ช่วยให้สามารถพกพาได้

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

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

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

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

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

คอนเทนเนอร์ Docker เปิดใช้งานความสามารถในการประกอบ

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

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

คอนเทนเนอร์ Docker ช่วยให้การจัดระเบียบและการปรับขนาดทำได้ง่ายขึ้น

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

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

นักเทียบท่ายังมีระบบออเคสเตชั่นในตัวโหมด Swarm ซึ่งยังคงใช้สำหรับเคสที่มีความต้องการน้อยกว่า ที่กล่าวว่า Kubernetes กลายเป็นตัวเลือกเริ่มต้น ในความเป็นจริง Kubernetes มาพร้อมกับ Docker Enterprise Edition

คำเตือนนักเทียบท่า

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

คอนเทนเนอร์ Docker ไม่ใช่เครื่องเสมือน

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

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

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

คอนเทนเนอร์นักเทียบท่าไม่ได้ให้ความเร็วโลหะเปล่า