
Docker คืออะไร และทำงานอย่างไร?
docker ส่งคำสั่งผ่าน REST API ไปยัง dockerd daemon ซึ่ง
สร้างอิมเมจและรันคอนเทนเนอร์จากอิมเมจเหล่านั้นเหตุใดจึงมีอยู่ Docker ช่วยให้คุณสามารถจัดแพคเกจแอปพลิเคชันที่มีการขึ้นต่อกันทั้งหมด (ไลบรารี การกำหนดค่า รันไทม์) ให้เป็นอาร์ติแฟกต์เดียว — อิมเมจ — และเรียกใช้งานในลักษณะเดียวกันบนแล็ปท็อปสำหรับนักพัฒนา ใน CI และในการใช้งานจริง วิธีนี้จะช่วยแก้ปัญหา "ทำงานบนเครื่องของฉัน" แบบคลาสสิกได้
คอนเทนเนอร์เทียบกับเครื่องเสมือน VM จำลองฮาร์ดแวร์และจัดส่งระบบปฏิบัติการเกสต์ทั้งหมดด้วยเคอร์เนลของตัวเอง คอนเทนเนอร์เป็นกระบวนการแยกที่ใช้ เคอร์เนลของโฮสต์ เป็นผลให้คอนเทนเนอร์มีน้ำหนักเบาขึ้น เริ่มต้นในเสี้ยววินาที และใช้ทรัพยากรน้อยลง แต่คอนเทนเนอร์นั้น ไม่ใช่ VM น้ำหนักเบา: เชื่อมโยงกับเคอร์เนลของโฮสต์ และขอบเขตการแยกตัวของคอนเทนเนอร์นั้นอ่อนแอกว่า VM VM มีการแยกส่วนที่บังคับใช้ด้วยฮาร์ดแวร์ ในขณะที่ช่องโหว่ในเคอร์เนลที่ใช้ร่วมกันสามารถหลบหนีออกจากคอนเทนเนอร์ได้ นั่นคือการแลกเปลี่ยนความเร็วและความหนาแน่น โฮสต์ต้องตรงกับประเภทคอนเทนเนอร์: คอนเทนเนอร์ Linux ต้องใช้เคอร์เนล Linux คอนเทนเนอร์ Windows ต้องใช้เคอร์เนล Windows บน macOS และ Windows นั้น Docker Desktop จะรัน Linux VM ขนาดเล็กอย่างโปร่งใส (เช่น ผ่าน WSL2) ดังนั้นคอนเทนเนอร์ Linux จึงแชร์เคอร์เนลของ VM นั้น ไม่ใช่เคอร์เนลของระบบปฏิบัติการของคุณ
สถาปัตยกรรม (ไคลเอนต์-เซิร์ฟเวอร์) เอกสารประกอบของ Docker ต่อ:
- ไคลเอ็นต์
dockerเป็นวิธีหลักที่ผู้ใช้โต้ตอบกับ Docker คำสั่งเช่นdocker runจะถูกส่งไปยัง daemon dockerddaemon "ทำหน้าที่ยกของหนัก" ในการสร้าง ใช้งาน และกระจายคอนเทนเนอร์ และจัดการอ็อบเจ็กต์ เช่น อิมเมจ คอนเทนเนอร์ เครือข่าย และวอลุ่ม- ไคลเอนต์พูดคุยกับ daemon ผ่าน REST API ผ่านซ็อกเก็ต UNIX หรืออินเทอร์เฟซเครือข่าย เพื่อให้สามารถทำงานบนเครื่องที่แตกต่างกันได้
- รีจิสทรี จัดเก็บรูปภาพ สาธารณะเริ่มต้นคือ Docker Hub
รูปภาพและคอนเทนเนอร์ การเปรียบเทียบที่สะดวก: รูปภาพก็เหมือนกับคลาส (หรือโปรแกรมบนดิสก์) และคอนเทนเนอร์ก็เป็นอินสแตนซ์ของคลาสนั้น (กระบวนการที่ทำงานอยู่) คุณสามารถเริ่มคอนเทนเนอร์จำนวนมากได้จากรูปภาพเดียว
- รูปภาพ เป็นเทมเพลตแบบอ่านอย่างเดียวพร้อมคำแนะนำในการสร้างคอนเทนเนอร์ที่สร้างจากเลเยอร์ มันถูกกำหนดโดย Dockerfile; เมื่อคุณเปลี่ยน จะมีเพียงเลเยอร์ที่เปลี่ยนแปลงเท่านั้นที่ถูกสร้างขึ้นใหม่
- คอนเทนเนอร์ เป็นอินสแตนซ์ที่รันได้ของรูปภาพ ด้านบนของเลเยอร์แบบอ่านอย่างเดียวของรูปภาพนั้นจะเพิ่ม เลเยอร์ที่เขียนได้ แบบบาง (คัดลอกเมื่อเขียน) สิ่งใดก็ตามที่เขียนไว้จะหายไปเมื่อคอนเทนเนอร์ถูกลบออก ซึ่งเป็นเหตุผลว่าทำไมข้อมูลถาวรจึงต้องการปริมาณ
วิธีการทำงานของการแยกส่วน (ภายใต้ประทุน) dockerd ไม่ได้เรียกเคอร์เนลโดยตรง — โดยจะมอบหมายการจัดการวงจรการใช้งานคอนเทนเนอร์ให้กับ containerd ซึ่งจะเรียกใช้รันไทม์ OCI ใน Docker ค่าเริ่มต้นคือ runc แต่รันไทม์สามารถเสียบได้ (crun, gVisor, Kata ฯลฯ ) การแยกที่แท้จริงมาจากคุณสมบัติเคอร์เนล Linux:
- เนมสเปซ แยกทรัพยากร (ตามเพจ man7 มี 8 ประเภท: PID, เครือข่าย, เมาท์, UTS, IPC, ผู้ใช้, cgroup, เวลา) กระบวนการ "เห็น" PID ของตัวเอง สแต็กเครือข่ายของตัวเอง และอื่นๆ เท่านั้น
- cgroups (กลุ่มควบคุม) ขีดจำกัดและบัญชีสำหรับการใช้งานทรัพยากร (CPU, หน่วยความจำ, I/O)
การติดตามผลทั่วไป เลเยอร์รูปภาพถูกแคชไว้ docker compose รันแอพหลายคอนเทนเนอร์ ข้อมูลคงอยู่ผ่านวอลุ่ม (คอนเทนเนอร์เป็นแบบชั่วคราวโดยค่าเริ่มต้น) และ OCI สร้างมาตรฐานให้กับรูปแบบรูปภาพ (image-spec), รันไทม์ (runtime-spec) และโปรโตคอลการแจกจ่ายรีจิสทรี (distribution-spec) - ข้อกำหนดทั้งสามนี้ทำให้ระบบนิเวศสามารถทำงานร่วมกันได้
