2015-03-13 10 views
5

मुझे डॉकर कंटेनर पर डिस्क कोटा रखने की आवश्यकता का सामना करना पड़ रहा था। विशेष रूप से मैं उस डेटा की मात्रा को सीमित करना चाहता हूं जो मूल छवि की परतों में नहीं है बल्कि diff में है। "डॉकर डिस्क कोटा" के लिए गुगलिंग या तो device mapper या btrfs बैकएंड का उपयोग करने का सुझाव देता है। जबकि (अलग अर्थ विज्ञान) के साथ दोनों बैकेंड में कोटा के लिए सक्षम होने दोनों अपने मुद्दे हैं:डॉकर कंटेनर के लिए डिस्क कोटा को कैसे परिभाषित किया जाए?

  • btrfs उत्पादन उपयोग के लिए पर्याप्त स्थिर नहीं है
  • डिवाइस नक्शाकार केवल आधार छवि सहित पूरा कंटेनर आकार को सीमित करता है, लेकिन diff

इसे हल करने का सबसे अच्छा तरीका क्या है?

उत्तर

2

इसे हल करने का एक तरीका diff निर्देशिका /var/lib/docker/aufs/diff/$CONTAINER_ID को एक स्पैस लूपबैक आरोहित ext4 निर्देशिका में डालना है। यह एक कंटेनर में उपयोगकर्ता द्वारा संग्रहीत/संशोधित डेटा की मात्रा को प्रभावी ढंग से सीमित करता है।

do_enable_quota() { 
    local ID=$1 
    local QUOTA_MB=$2 

    local LOOPBACK=/var/lib/docker/aufs/diff/$ID-loopback 
    local LOOPBACK_MOUNT=/var/lib/docker/aufs/diff/$ID-loopback-mount 
    local DIFF=/var/lib/docker/aufs/diff/$ID 

    docker stop -t=0 $ID 
    sudo dd of=$LOOPBACK bs=1M seek=$QUOTA_MB count=0 
    sudo mkfs.ext4 -F $LOOPBACK 
    sudo mkdir -p $LOOPBACK_MOUNT 
    sudo mount -t ext4 -n -o loop,rw $LOOPBACK $LOOPBACK_MOUNT 
    sudo rsync -rtv $DIFF/ $LOOPBACK_MOUNT/ 
    sudo rm -rf $DIFF 
    sudo mkdir -p $DIFF 
    sudo umount $LOOPBACK_MOUNT 
    sudo rm -rf $LOOPBACK_MOUNT 
    sudo mount -t ext4 -n -o loop,rw $LOOPBACK $DIFF 
    docker start $ID  
} 

यह दृष्टिकोण मेरे लिए पूरी तरह से काम करता है लेकिन दोष यह है कि मैं रैप करने के लिए "शुरू", "बंद करो" और "rm" खाते में माउंट लेने के लिए आदेश की जरूरत है: यह मैं का उपयोग बैश कोड है। https://docs.docker.com/engine/userguide/storagedriver/zfs-driver/

इस तरह से आप के साथ 'zpool' कमांड लाइन आपके डिस्क पूल प्रबंधन कर सकते हैं:

+0

क्या आपके पास एक उदाहरण होगा कि इस स्क्रिप्ट को काम करने के लिए कैसे प्राप्त करें। मेरे मामले में, केवल उबंटू को सीमित करना चाहते हैं: 14: 04 कंटेनर आकार कुछ एमआईबी तक, और कंटेनर बनाया गया है। – askb

+0

मुझे cmd चलाने के बाद ये त्रुटि मिलती है: $ do_enable_quota 91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c 20 – askb

+0

भेजे गए 177 बाइट्स 50 बाइट्स 454.00 बाइट्स/सेकंड कुल आकार 0 स्पीडअप 0 है।00 डेमॉन से त्रुटि प्रतिक्रिया: ऐसी कोई आईडी: 91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c त्रुटि: कंटेनर प्रारंभ करने में विफल: [91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c] – askb

1

ZFS भी एक बड़ा सौदा है।

उदाहरण के लिए, 'सिर्फ एक vdisk का गुच्छा' बनाने के लिए:

[[email protected] /]# mkdir /dsk 
[[email protected] /]# dd if=/dev/zero of=/dsk/disk1 bs=1M count=750 
[[email protected] /]# dd if=/dev/zero of=/dsk/disk2 bs=1M count=750 
[[email protected] /]# dd if=/dev/zero of=/dsk/disk3 bs=1M count=750 
[[email protected] /]# dd if=/dev/zero of=/dsk/disk4 bs=1M count=750 

ठीक है, हम 750M हर एक के चार डिस्क की है। अब एक ही ZFS पूल बनाने:

[[email protected] /]# zpool create CIALINUX /dsk/disk{1,2,3,4} 

अब हमारे पास एक मात्रा CIALINUX नाम है, लगभग 3GB स्वचालित रूप से हमारी/निर्देशिका में रखा के साथ:

[[email protected] /]# df -h |grep CIALINUX 

CIALINUX 2,9G 18K 2,9G 1% /CIALINUX 

अन्य आदेशों आप खुद ही तलाश कर सकते हैं कर रहे हैं:

# zpool list 
# zpool status 
# zpool status -x 
# zpool destroy CIALINUX 

महत्वपूर्ण: यह पिछले एक अपने पूल 'को नष्ट कर देता'। कृपया ध्यान दें।

एक बार जब आप अपने जेएफएस पूल प्राप्त कर लेंगे, तो बस अपनी फाइलें प्रत्येक कंटेनर के लिए/zpool-mounted-directory के अंदर डॉकर वॉल्यूम के रूप में संलग्न करें।

इस सहायता समुदाय को आशा है।

+0

ध्यान दें कि यह एक प्रकार का सॉफ्टवेयर RAID नहीं है, आपके पास वितरित I/O लिखने में कोई चार डिस्क नहीं है, इसलिए आपका प्रदर्शन RAID वॉल्यूम के रूप में इतना समृद्ध नहीं होगा। –

संबंधित मुद्दे