รายละเอียดการแนะนำรายละเอียดเกี่ยวกับไดรเวอร์ Docker Storage
ฉันเพิ่งทำงานในโครงการและไม่ทราบวิธีการใช้ไดรเวอร์ที่เก็บของ Docker ในช่วงเวลานี้ดังนั้นฉันจึงค้นหาข้อมูลออนไลน์และแก้ไขได้ ฉันจะบันทึกที่นี่
วัตถุประสงค์
Docker เป็นเอ็นจิ้นคอนเทนเนอร์แอปพลิเคชันโอเพ่นซอร์สที่ใช้เนมสเปซเคอร์เนล Linux เพื่อให้ได้การแยก Sandbox และใช้ cgroup เพื่อให้ได้ข้อ จำกัด ด้านทรัพยากร Docker เป็นคอนเทนเนอร์ Linux ที่มีน้ำหนักเบาที่ใช้สำหรับการพัฒนาแบบครบวงจรและการปรับใช้พยายามที่จะแก้ปัญหา "การพึ่งพานรก" รวมบริการและส่วนประกอบที่พึ่งพาได้คล้ายกับภาชนะที่ใช้โดยเรือและบรรลุการติดตั้งและการปรับใช้อย่างรวดเร็ว
1. สถาปัตยกรรมพื้นฐานของ Docker - Client and Daemon
ก่อนอื่นให้เราเข้าใจสถาปัตยกรรมพื้นฐานและกระบวนการเริ่มต้นของ Docker ในความเป็นจริง Docker ใช้สถาปัตยกรรม C/S รวมถึงไคลเอนต์และเซิร์ฟเวอร์ Docker Daemon ยอมรับคำขอจากลูกค้าเป็นเซิร์ฟเวอร์และประมวลผลคำขอเหล่านี้ (สร้าง, เรียกใช้, ส่งคอนเทนเนอร์) ไคลเอนต์และเซิร์ฟเวอร์สื่อสารบนเครื่องเดียวกันผ่านทาง API ในกระบวนการใช้งานเฉพาะหลังจากดำเนินการบริการ Docker Service แล้วกระบวนการ Docker Deamon Daemon จะถูกสร้างขึ้นบนโฮสต์ทำงานในพื้นหลังและรอรับข้อความจากลูกค้า (เช่นคำสั่ง Docker อินพุตเช่น Docker Pull XXX, Docker Run ... หลังจากเริ่มบริการ Docker คุณสามารถดูกระบวนการ Docker
ค่าเริ่มต้น
[root@localhost ~]# ps -aux | Grep Dockerroot 11701 0.0 0.4 359208 16624? SSL 21:05 0:00/USR/BIN/DOCKER -D -H FD: // --Selinux -enabled -Ininsure -Registry 186.100.8.216:5000 ROOT 11861 0.0 0.0 113004 2256 PTS/0 S+ 23:01 0:00
นี่เป็นส่วนใหญ่เป็นเพราะเมื่อระบุระบบไฟล์ในภายหลังคุณต้องกำหนดค่าไดรเวอร์ที่เก็บข้อมูลเฉพาะใน/etc/sysconfig/docker (จะเขียนบล็อกพิเศษ) จากนั้นเริ่ม Docker daemon และไม่สามารถทำงานผ่านพารามิเตอร์ของคำสั่ง Run นอกจากนี้คุณยังสามารถตั้งค่าได้โดยตรงจากบรรทัดคำสั่งโฮสต์ผ่าน Docker d
2. วิธีการจัดเก็บข้อมูล Docker - ไดรเวอร์ที่เก็บข้อมูล
ส่วนหลักของโมเดล Docker คือการใช้กลไกการทำมิเรอร์แบบลำดับชั้นอย่างมีประสิทธิภาพ กระจกสามารถสืบทอดผ่านลำดับชั้น ขึ้นอยู่กับภาพพื้นฐาน (โดยไม่มีภาพแม่) สามารถสร้างภาพแอปพลิเคชันเฉพาะต่างๆได้ คอนเทนเนอร์ Docker ที่แตกต่างกันสามารถแบ่งปันเลเยอร์ระบบไฟล์พื้นฐานบางชั้นและในเวลาเดียวกันควบคู่ไปกับเลเยอร์การเปลี่ยนแปลงที่เป็นเอกลักษณ์ของตัวเองปรับปรุงประสิทธิภาพการจัดเก็บอย่างมาก กลไกหลักคือโมเดลลำดับชั้นและติดตั้งไดเรกทอรีที่แตกต่างกันไปยังระบบไฟล์เสมือนจริงเดียวกัน (รวมไดเรกทอรีหลายตัวลงในระบบไฟล์เสมือนจริงเดียวจากบทความนี้) ไดรเวอร์ที่เก็บข้อมูลที่แตกต่างกันหลายตัวใช้สำหรับ Mirror Storage Docker รวมถึง: AUFS, Devicemapper, BTRFs และ Overlay (จากเว็บไซต์ทางการ) ต่อไปนี้เป็นการแนะนำสั้น ๆ เกี่ยวกับไดรเวอร์ที่เก็บข้อมูลที่แตกต่างกัน
aufs
AUFS (otherunionfs) เป็นระบบไฟล์ร่วม AUFs รองรับการตั้งค่าการอนุญาตแบบอ่านอย่างเดียว, ReadWrite และการทำ whiteout-able สำหรับแต่ละไดเรกทอรีสมาชิก (คล้ายกับ Git) ในเวลาเดียวกันมีแนวคิดที่คล้ายกันใน AUFS ซึ่งสาขาที่มีสิทธิ์อ่านอย่างเดียวสามารถแก้ไขได้อย่างมีเหตุผลเพิ่มขึ้นอย่างมีเหตุผล (ไม่ส่งผลกระทบต่อส่วนที่อ่านอย่างเดียว) ไดรเวอร์ที่เก็บข้อมูลเพียงอย่างเดียวของ AUFS สามารถตระหนักถึงการแบ่งปันไลบรารีรันไทม์ที่ใช้งานได้และแชร์ได้ระหว่างคอนเทนเนอร์ดังนั้นเมื่อคุณรันรันไทม์หลายร้อยครั้งด้วยรหัสโปรแกรมเดียวกันหรือไลบรารีรันไทม์ AUFS เป็นตัวเลือกที่ดีมาก
MAPPER อุปกรณ์
Mapper Device เป็นกลไกการแมปเฟรมเวิร์กจากอุปกรณ์ตรรกะไปจนถึงอุปกรณ์ทางกายภาพที่มีให้ในเคอร์เนล Linux 2.6 ภายใต้กลไกนี้ผู้ใช้สามารถกำหนดกลยุทธ์การจัดการสำหรับการใช้ทรัพยากรการจัดเก็บตามความต้องการของพวกเขาได้อย่างง่ายดาย (ดูรายละเอียด) ไดรเวอร์ Mapper Device จะสร้างไฟล์ง่ายๆ 100 กรัมที่มีรูปภาพและคอนเทนเนอร์ของคุณแต่ละคอนเทนเนอร์จะถูก จำกัด ด้วยปริมาตรขนาด 10 กรัม (หมายเหตุ: นี่คือไฟล์เบาบางที่สร้างขึ้นโดยอัตโนมัติโดยใช้ loopback โดยเฉพาะข้อมูลและข้อมูลเมตาภายใต้/var/lib/docker/devicemapper คุณสามารถปรับขนาดของคอนเทนเนอร์ Docker สำหรับการอ้างอิงเฉพาะ) คุณสามารถใช้พารามิเตอร์ -S เพื่อระบุไดรเวอร์เมื่อเริ่มต้น Docker daemon นั่นคือคุณสามารถตั้งค่าไดรเวอร์ Docker Storage โดย Docker -D -S DeviceMapper ก่อนอื่นปิดบริการ Docker และดำเนินการคำสั่ง:
ค่าเริ่มต้น
[root@localhost ~]# docker -d -s devicemapperinfo [0000] +งาน serveapi (unix: ///var/run/docker.sock) ข้อมูล [0000] การฟัง http บน unix (/var/run/docker.sock) ข้อมูล init_networkdriver () = ตกลง (0) ข้อมูล [0000] การโหลดคอนเทนเนอร์: เริ่ม .... ข้อมูล [0000] การโหลดคอนเทนเนอร์: เสร็จแล้ว ข้อมูล [0000] Docker Daemon: 1.4.0 4595D4F/1.4.0; ExecDriver: Native-0.2; GraphDriver: ข้อมูล devicemapper [0000] +งานยอมรับการเชื่อมต่อ () ข้อมูล [0000] -Job AcceptConnections () = ตกลง (0)
นอกจากนี้ Docker สามารถระบุพารามิเตอร์การจัดเก็บอัญมณีเมื่อเริ่มต้นคอนเทนเนอร์ แต่ตอนนี้เฉพาะ DeviceMapper เท่านั้นที่สามารถยอมรับการตั้งค่าพารามิเตอร์ จะมีการแสดงบล็อกที่กำหนดเป้าหมายในภายหลัง
Btrfs
ไดรเวอร์ BTRFS สามารถมีประสิทธิภาพมากในการสร้าง Docker อย่างไรก็ตามเช่นเดียวกับ DeviceMapper มันไม่รองรับที่เก็บข้อมูลที่ใช้ร่วมกันระหว่างอุปกรณ์ (เข้าร่วมในเว็บไซต์ทางการ) BTRFs รองรับสแน็ปช็อตและโคลนและยังสามารถจัดการอุปกรณ์ทางกายภาพหลายตัวได้อย่างง่ายดาย (สำหรับรายละเอียดโปรดดูบทนำของ IBM ถึง BTRFS)
การซ้อนทับ
การซ้อนทับนั้นคล้ายกับ AUFS มาก แต่ประสิทธิภาพของมันดีกว่า AUFS และมีการใช้หน่วยความจำที่ดี ตอนนี้ได้ถูกรวมเข้ากับ Linux Kernel 3.18 คำสั่งการใช้งานเฉพาะ: Docker DS Overlay
หมายเหตุบนเว็บไซต์อย่างเป็นทางการ: ปัจจุบันไม่ได้รับการสนับสนุนใน BTRFS หรือสำเนาใด ๆ ในระบบไฟล์การเขียนและควรใช้กับพาร์ติชัน Ext4 เท่านั้น
3 โครงสร้างไดเรกทอรี Docker
แนวคิดที่สำคัญที่สุดสองประการของนักเทียบท่าคือกระจกและคอนเทนเนอร์ แล้วภาพที่เราดึงลงมาอยู่ที่ไหน? หลังจากเริ่มคอนเทนเนอร์ Mirror Run แล้วเนื้อหาของการดำเนินการของเราจะถูกแก้ไขที่ไหน? เนื่องจากไดรเวอร์เฉพาะนั้นแตกต่างกันเอฟเฟกต์การใช้งานขั้นสุดท้ายจึงแตกต่างกัน มาวิเคราะห์โครงสร้างการจัดเก็บของ Docker โดยใช้ไดรเวอร์จัดเก็บข้อมูลอุปกรณ์ Mapper เป็นตัวอย่าง
1. ป้อนไดเรกทอรี/var/lib/docker และแสดงรายการเนื้อหา:
ค่าเริ่มต้น
[root@localhost ~]# cd/var/lib/docker/[root@localhost docker]# lscontainers devicemapper execdriver graph init linkgraph.db repositories-devicemapper
ตามเนื้อหาของไดเรกทอรีเป็นที่ชัดเจนว่ามีการใช้ไดรเวอร์ devicemapper
หมายเหตุ: โฟลเดอร์ที่แสดงด้านล่างทั้งหมดอยู่ใต้/var/lib/docker
2. โฟลเดอร์ pull image มีโฟลเดอร์ใด (อ้างถึง)
ข้อมูลภาพของการดึงจะถูกบันทึกไว้ในโฟลเดอร์กราฟและเนื้อหาของภาพมีอยู่ภายใต้ devicemapper/ devicemapper/ data
3. คอนเทนเนอร์เริ่มต้นทำงานที่ไหน?
ข้อมูลการกำหนดค่าคอนเทนเนอร์ที่เริ่มต้นจะถูกบันทึกไว้ในคอนเทนเนอร์และ ExecDriver/ Native/ จะถูกดู
เนื้อหาของการดำเนินการในคอนเทนเนอร์จะถูกบันทึกภายใต้ DeviceMapper/DeviceMapper/Data
4. บทบาทของกราฟ
ในสถาปัตยกรรม Docker มันเล่นเป็นผู้ดูแลของภาพคอนเทนเนอร์ที่ดาวน์โหลดและเครื่องบันทึกความสัมพันธ์ระหว่างภาพคอนเทนเนอร์ที่ดาวน์โหลดมา ในไดเรกทอรีท้องถิ่นของกราฟข้อมูลเฉพาะที่เก็บไว้สำหรับแต่ละภาพคอนเทนเนอร์คือ: ข้อมูลเมตา (JSON) ของภาพคอนเทนเนอร์, ข้อมูลขนาดเลเยอร์ (เลเยอร์) ของภาพคอนเทนเนอร์และรูทเฉพาะที่แสดงโดยภาพคอนเทนเนอร์
5. การทดสอบทดลอง:
- เริ่มแรกไม่มีการเปิดใช้งานคอนเทนเนอร์:
ค่าเริ่มต้น
[root@localhost docker]# ll คอนเทนเนอร์/ทั้งหมด 0
- เริ่มคอนเทนเนอร์:
ค่าเริ่มต้น
[root@localhost docker]# docker run -i -t -rm centos: 7 /bin /bash [root@187a8f9d2865 /]#
UUID ของคอนเทนเนอร์เริ่มต้น = 187A8F9D2865
- ก่อนเริ่มคอนเทนเนอร์ให้ตรวจสอบขนาดจริงของไฟล์ภายใต้/var/lib/docker/devicemapper/devicemapper/
ค่าเริ่มต้น
[root@bhdocker216 Docker]# du -h DeviceMapper/DeviceMapper/*2.1G DeviceMapper/DeviceMapper/Data3.5m DeviceMapper/DeviceMapper/Metadata
- ดูบนโฮสต์
ค่าเริ่มต้น
[root@bhdocker216 Docker]# ls Containers/187a8f9d2865c2ac *** 91b981
ตรวจสอบเนื้อหาของคอนเทนเนอร์เริ่มต้นด้านล่างโฟลเดอร์ UUID:
ค่าเริ่มต้น
[root@bhdocker216 คอนเทนเนอร์]# ll 187a8f9d2865c2ac *** 91b981total 24-rw ----- 1 รูท 273 มี.ค. 5 23:59 187a8f9d2865 ***-json.log-rw-r-- 1 รูทรูท 1683 มี.ค. 5 23:58 config.json-rw-r-- 1 รูทรูท 334 มี.ค. 5 23:58 HostConfig.json-rw-r-- 1 รูทรูท 13 มี.ค. 5 23:58 โฮสต์ชื่อ RW-R-- 1 รูทรูท 174 มี.ค. 5 23:58 โฮสต์ -RW-R-- 1 รูทรูท 69 มี.ค. 5 23:58 RESONV.CONF- เพิ่มไฟล์ในคอนเทนเนอร์เริ่มต้นและดู
ก่อนอื่นสร้างไฟล์ในคอนเทนเนอร์ที่รัน:
ค่าเริ่มต้น
[root@8a1e3ad05d9e/]# dd ถ้า =/dev/zero of = floppy.img bs = 512 count = 57605760+0 บันทึกใน 5760+0 บันทึกออก 2949120 ไบต์ (2.9 mb) คัดลอก, 0.0126794 S
จากนั้นดูไฟล์ภายใต้/var/lib/docker/devicemapper/devicemapper/:
ค่าเริ่มต้น
[root@bhdocker216 Docker]# du -h DeviceMapper/DeviceMapper/*5.5G DeviceMapper/DeviceMapper/data4.6m Devicemapper/DeviceMapper/Metadata
ขนาดของสถานที่นี้แตกต่างกันเล็กน้อยเนื่องจากฉันดำเนินการ #DD เป็นครั้งแรกถ้า =/dev/zero of = test.txt bs = 1m count = 8000 เพื่อสร้างไฟล์ขนาด 8G ฉันยกเลิกเพราะมันช้าเกินไป แต่ฉันสามารถเห็นได้อย่างชัดเจนว่าโฟลเดอร์ทั้งสองมีการเปลี่ยนแปลง (เพิ่ม) เมื่อทำงานในคอนเทนเนอร์ที่ทำงานอยู่
- ตรวจสอบกราฟ เมื่อมีการดึงภาพเดียว (Ubuntu14.10)) ไดเรกทอรีชื่อ UUID ยาว 7 ตัวจะปรากฏขึ้น สิ่งนี้เกิดขึ้นได้อย่างไร?
ใช้ต้นไม้อิมเมจ Docker เพื่อแสดงรายการโครงสร้างต้นไม้มิเรอร์และเราสามารถเห็นโครงสร้างการจัดเก็บลำดับชั้นของกระจก Ubuntu สุดท้าย (เลเยอร์ 7) ขึ้นอยู่กับการเปลี่ยนแปลงของเลเยอร์ 6 นั่นคือเลเยอร์ N-th ในแผนผังตรรกะนี้ขึ้นอยู่กับการเปลี่ยนแปลง N-1 และ N-layer ขึ้นอยู่กับภาพ N-1 เลเยอร์ 0th, ขนาดคือ 0 เรียกว่ารูปภาพพื้นฐาน
- เนื้อหาในไดเรกทอรีกราฟ/UUID คืออะไร?
ค่าเริ่มต้น
[root@localhost กราฟ]# ll 01bf15a18638145eb *** -htotal 8.0k-rw ----- 1 รูทรูท 1.6K 5 มี.ค. 18:02 JSON-RW ----- 1 รูท 9 มี.ค. 5 18:02 เลเยอร์
ดูเนื้อหาของเลเยอร์: ขนาดของเลเยอร์การเป็นตัวแทนดิจิตอล (หน่วย: B) JOSN: บันทึกข้อมูลเมตาของภาพนี้ (เช่น: ขนาด, สถาปัตยกรรม, การกำหนดค่า, คอนเทนเนอร์, ** UUID ของผู้ปกครอง ** ฯลฯ )
- ดูโฟลเดอร์ DeviceMapper/DeviceMapper
มีสองโฟลเดอร์ข้อมูลและข้อมูลเมตา อันที่จริงไดรเวอร์ Mapper Device Mapper จัดเก็บทั้งไฟล์กระจกและคอนเทนเนอร์ในไฟล์ข้อมูล ** ** คุณสามารถดูขนาดของข้อมูลและข้อมูลเมตาผ่านข้อมูล Docker นอกจากนี้คุณสามารถใช้ du h (ใช้ด้านบน) เพื่อดูขนาดจริงของไฟล์เบาบางทั้งสองนี้
- ExecDriver
ค่าเริ่มต้น
[root@bhdocker216 Docker]# ls execdriver/native/8a1e3ad05d9e66a4555e683a2c *** 2437bdcccdfdfa // ดูเนื้อหาภายใน: [root@bhdocker216 8a1e3ad05d9e66a455555
- ปริมาณ
ปริมาณที่ไม่มีพารามิเตอร์ -v ว่างเปล่า หลังจากการทดสอบหากเริ่มต้นคอนเทนเนอร์ให้เพิ่มพารามิเตอร์ -V จะแสดง UUID ในโฟลเดอร์ Dolumes การค้นหาทั่วโลกจะดำเนินการบนโฮสต์และพบได้ภายใต้ปริมาณเท่านั้น มันไม่มีส่วนเกี่ยวข้องกับภาพและ UUID ของภาชนะ
ค่าเริ่มต้น
[root@bhdocker216 Docker]# find/-name 86eb77f9f5e25676f100 *** d5a/var/lib/docker/volumes/86eb77f9f5e25676f100 *** d5a // ดูเนื้อหาภายใน 86EB77F9F5E25676F100 *** D5ACONFIG.JSON [root@bhdocker216 เล่ม]# cat 86EB77F9F5E25676F100 *** D5A /CONFIG.JSON {"ID": "86EB77F9F5E25676F100A89BA727BC15185303236AAE0DCF4C17223E37651D5A", "PATH": "/home/data" ตารางคำอธิบายของฟังก์ชันโฟลเดอร์
สรุปจัดระเบียบตารางและอธิบายฟังก์ชั่นของโฟลเดอร์ที่แตกต่างกันภายใต้/var/lib/docker:
ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!