Docker की छवि मेरी डिस्क स्थान को खाने की क्यों है जिसका उपयोग docker द्वारा नहीं किया गया है


82

मेरे पास सेटअप डॉकटर है और मैंने डॉकर के सिस्टम डेटा को स्टोर करने के लिए पूरी तरह से अलग ब्लॉक डिवाइस का उपयोग किया है:

[root@blink1 /]# cat /etc/sysconfig/docker
# /etc/sysconfig/docker

other_args="-H tcp://0.0.0.0:9367 -H unix:///var/run/docker.sock -g /disk1/docker"

ध्यान दें कि /disk/1एक पूरी तरह से अलग हार्ड ड्राइव का उपयोग कर रहा है/dev/xvdi

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.6G  67% /
devtmpfs        1.9G  108K  1.9G   1% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/xvdi        20G  5.3G   15G  27% /disk1
/dev/dm-1       9.8G  1.7G  7.6G  18% /disk1/docker/devicemapper/mnt/bb6c540bae25aaf01aedf56ff61ffed8c6ae41aa9bd06122d440c6053e3486bf
/dev/dm-2       9.8G  1.7G  7.7G  18% /disk1/docker/devicemapper/mnt/c85f756c59a5e1d260c3cdb473f3f4d9e55ac568967abe190eeaf9c4087afeac

समस्या यह है कि जब मैं डॉक इमेज डाउनलोड करता रहता हूं और डॉकटर कंटेनर चलाता हूं, तो ऐसा लगता है कि दूसरी हार्ड ड्राइव /dev/xvda1का भी उपयोग किया जाता है।

मैं कुछ डॉकटर छवियों को हटाकर इस समस्या को सत्यापित कर सकता हूं। कुछ डॉकटर छवियों को हटाने के बाद, /dev/xvda1अब कुछ और अतिरिक्त स्थान हैं।

क्या मैं कुछ भूल रहा हूँ?

मेरा docker संस्करण:

[root@blink1 /]# docker info
Containers: 2
Images: 42
Storage Driver: devicemapper
 Pool Name: docker-202:1-275421-pool
 Pool Blocksize: 64 Kb
 Data file: /disk1/docker/devicemapper/devicemapper/data
 Metadata file: /disk1/docker/devicemapper/devicemapper/metadata
 Data Space Used: 3054.4 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 4.7 Mb
 Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 3.14.20-20.44.amzn1.x86_64
Operating System: Amazon Linux AMI 2014.09

क्या आप एकfdisk -l
user2915097

जवाबों:


64

यह devicemapper के साथ एक कर्नेल समस्या है, जो OS (RedHat, Fedora, CentOS और Amazon Linux) के RedHat परिवार को प्रभावित करती है। हटाए गए कंटेनर मैप किए गए डिस्क स्थान को खाली नहीं करते हैं। इसका मतलब यह है कि प्रभावित OS पर आप धीरे-धीरे अंतरिक्ष से बाहर निकलेंगे और जैसे ही आप कंटेनर को स्टार्ट और रीस्टार्ट करेंगे।

