Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ซอฟต์แวร์ >> เครื่องเสมือน

เชี่ยวชาญ Docker Data Volumes: บทช่วยสอนขั้นตอนต่อขั้นตอน

เพื่อเปลี่ยนบรรยากาศ วันนี้เราจะมีบทความสั้นและไม่ซับซ้อนเกี่ยวกับ Docker containers automation framework เราจะเรียนรู้วิธี mount data ภายใน containers, วิธี share data และทุก bits and pieces ที่จำเป็นเพื่อทำให้ instances ของเราเป็นระบบที่มีประโยชน์

จนถึงตอนนี้ คุณได้เพลิดเพลิน (และนี่คือคำที่ liberal มาก) กับ intro guide ที่ละเอียดมาก แล้วเราลองเล่นกับ services, networking และแก้ไข tough errors บทช่วยสอนนี้ต่อเนื่อง tradition แบบ step-by-step ดังนั้นควรเข้าใจง่ายและชัดเจน เริ่มกันเลย

พื้นฐาน (The basics)

กระบวนการสำหรับ expose host data ภายใน container ค่อนข้างง่าย และคล้ายคำสั่ง mount คุณระบุ source directory หรือ file และชี้ไปยัง target directory หรือ file คล้ายกับ ports ที่ประกอบด้วย host และ container pieces

docker run -it -v /root/testing:/dedoimedo centos:latest /bin/bash

เรากำลังรัน container ใหม่พร้อม Bash shell และจะ mount host's /root/testing directory เข้าไปใน container ภายใต้ /dedoimedo บน host source สามารถเป็นอะไรก็ได้ รวมถึง NFS mounts ซึ่งทำให้กลายเป็น remote data sharing thingie ที่น่ารัก ในทางปฏิบัติ NFS ป้องกัน re-exports แต่เป็นการโกง (cheating) จริงๆ เพราะคุณยังทำสิ่งเดียวกันบน host เดียวกัน

ภายใน container คุณสามารถตรวจสอบ contents ของ /dedoimedo directory ได้ และดูว่ามีอะไรเก็บอยู่ แต่บน CentOS build มาตรฐาน default (test case ของเรา) คุณน่าจะเจอ error และนี่สำคัญ เพราะคุณอาจเจอปัญหาคล้ายกัน และควรพร้อม debug บวกกับแสดงว่า security features บางครั้งเป็นอันตราย

ls
ls: cannot open directory .: Permission denied

Security features ใช่แล้ว SELinux โชคดี ปัญหาแก้ได้ คุณสามารถเปลี่ยน enforcement policy สำหรับ module หรือเพิ่ม rule ใหม่ที่อนุญาตให้ containers เข้าถึง mounted volume ได้

setenforce 0

และ rule หากต้องการไปทางนั้น:

chcon -Rt svirt_sandbox_file_t /<volume>

จากนั้นคุณจะเห็น contents และเริ่มเล่น เขียนไฟล์ ฯลฯ หากเราดูที่ host ก่อน สร้างไฟล์ใหม่ใน mounted directory เราจะเห็นอย่างด้านล่าง (ยกเว้น actual contents):

การแชร์ระหว่าง Containers (Sharing between containers)

คล้ายกับที่เราทำกับ networking คุณอาจต้องการ expose data ภายในหนึ่ง container ให้อีก containers เข้าถึงได้ ทำให้พวกมันกลายเป็น Data Volume Containers นี่อาจมีประโยชน์มากหากคุณจัดกลุ่ม container functionality และคุณสามารถประหยัดพื้นที่ได้มาก นอกจากนี้ คุณยังสามารถ chain volumes ระหว่าง containers ได้ ซึ่งช่วยให้คุณจำกัดได้ว่ามี containers กี่ตัวที่เข้าถึง host data พร้อมกัน นี่มีประโยชน์หากคุณไม่มี robust write locking mechanism บน host ซึ่งเป็นจริงเกือบเสมอสำหรับ UNIX-like systems

มาทำ quick example เราจะเริ่ม container ชื่อ data-source จะเริ่มต้นด้วย /data mount point ทางเลือก เราอาจทำให้ /data map ไปยัง directory บน host แต่พอใช้แล้ว จากนั้นเราจะสร้าง container ที่สอง ซึ่งจะใช้ volume จาก data-source named container

docker run -ti --name data-source -v /data centos:latest /bin/bash
docker run -ti --volumes-from data-source centos:latest /bin/bash

ตอนนี้ถ้าดู containers ทั้งสอง ทั้งคู่จะมี /data directory ยกเว้น data-source จะเป็น entry point ของ data สำหรับ containers ทั้งหมดที่รันด้วย option -volumes-from คุณประหยัดพื้นที่ data ได้มาก ควบคุมได้ว่า containers ใช้และเข้าถึง original data อย่างไร และทดสอบ multiple software configurations ได้ง่ายขึ้น ค่อนข้าง neat (เรียบง่าย/สะอาด) โดยรวม

[root@68d3ed5e243a data]# pwd
/data
[root@68d3ed5e243a data]# touch STUFF
[root@68d3ed5e243a data]#

และ container ที่สอง:

[root@7aed935cc156 /]# ls -la /data
total 4
drwxr-xr-x. 2 root root 18 May 1 11:46 .
drwxr-xr-x. 18 root root 4096 May 1 11:45 ..
-rw-r--r--. 1 root root 0 May 1 11:46 STUFF
[root@7aed935cc156 /]#

ต่อไปคืออะไร? (What's next?)

เชื่อหรือไม่ เราจะหยุดที่จุดนี้ มีขั้นตอนอื่นๆที่ทำได้ เช่น backups, data removal และอื่นๆ แต่นั้นเป็นหัวข้อแยกต่างหาก ตอนนี้เรามีพอที่จะเริ่มทำงานกับ data volumes และ expose พวกมันภายใน containers เป็น mount points ทั่วไป คุณอาจอยากใช้ read-only data สำหรับ environment tools และ configurations, volume containers สำหรับ big data, directories และ mount points ขนาดเล็กง่ายๆสำหรับ testing ฯลฯ

สรุป

Docker volume handling ค่อนข้าง simple (ง่าย) และผมเชื่อว่า aspect นี้ของ container technology ยังต้องเติบโตก่อนจะถึง maturity level เหมือน pieces อื่นๆของ framework มันไม่ได้ feature-rich มากนัก และควรมี additional ways เพื่อควบคุม data รวมถึง snapshots, built-in support สำหรับ data distribution และ parallelization และอื่นๆ

อย่างน้อย คุณเรียนรู้สิ่งใหม่ๆบางอย่างในบทช่วยสอนนี้ รวมถึงวิธีสร้าง mount points และ mount data volumes, วิธี chain พวกมัน และแก้ไข small niggles (ปัญหาเล็กๆน้อยๆ) ตลอดทาง อาจจะรู้สึกว่าคู่มือนี้ naked (โปร่ง/ว่างเปล่า) เล็กน้อยเมื่อเทียบกับบทความอื่นๆ แต่เราไม่ได้ต้องการ heavyweight, neverending articles เสมอไป บางครั้ง short and sweet (สั้นและดี) ก็พอแล้ว บน bombshell นั้น (on that bombshell - สำนวน) จบแล้ว

ขอแสดงความนับถือ