मेजबान पर बढ़ते वॉल्यूम


135

मैं सफलतापूर्वक एक डॉक कंटेनर के बीच वॉल्यूम का उपयोग करके फ़ोल्डरों को साझा करने में सफल रहा हूं

docker run -v /host/path:/container/path ...

लेकिन मेरा सवाल यह है कि इसमें और VOLUMEडॉकरफाइल में कमांड का उपयोग करने में क्या अंतर है

VOLUME /path

मैं एक ऐसी छवि का उपयोग कर रहा हूं जिसमें एक VOLUMEकमांड है, और मैं यह जानना चाहूंगा कि इसे अपने होस्ट के साथ कैसे साझा किया जाए। मैंने इसे -vऊपर दिए गए कमांड का उपयोग करके किया है , लेकिन मुझे नहीं पता था कि क्या मुझे -vऔर दोनों की आवश्यकता है VOLUME

जवाबों:


155

VOLUMEआदेश अपने कंटेनर के अंदर एक निर्देशिका माउंट होगा और स्टोर अपने मेजबान डिस्क पर बनाया गया है या उस निर्देशिका के अंदर संपादित किसी भी फाइल कंटेनर फ़ाइल संरचना के बाहर , संघ फाइल सिस्टम को दरकिनार।

विचार यह है कि आपके वॉल्यूम आपके डॉकटर कंटेनरों के बीच साझा किए जा सकते हैं और वे तब तक आसपास रहेंगे जब तक कि एक कंटेनर (चल रहा है या बंद) उन्हें संदर्भित करता है।

--volumes-fromजब आप कंटेनर चलाते हैं , तो कमांड का उपयोग करके आप अन्य कंटेनर मौजूदा वॉल्यूम (प्रभावी रूप से कंटेनर के बीच साझा करने) को माउंट कर सकते हैं ।

के बीच मौलिक अंतर VOLUMEऔर -vयह है: -vअपने डोकर कंटेनर के अंदर अपने ऑपरेटिंग सिस्टम से मौजूदा फ़ाइलों माउंट होगा और VOLUMEहोगा एक नया, रिक्त मात्रा बनाने के अपने मेजबान पर और अपने कंटेनर के अंदर यह माउंट।

उदाहरण:

  1. आपके पास एक Dockerfile है जो एक परिभाषित करता है VOLUME /var/lib/mysql
  2. आप docker की छवि बनाते हैं और उसे टैग करते हैं some-volume
  3. आप कंटेनर चलाते हैं

और तब,

  1. आपकी एक और डॉकटर छवि है जिसे आप इस वॉल्यूम का उपयोग करना चाहते हैं
  2. आप निम्नलिखित के साथ docker कंटेनर चलाते हैं: docker run --volumes-from some-volume docker-image-name:tag
  3. अब आपके पास एक डॉकटर कंटेनर चल रहा है जिसमें some-volumeआरोहित से आयतन होगा/var/lib/mysql

नोट: --volumes-fromवॉल्यूम के स्थान पर जो भी मौजूद है, उस पर वॉल्यूम को माउंट करना होगा। यानी, यदि आपके पास सामान था /var/lib/mysql, तो इसे वॉल्यूम की सामग्री के साथ बदल दिया जाएगा।


12
यदि मैं VOLUME में पहले से निर्दिष्ट एक निर्देशिका पर -v का उपयोग करता हूं तो क्या होगा?
जेफ स्टोरी