Docker प्रोजेक्ट को इसके बारे में पता है, और कर्नेल को अपस्ट्रीम ( https://github.com/docker/docker/issues/3182 ) में माना जाता है ।

एक काम के आस-पास डॉकर को लिखने के लिए अपनी मात्रा देनी है ( "जब डोकर आपको डिस्क स्थान को खा जाता है" )। यह वास्तव में इसे खाने की जगह से नहीं रोकता है, बस आपके सिस्टम के अन्य हिस्सों को नीचे ले जाने से रोकता है।

मेरा समाधान डॉक को अनइंस्टॉल करने के लिए था, फिर इसकी सभी फ़ाइलों को हटा दें, फिर पुनर्स्थापित करें:

sudo yum remove docker
sudo rm -rf /var/lib/docker
sudo yum install docker

इससे मेरा स्थान वापस मिल गया, लेकिन यह सिर्फ एक प्रतिस्थापन उदाहरण को लॉन्च करने से बहुत अलग नहीं है। मुझे एक अच्छा समाधान नहीं मिला है।


20
मैं बस एक ही बात के माध्यम से चला गया और आप docker स्थापना रद्द करने के लिए नहीं है। मुझे जो कुछ करने की ज़रूरत थी वह था डॉकटर, डायरेक्टरी को हटाओ, फिर डॉकटर को शुरू करो।
अवरोधक

2
क्या निर्देशिका? / var / lib / docker? अगर मैं ऐसा करता हूं, तो मैं अपनी छवि को ढीला करता हूं। अगर मैं छवि को पहले .tar फ़ाइल में सहेजने का प्रयास करता हूं, तो वह भी विफल हो जाता है: त्रुटि बढ़ते '/ dev / mapper / docker-202: ... इनपुट / आउटपुट त्रुटि
Toby

5
@ टॉबी हाँ /var/lib/docker, जो आपकी सभी छवियों और कंटेनरों को हटा देगा। आप हार्ड-डॉकिंग को रीसेट कर रहे हैं, इसलिए अपनी सभी चीजों को बचाने में सक्षम होने की उम्मीद न करें।
नथानिएल वैबब्रोट

61

मेरा पूरा / var / lib / docker हटाना मेरे लिए ठीक नहीं है। ये एक सुरक्षित तरीके हैं:

समाधान 1:

इस समस्या से निम्न आदेश मेरे लिए स्थान को साफ़ करते हैं और यह डिलीट / var / lib / docker की तुलना में बहुत अधिक सुरक्षित है या विंडोज के लिए यहाँ आपकी डिस्क छवि स्थान की जाँच करें

इससे पहले:

docker info

उदाहरण आउटपुट:

Metadata file: 
Data Space Used: 53.38 GB
Data Space Total: 53.39 GB
Data Space Available: 8.389 MB
Metadata Space Used: 6.234 MB
Metadata Space Total: 54.53 MB
Metadata Space Available: 48.29 MB

Docker के नए संस्करणों में कमांड जैसे 17.x +

docker system prune -a

यह आपको एक चेतावनी दिखाएगा कि यह सभी बंद किए गए कंटेनरों, नेटवर्क, छवियों को हटा देगा और कैश का निर्माण करेगा। आम तौर पर इसे हटाने के लिए सुरक्षित है। (अगली बार जब आप एक कंटेनर चलाते हैं तो यह डॉकर रजिस्ट्री से खींच सकता है)

उदाहरण आउटपुट:

Total reclaimed space: 1.243GB

फिर आप देख सकते हैं कि क्या साफ हो गया है

docker info

समाधान 2:

इसके साथ ही, सुनिश्चित करें कि डॉकटर कंटेनर के अंदर आपके प्रोग्राम फाइल सिस्टम में कई / विशाल फाइल नहीं लिख रहे हैं।

अपने चल रहे docker प्रक्रिया के स्थान उपयोग आकार की जाँच करें

docker ps -s #may take minutes to return

या सभी कंटेनरों के लिए, यहां तक ​​कि बाहर भी

docker ps -as #may take minutes to return

फिर आप हमलावर कंटेनर / एस को हटा सकते हैं

docker rm <CONTAINER ID>

संभावित अपराधी का पता लगाएं जो अंतरिक्ष के गीगों का उपयोग कर रहा हो

docker exec -it <CONTAINER ID> "/bin/sh"
du -h

मेरे मामले में कार्यक्रम अस्थायी फ़ाइलों के gigs लिख रहा था।

( नथानियल वैबब्रोट ने इस मुद्दे पर स्वीकृत उत्तर में उल्लेख किया है और मुझे इस मुद्दे से कुछ जानकारी मिली है)


या

1.13.x के पुराने संस्करणों में कमांड्स 1.13.x चलाएं (रूट नहीं सूडो के रूप में):

# Delete 'exited' containers
docker rm -v $(docker ps -a -q -f status=exited)

# Delete 'dangling' images (If there are no images you will get a docker: "rmi" requires a minimum of 1 argument)
docker rmi $(docker images -f "dangling=true" -q)

# Delete 'dangling' volumes (If there are no images you will get a docker: "volume rm" requires a minimum of 1 argument)
docker volume rm $(docker volume ls -qf dangling=true)

उपरांत :

> docker info
Metadata file: 
Data Space Used: 1.43 GB
Data Space Total: 53.39 GB
Data Space Available: 51.96 GB
Metadata Space Used: 577.5 kB
Metadata Space Total: 54.53 MB
Metadata Space Available: 53.95 MB

2
docker system prune --forceनिश्चित रूप से सबसे सुरक्षित विकल्प है जिसका मैंने उत्तर देखा है। मैं अपनी मशीन पर अंतरिक्ष से बाहर जा रहा था। किया था और मैं अब 50 जीबी मुक्त है ... काश मैं इस से पहले ज्ञात था
'16:

4
इस उत्तर पर हुए मतों से पता चलता है कि लोग इसे उपयोगी मानते हैं। बस स्पष्ट होने के लिए, हालांकि, यह थोड़ा अलग प्रश्न का उत्तर दे रहा है "मैं उस स्थान को कैसे पुनः प्राप्त कर सकता हूं जो डॉकर उपयोग कर रहा है?" हालांकि सवाल डॉकटर द्वारा अंतरिक्ष का उपयोग करने के बारे में था, लेकिन फिर यह कहा कि ऐसा नहीं हुआ (इसलिए pruneबेकार है क्योंकि डॉकर को कुछ भी नहीं दिखता है)
नथानिएल वैबब्रोट

6

/var/lib/dockerनिर्देशिका को स्थानांतरित करें ।

मान लिया जाए कि /dataनिर्देशिका में पर्याप्त जगह है, यदि ऐसा नहीं है, जो एक के लिए स्थानापन्न है,

sudo systemctl stop docker

sudo mv /var/lib/docker /data


sudo ln -s /data/docker /var/lib/docker

sudo systemctl start docker

इस तरह, आपको पुन: कॉन्फ़िगर करने की आवश्यकता नहीं है।


6

एक ही समस्या थी। मेरे परिदृश्य में मेरा vbox संग्रहण स्थान से बाहर चल रहा था। एक जांच के बाद पता चला कि मेरे docker स्थानीय वॉल्यूम 30gb खा रहे थे। उबंटू 16.04 होस्ट।

तुम्हारा पता लगाने के लिए।

docker system df

TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              3                   0                   1.361GB             1.361GB (100%)
Containers          0                   0                   0B                  0B
Local Volumes       7                   0                   9.413GB             9.413GB (100%)
Build Cache                                                 0B                  0B



docker system prune --volumes


  WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all volumes not used by at least one container
        - all dangling images
        - all build cache
Are you sure you want to continue? [y/N]

यह उपयोग किए गए स्थानीय संस्करणों के डिस्क स्थान को मुक्त करता है। मेरे परिदृश्य में 20 जीबी स्टोरेज स्पेस को मुक्त किया। सुनिश्चित करें कि कंटेनर जिन्हें आप रखना चाहते हैं, ऐसा करने से पहले चल रहे हैं यदि आप उन्हें रखना चाहते हैं क्योंकि यह सभी बंद कंटेनरों को हटा देता है।


यह सीधे मूल प्रश्न का जवाब नहीं देता है लेकिन समान परिदृश्य में उपयोगी है।
बेयरओखर्ट

5

मेरे पास एक समान समस्या थी और मुझे लगता है कि ऐसा तब होता है जब आपके पास अपने सभी डॉक छवियों के लिए डिस्क में पर्याप्त स्थान नहीं होता है। मेरे पास ६ जीबी डॉक इमेज के लिए आरक्षित था जो मेरे मामले में पर्याप्त नहीं था। वैसे भी, मैंने हर छवि और कंटेनर को हटा दिया था और अभी भी डिस्क भरी हुई दिख रही थी। अधिकांश स्थान का उपयोग / var / lib / docker / devicemapper और / var / lib / docker / tmp द्वारा किया जा रहा था।

यह आदेश मेरे लिए काम नहीं किया:

# docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/

सबसे पहले, मैंने docker सेवा बंद कर दी:

sudo service docker stop

फिर मैंने / var / lib / docker को हटा दिया:

फिर मैंने वो किया जो किसी ने यहाँ https://github.com/docker/docker/issues/18867#issuecomment-232301073 में सुझाया था

  • Docker मेटाडेटा rm -rf / var / lib / docker के मौजूदा उदाहरण को निकालें

    sudo rm -rf / var / lib / docker

  • डेकर डेमन के लिए निम्नलिखित विकल्पों को पास करें: -s devicemapper --storage-opt dm.fs = xfs --storage-ऑप्ट dm.mountopt = त्यागें

  • शुरू करो डेकर डेमन।

पिछले दो चरणों के लिए, मैं चलाता हूं:

sudo dockerd -s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.mountopt=discard

4

डिफ़ॉल्ट रूप से डॉकर प्रून वॉल्यूम को नहीं हटाता है,

आप कुछ इस तरह की कोशिश कर सकते हैं

docker volume prune -f

डॉकटर सिस्टम प्रून - वॉल्व पूरी तरह से काम करता है। यह हुआ करता था --volume, लेकिन अब --volumes है।
ज़ेब डेविस

6
docker system prune --all --volumes
डेविड पोर्टेबेला

3

जैसा कि अंक # 18867 में उल्लेख किया गया है - एक कंटेनर में डेटा हटाएँ devicemapper Github.com से उपयोग किए गए स्थान को मुक्त नहीं कर सकता है

नीचे दिए गए आदेश को चलाने का प्रयास करें:

# docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/

यह fstrimउपकरण का उपयोग करता है devicemapper को पतले-प्रावधानित डिस्क को ट्रिम करने के लिए।


इसने मेरे लिए काम किया। लूप मोड में डेविक्मेपर का उपयोग करने की संभावना है।
जीप

0

शायद आप उन docker system pruneसभी छवियों को हटाने की कोशिश कर सकते हैं जो महत्वपूर्ण नहीं हैं


0

MacOS में इस मुद्दे पर चलने वालों के लिए, मेरे लिए काम करने वाला समाधान Docker.raw फ़ाइल की तलाश में था, जो कि एक Docker होस्ट में तार्किक स्थान को आरक्षित करने और फिर हटाने के लिए उपयोग करता है। यदि आपके पास डॉकर डेस्कटॉप है, तो आप जा सकते हैं:

Preferences -> Resources -> Advancedऔर फिर Disk image locationटैब के नीचे देखें।

टर्मिनल में उस फ़ोल्डर पर नेविगेट करें और Docker.rawफ़ाइल को हटा दें ( $ rm -rf Docker.raw)

महत्वपूर्ण नोट : केवल यही है कि आपको अपने किसी भी मौजूदा चित्र या वॉल्यूम की आवश्यकता नहीं है।


-1

हां, डॉकर परतों को स्टोर करने के लिए / var / lib / docker फ़ोल्डर का उपयोग करते हैं। अंतरिक्ष को पुनः प्राप्त करने और भंडारण को कुछ अन्य निर्देशिका में स्थानांतरित करने के तरीके हैं।

आप एक बड़ा डिस्क स्थान माउंट कर सकते हैं और नए माउंट स्थान पर / var / lib / docker की सामग्री को स्थानांतरित कर सकते हैं और सहानुभूति लिंक बना सकते हैं।

ऊपर कार्य कैसे करना है, इसके बारे में विस्तार से बताया गया है।

http://www.scmtechblog.net/2016/06/06/clean-up-docker-images-from-local-to.html

आप मध्यवर्ती परतों को भी हटा सकते हैं।

https://github.com/vishalvsh1/docker-image-cleanup

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.