← คำถามทั้งหมด
Docker คืออะไร และทำงานอย่างไร?
บ่อยระดับเริ่มต้นDevOps

Docker คืออะไร และทำงานอย่างไร?

คำตอบสั้น
Docker เป็นแพลตฟอร์มแบบเปิดสำหรับการบรรจุและรันแอปพลิเคชันเป็นคอนเทนเนอร์: กระบวนการแยกที่แชร์เคอร์เนล Linux ของโฮสต์ (ผ่านเนมสเปซและ cgroups) แทนที่จะต้องใช้เครื่องเสมือนเต็มรูปแบบ มันใช้โมเดลไคลเอ็นต์ - เซิร์ฟเวอร์: the ไคลเอนต์ 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
  • dockerd daemon "ทำหน้าที่ยกของหนัก" ในการสร้าง ใช้งาน และกระจายคอนเทนเนอร์ และจัดการอ็อบเจ็กต์ เช่น อิมเมจ คอนเทนเนอร์ เครือข่าย และวอลุ่ม
  • ไคลเอนต์พูดคุยกับ 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) - ข้อกำหนดทั้งสามนี้ทำให้ระบบนิเวศสามารถทำงานร่วมกันได้

Dockerคอนเทนเนอร์

ดาวน์โหลดตอนนี้ แล้วทดลองใช้ฟรีกับงานของคุณ!

ดาวน์โหลดสำหรับ Windows
เครดิตฟรี 10 15 เครดิต • ไม่ต้องใช้บัตรเครดิตเวอร์ชัน: กำลังโหลด…

ไม่ต้องติดตั้ง - ดาวน์โหลดแล้วเปิดใช้ ไม่ต้องสมัคร - เข้าสู่ระบบด้วย Google