6
--volumes-fromVOLUMEआपके द्वारा निर्दिष्ट किसी भी चीज़ के शीर्ष पर अपना माउंट करेगा -v। दिलचस्प बात यह है कि यह कंटेनर को विशेषाधिकार प्राप्त मोड में चलाने जैसा लगता है ( docker run --privilegedऔर umountआईएनजी /var/lib/mysqlसिर्फ एक खाली डायर को छोड़ देगा ताकि आपका -vमाउंट पूरी तरह से नजरअंदाज कर दिया जाए जब यह एक के साथ संघर्ष करता है VOLUME
क्रिस मैककिनल

2
आप कहते हैं कि जब तक कंटेनर उन्हें संदर्भित करता है, तब तक वॉल्यूम रखा जाता है, और मैंने देखा है कि कहीं और। docs.docker.com/userguide/dockervolumes कहते हैं, "डेटा वॉल्यूम को डेटा को बनाए रखने के लिए डिज़ाइन किया गया है, जो कंटेनर के जीवन चक्र से स्वतंत्र है। डॉकर इसलिए कंटेनर को हटाते समय कभी भी स्वचालित रूप से वॉल्यूम को नहीं हटाता है, और न ही यह" कचरा इकट्ठा करता है जो अब नहीं हैं। एक कंटेनर द्वारा संदर्भित। " इनमें से एक बयान गलत होना चाहिए।
mc0e

1
वॉल्यूम में मौजूद फाइलें डिस्क पर तब रखी जाती हैं जब एक कंटेनर अब इसे संदर्भित नहीं करता है, लेकिन वॉल्यूम स्वयं अब उपयोग करने योग्य नहीं है (जब तक कि आपको वास्तव में पता नहीं है कि कंटेनर को वॉल्यूम कैसे मैन्युअल रूप से हुक करना है, लेकिन तब भी मैं डॉन ' टी पता है कि यह संभव है)। जब मैं कहता हूं कि अब उपयोग करने योग्य नहीं है, तो मेरा मतलब है कि आप इसका उपयोग करने के लिए --volumes- का उपयोग नहीं कर सकते। जब वे ऊपर "कचरा इकट्ठा" कहते हैं, तो उनका मतलब है कि आपकी डिस्क से फाइलें वॉल्यूम में थीं।
क्रिस मैककिनल

1
वे प्रयोग करने योग्य हैं -v, लेकिन नहीं --volumes से। वॉल्यूम-से एक कंटेनर का नाम मात्रा डेटा प्राप्त करने के लिए लेता है (मेरा मानना ​​है कि यह सभी मात्रा बिंदु लेता है)। के लिए -v ही, हालांकि, मैनुअल में उल्लेख है कि आप के रूप में -v को एक नामित वॉल्यूम प्रदान कर सकते हैं named-volume:/path/in/container। नामों के लिए हैश दिया जाता है और अनाथ संस्करणों तक पहुंचने के लिए मेजबान-पथ के बजाय उन हैश को प्रदान किया जा सकता है। :) जागरूक होना volume lsउन सभी को नहीं दिखा सकता है - docker volume ls -f dangling=trueसाथ ही प्रयास करें ।
जैस्मीन हेगमैन

44

मुझे अपना जवाब जोड़ने दें, क्योंकि मेरा मानना ​​है कि दूसरों को डॉकटर की बात याद आ रही है।

का उपयोग करते हुए VOLUMEDockerfile में सही तरीका ™ है, क्योंकि आपने Docker को बताया कि एक निश्चित निर्देशिका में स्थायी डेटा होता है। डॉकर उस डेटा के लिए एक वॉल्यूम बनाएगा और इसे कभी भी डिलीट नहीं करेगा, भले ही आप इसका इस्तेमाल करने वाले सभी कंटेनरों को हटा दें।

यह यूनियन फाइल सिस्टम को भी बायपास करता है, ताकि वॉल्यूम वास्तव में एक वास्तविक निर्देशिका हो जो इसे साझा करने वाले सभी कंटेनरों में सही जगह पर (रीड-राइट या रीडोनली) माउंट हो जाए।

अब, होस्ट से उस डेटा तक पहुंचने के लिए, आपको केवल अपने कंटेनर का निरीक्षण करना होगा:

# docker inspect myapp
[{
    .
    .
    .
    "Volumes": {
        "/var/www": "/var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6...",
        "/var/cache/nginx": "/var/lib/docker/vfs/dir/62499e6b31cb3f7f59bf00d8a16b48d2...",
        "/var/log/nginx": "/var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87..."
    },
    "VolumesRW": {
        "/var/www": false,
        "/var/cache/nginx": true,
        "/var/log/nginx": true
    }
}]

मैं आमतौर पर कुछ मानक जगह जैसे कि / srv में सिमिलिंक बनाता हूं, ताकि मैं वॉल्यूम तक आसानी से पहुंच सकूं और उनमें मौजूद डेटा का प्रबंधन कर सकूं (केवल उन संस्करणों के लिए जिन्हें आप परवाह करते हैं):

ln -s /var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6... /srv/myapp-www
ln -s /var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87... /srv/myapp-log

यदि VM में docker होस्ट चल रहा है तो क्या होगा? उदाहरण के लिए, मैक पर boot2docker। फिर ये वॉल्यूम केवल दूरस्थ रूप से उपलब्ध हैं। इसके अलावा, जब आप वर्णित के रूप में डॉकफाइल में वॉल्यूम का उपयोग कर रहे हैं, तो छवि की सामग्री को वॉल्यूम में कॉपी किया जाएगा। हालाँकि, स्थानीय निर्देशिका में बढ़ते समय, यह प्रतिलिपि नहीं होती है। क्या आप जानते हैं कि ऐसा क्यों है? वहाँ एक तरीका है स्थानीय स्तर पर घुड़सवार मात्रा है, लेकिन अभी भी छवि से फ़ाइलों के साथ 'नए सिरे से शुरू' है?
लॉस्टसालड

4
डॉकटर-कंपोज के साथ आप ठीक यही कर सकते हैं, होस्ट ओएस के एक विशिष्ट स्थान पर वॉल्यूम माउंट करें । कोई सहानुभूति की जरूरत नहीं ...
ह्यूगो कोपामन्स

@ टोबिया: उदाहरण डॉकटर-कम्पोज़ डॉक्स देखें dock.docker.com/compose/compose-file/…
ह्यूगो

11

वॉल्यूम का उपयोग Dockerfileअन्य कंटेनरों द्वारा उपयोग की जाने वाली मात्रा को उजागर करने के लिए किया जाता है। उदाहरण, बनाएँDockerfile :

Ubuntu से: 14.04

RUN mkdir /myvol  
RUN echo "hello world" > /myvol/greeting  
VOLUME /myvol

चित्र बनाएँ:

$ docker build -t testing_volume .

कंटेनर को चलाएं, कंटेनर 1 कहें:

$ docker run -it <image-id of above image> bash

अब वॉल्यूम के साथ एक अन्य कंटेनर को विकल्प के रूप में चलाएं (जैसे-कंटेनर 2)

$ docker run -it --volumes-from <id-of-above-container> ubuntu:14.04 bash

आपको कंटेनर 1 से सभी डेटा मिलेंगे /myvol डायरेक्टरी का उसी स्थान पर ।

-vविकल्प कंटेनर के रन समय पर दिया जाता है जिसका उपयोग होस्ट पर कंटेनर की निर्देशिका को माउंट करने के लिए किया जाता है। इसका उपयोग करना सरल है, बस -vतर्क के साथ विकल्प प्रदान करें <host-path>:<container-path>। पूरी कमान इस प्रकार हो सकती है$ docker run -v <host-path>:<container-path> <image-id>


8

मूल रूप से VOLUMEऔर -vविकल्प लगभग बराबर हैं। इनका अर्थ है 'अपने कंटेनर पर विशिष्ट निर्देशिका माउंट करें'। उदाहरण के लिए, VOLUME /dataऔर -v /dataबिल्कुल वही अर्थ है। यदि आपके पास छवि है VOLUME /dataया -v /dataविकल्प के साथ , /dataनिर्देशिका आपके कंटेनर पर चढ़ी है। यह निर्देशिका आपके कंटेनर से संबंधित नहीं है।

कल्पना करें कि आप /dataकंटेनर में कुछ फाइलें जोड़ते हैं , फिर कंटेनर को नई छवि में लाएं। डेटा निर्देशिका पर कोई फ़ाइल नहीं है क्योंकि माउंटेड /dataनिर्देशिका मूल कंटेनर से संबंधित है।

$ docker run -it -v /data --name volume ubuntu:14.04 bash
root@2b5e0f2d37cd:/# cd /data
root@2b5e0f2d37cd:/data# touch 1 2 3 4 5 6 7 8 9
root@2b5e0f2d37cd:/data# cd /tmp
root@2b5e0f2d37cd:/tmp# touch 1 2 3 4 5 6 7 8 9
root@2b5e0f2d37cd:/tmp# exit
exit

$ docker commit volume nacyot/volume  
835cfe3d8d159622507ba3256bb1c0b0d6e7c1419ae32751ad0f925c40378945
nacyot $ docker run -it nacyot/volume
root@dbe335c7e64d:/# cd /data
root@dbe335c7e64d:/data# ls
root@dbe335c7e64d:/data# cd /tmp
root@dbe335c7e64d:/tmp# ls
1  2  3  4  5  6  7  8  9
root@dbe335c7e64d:/tmp# 
root@dbe335c7e64d:/tmp# 

इस तरह की माउंटेड डायरेक्टरी /dataका उपयोग डेटा को स्टोर करने के लिए किया जाता है जो आपके एप्लिकेशन से संबंधित नहीं है। और आप उस डेटा निर्देशिका को पूर्वनिर्धारित कर सकते हैं जो उपयोग करके कंटेनर से संबंधित नहीं हैVOLUME

Volumeऔर -vविकल्प के बीच एक अंतर यह है कि आप -vकंटेनर को शुरू करने पर गतिशील रूप से विकल्प का उपयोग कर सकते हैं । इसका मतलब है कि आप कुछ निर्देशिका को गतिशील रूप से माउंट कर सकते हैं। और एक और अंतर यह है कि आप अपने मेजबान निर्देशिका को अपने कंटेनर पर उपयोग करके माउंट कर सकते हैं-v


8

यह डॉक्यूमेंट डॉक्यूमेंटेशन से ही है, मदद से हो सकता है, सरल और सादा:

"मेजबान निर्देशिका अपने स्वभाव से, मेजबान-निर्भर है। इस कारण से, आप डॉकरफ़ाइल से होस्ट निर्देशिका को माउंट नहीं कर सकते हैं, वीओएलएमई अनुदेश होस्ट-डीआईआर पास करने का समर्थन नहीं करता है, क्योंकि निर्मित छवियां पोर्टेबल होनी चाहिए। ए। निर्देशिका सभी संभावित होस्ट पर उपलब्ध नहीं होगी। "

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