2015-11-06 22 views
10

मैकबुक प्रो लैपटॉप पर और मेरे कंटेनर जाने के लिए डॉकर-मशीन (0.5.0) और डॉकर-कंपोज़ (1.5.0) चला रहा है।मैक पर डॉकर मशीन: डॉकर होस्ट/डॉकर-मशीन पर घुड़सवार वॉल्यूम नहीं देख सकते हैं? शारीरिक रूप से संग्रहीत मात्रा कहाँ हैं?

इसका मतलब है कि मैं अपने वर्चुअलबॉक्स boot2docker संचालित HOST मशीनों को बनाने के लिए डॉकर-मशीन का उपयोग कर रहा हूं, जो मेरे डॉकर डिमन को चलाएगा और मेरे सभी कंटेनर होस्ट करेगा।

मुझे लगता है कि मुझे होस्ट्स और वॉल्यूम की अवधारणा के साथ कुछ महत्वपूर्ण याद आ रही है, क्योंकि वे डॉकर और दस्तावेज़ीकरण को संदर्भित करते हैं।

यह मेरा डोकर-compose.yml फ़ाइल (: 5.6-अपाचे छवि वेब बस php बनाता है):

web: 
    restart: "always" 
    build: ./docker-containers/web 
    ports: 
    - "8080:80" 
    volumes: 
    - ./src:/var/www/html 
    links: 
    - mysql:mysql 

mysql: 
    restart: "always" 
    image: mysql:5.7 
    volumes_from: 
    - data 
    ports: 
    - "3306:3306" 
    environment: 
    - MYSQL_ROOT_PASSWORD=XXX 

data: 
    restart: "no" 
    image: mysql:5.7 
    volumes: 
    - /var/lib/mysql 
    command: "true" 
मात्रा के लिए

डोकर लिखें फ़ाइल documention यहाँ है: http://docs.docker.com/compose/compose-file/

यह के लिए कहा गया है वॉल्यूम्स - माउंट पथ वॉल्यूम्स के रूप में, वैकल्पिक रूप से मेजबान मशीन (HOST: कंटेनर), या एक एक्सेस मोड (HOST: कंटेनर: ro) पर पथ निर्दिष्ट करना।

इस मामले में HOST डॉकर-मशीन द्वारा निर्मित मेरे वीएम को संदर्भित करता है, सही? या मेरी स्थानीय मैकबुक फ़ाइल सिस्टम? मेरे वीएम पर एक कंटेनर पर पथ बढ़ाना?

तहत वेब मैं घोषणा:

volumes: 
    - ./src:/var/www/html 

और यह मेरा स्थानीय मैकबुक फाइल सिस्टम अपने वेब कंटेनर के लिए अपने मैकबुक प्रो पर ./src फ़ोल्डर मैपिंग कर रहा है। अगर मेरी समझ सही है, तो क्या यह पर मैपिंग नहीं करनी चाहिए ./src मेरे पर वीएम/var/www/html वेब कंटेनर के भीतर मैपिंग नहीं करना चाहिए ?! सिद्धांत रूप में मुझे लगता है कि मुझे अपने स्थानीय मैक फ़ाइल सिस्टम फ़ोल्डर ./src को पहले मेरे वीएम में कॉपी करने की आवश्यकता होनी चाहिए, और फिर मैं यह वॉल्यूम घोषणा करता हूं। ऐसा लगता है कि डॉकर-कंपोज़ मैजिकल रूप से यह सब एक बार में कर रहा है? उलझन में

आखिरकार, हम देख सकते हैं कि मैं अपने mysql डेटा को जारी रखने के लिए केवल डेटा कंटेनर बना रहा हूं। मैं घोषित किया है:

volumes: 
    - /var/lib/mysql 

यह मेरा होस्ट boot2docker वी एम पर एक /var/lib/mysql फ़ोल्डर बना नहीं करना चाहिए और मैं तो वी एम पर इस फ़ोल्डर में नेविगेट कर सकता है, हां/नहीं? जब मैं अपनी मशीन में एसएसएच करने के लिए डॉकर-मशीन का उपयोग करता हूं, और फिर /var/lib पर नेविगेट करता है, तो नहीं mysql फ़ोल्डर बिल्कुल है ?! यह क्यों नहीं बनाया जा रहा है? क्या मेरी कॉन्फ़िगरेशन में कुछ गड़बड़ है? :/

अग्रिम धन्यवाद! मैं यहां क्या गलत कर रहा हूं, इस बारे में कोई स्पष्टीकरण बहुत सराहना की जाएगी!

+0

मदद की http://stackoverflow.com/questions/23439126/how-to-mount-host-directory-in-docker-container/33404132#33404132 आपके प्रश्न का उत्तर है? स्पष्टीकरण के लिए – Eli

उत्तर

10

ठीक है यहां कुछ बिंदु हैं जिन्हें यहां संबोधित करने की आवश्यकता है।

चलिए एक डॉकर वॉल्यूम के साथ शुरू करते हैं (इस बिंदु पर अपनी मैकबुक या योनि मशीन के बारे में सोचने की कोशिश न करें।बस इस तथ्य से सावधान रहें कि डॉकर्स एक अलग फाइल सिस्टम का उपयोग करते हैं, जहां कभी भी यह इस बिंदु पर रह सकता है): शायद यह इस तरह की कल्पना करें, डॉकर में प्रत्येक वॉल्यूम केवल आंतरिक फ़ाइल सिस्टम डॉकर उपयोग का हिस्सा है । कंटेनर इस प्रकार के वॉल्यूम का उपयोग कर सकते हैं, जैसे कि वे "छोटे हार्डड्राइव" थे जिन्हें उनके द्वारा घुमाया जा सकता था और उनके बीच भी साझा किया जा सकता था (या उनमें से दो में से एक द्वारा घुड़सवार, जैसे कि कुछ FTP सर्वर के सुपर फास्ट संस्करण को दो तक बढ़ाना ग्राहक या जो कुछ भी: पी)।

प्रिंसिपल में आप डॉकरफाइल के वॉल्यूम निर्देश के माध्यम से इन वॉल्यूम्स (अभी भी अपने कंप्यूटर/योनि के बारे में सोच नहीं सकते हैं, केवल डॉकर्स;) के बारे में सोच सकते हैं। स्टैंडर्ड उदाहरण है, तो जैसे एक वेब सर्वर कंटेनर चलाएँ:

FROM: nginx 
VOLUME /www 

अब सब कुछ है कि/www में चला जाता है सिद्धांत में रखा जा सकता है और एक कंटेनर से अनमाउंट किया है और यह भी कई कंटेनर के लिए रखा होगा। अब अकेले Nginx उबाऊ है, इसलिए हम उन फ़ाइलों पर php चलाने के लिए चाहते हैं जो nginx स्टोर कुछ और मजेदार सामग्री उत्पन्न करने के लिए। => हमें उस वॉल्यूम को कुछ php-fpm कंटेनर में आरोहित करने की आवश्यकता है। हमारे लिखें फ़ाइल में Ergo हम इस

web: 
    image: nginx 
php: 
    image: php-fpm 
    volumes_from: 
    - web 

=> देखा करते हैं! nginx/वेब कंटेनर में वॉल्यूम निर्देश द्वारा घोषित प्रत्येक फ़ोल्डर php में दिखाई देगा। यहां ध्यान देने योग्य महत्वपूर्ण बिंदु, जो भी nginx/www में है, जो कुछ भी php/www में ओवरराइड करेगा। यदि आप डालते हैं: ro, php उस फ़ोल्डर को भी लिख नहीं सकता है :)

अब आपके मुद्दे के करीब बढ़ते हुए, वॉल्यूम घोषित करने का दूसरा तरीका है, जिसके लिए उन्हें डॉकरफ़ाइल में घोषित करने की आवश्यकता नहीं है। यह मेजबान से वॉल्यूम बढ़कर किया जा सकता है (इस मामले में आपका वानर/बू 2 डॉकर चीज़)। आइए इस पर चर्चा करें जैसे कि हम पहले मूल लिनक्स पर चल रहे हैं।

आप की तरह कुछ डाल करने के लिए थे, तो:

volumes: 
- /home/myuser/folder:/folder 
अपने डोकर-compose.yml में

, तो यह मतलब है कि/घर/MyUser/फ़ोल्डर अब डोकर में घुड़सवार की जाएगी। जो भी डॉकर में/फ़ोल्डर में है, उसे ओवरराइड कर देगा और जैसे/www की घोषणा की गई चीज़ से भी पहुंचा जा सकता है। अब लिनक्स मशीन डॉकर डिमन चल रहा है।

तो सिद्धांत :) के लिए बहुत है, वास्तव में आप शायद सिर्फ निम्नलिखित सलाह की जरूरत है अपना सामान जा रहा करने के लिए मिलता है :):

रास्ता boot2docker/डोकर मशीन/kitematic और इन सब बातों मुद्दे से निपटने बस इतना है कि वे सबसे पहले योनि मशीन में डॉकर कंटेनर में वॉल्यूम माउंट करते हैं, और वे बस यह भी आपके मैक फाइल सिस्टम में माउंट करते हैं, उम्मीद करते हैं कि यह सब काम करेगा: पी

अब व्यावहारिक के लिए इस समस्या का उपयोग करने में हम सभी समस्याएं (या बस अपने सहकर्मियों को मिठाई मीठे डॉकर की दुनिया में मदद करने की कोशिश कर रहे हैं: पी) मैक पर मुकाबला करने की अनुमति है। मेरा मतलब है कि इसके बारे में सोचें (रूट या कुछ अन्य उपयोगकर्ता कंटेनर में फ़ाइलों को संभालते हैं, उपयोगकर्ता योनर योनेंट होस्ट में फ़ाइलों को संभाल सकता है और फिर आपके मैक उपयोगकर्ता "skalfyfan" मैक में उन फ़ाइलों को संभालता है। उनके पास अलग-अलग उपयोगकर्ता आईडी और whatnot = > इसके साथ कई समस्याएं उत्पन्न होती हैं, और कुछ हद तक जो आप वास्तव में डॉकर में चल रहे हैं उसके आधार पर। MySQL और Apache विशेष रूप से दर्दनाक हैं, क्योंकि वे कंटेनर के भीतर रूट के रूप में नहीं चलते हैं। इसका मतलब है कि उन्हें अक्सर मैक फ़ाइल में लिखने में परेशानी होती है सिस्टम

नीचे दूसरे दृष्टिकोण की कोशिश करने से पहले, बस अपने कंटेनर वॉल्यूम को मैक होम निर्देशिका के नीचे डालने का प्रयास करें। यह ज्यादातर मामलों में MySQL के साथ समस्याओं को हल करेगा जैसा कि मैंने समय के साथ पाया है। बीटीडब्ल्यू: वॉल्यूम्स के लिए पूर्ण पथ घोषित करने की कोई आवश्यकता नहीं है ./folder ठीक है और उस स्थान के सापेक्ष पढ़ा जाता है जहां आपका डॉकर-compose.yml रहता है!

बस अपने मैक उपयोगकर्ता फ़ोल्डर में लिखें-yml डालें, यह सब कुछ मायने रखता है। कोई chmod 777 -R: पी आपको यहां मदद करेगा, इसे सिर्फ आपके घर के फ़ोल्डर के नीचे होना चाहिए :)

अभी भी कुछ ऐप्स (उदाहरण के लिए अपाचे) आपको अभी भी कठिन समय देगा। तथ्य यह है कि कंटेनर में जो कुछ भी चलता है उसका उपयोगकर्ता आईडी आपके मैक उपयोगकर्ता आईडी से भिन्न होता है, जिससे आपका जीवन नरक हो जाएगा। इसके आस-पास पहुंचने के लिए, आपको उपयोगकर्ता आईडी के साथ-साथ उपयोगकर्ता समूह को इस तरह से समायोजित करने की आवश्यकता है कि आपके मैक की अनुमतियों के साथ संघर्ष न हो। समूह आप एक कर्मचारी मैक है पर चाहते हैं, एक यूआईडी कि काम करता है उदाहरण 1000 के लिए होगा इसलिए आप अपने Dockerfile के अंत में इस डाल सकता है:

RUN usermod -u 1000 www-data 
RUN usermod -G staff www-data 

या

RUN usermod -u 1000 mysql 
RUN usermod -G staff mysql 

तो जैसा कि आप अब सीखा है:

सिद्धांत रूप में मुझे लगता है कि मैं पहली बार मेरी वी एम के लिए अपने स्थानीय मैक फ़ाइल प्रणाली फ़ोल्डर ./src कॉपी करने के लिए आवश्यक होना चाहिए, और फिर मैं इस वॉल्यूम कर घोषणा। ऐसा लगता है कि डॉकर-कंपोज़ मैजिकल रूप से यह सब एक बार पर कर रहा है?

अधिकार पर, यह होता है कि :)

अन्त में, हम देख सकते हैं कि मैं मेरी mysql डेटा लागू करने के लिए एक ही डेटा-कंटेनर बना रहा हूं। मैं घोषित किया है: मात्रा: -/var/lib/mysql

यह एक तुम गलत हो गया :) के रूप में, के बारे में बताया कि यदि आप एक मेजबान फ़ोल्डर देना नहीं है, तो डोकर इस मार्ग बना रहेगा। लेकिन केवल इस कंटेनर के लिए और सभी डॉकर फ़ाइल सिस्टम के भीतर रहेंगे। मेजबान को कुछ भी नहीं लिखा गया है! यह हमेशा तभी होगा जब आप कंटेनर फ़ोल्डर से पहले एक मेजबान फ़ोल्डर देते हैं!

आशा इस :)

+0

धन्यवाद! आपकी आखिरी टिप्पणियों के बारे में, यदि मैं लिखने में वॉल्यूम घोषित करते समय होस्ट फ़ोल्डर नहीं देता हूं, तो आप कहते हैं, * फिर डॉकर इस पथ को जारी रखेगा। * क्या आप स्पष्टीकरण दे सकते हैं * डॉकर * के लिए कंटेनर में पथ बनाए रखने के लिए इसका क्या अर्थ है? यदि यह बंद हो जाता है, तो पुनरारंभ होता है कि यह डेटा बनाए रखेगा? कंटेनर हटा दिए जाने पर डेटा केवल खो जाएगा? क्या यह डॉकर के लिए केवल एक कंटेनर में पथ बनाए रखने का मतलब है? * –

+0

हां बिल्कुल: रोकना ठीक है, आप पुनरारंभ करते हैं, डेटा अभी भी वहां है। हटाना => मात्रा में डेटा भी चला गया है। अर्ध महत्वपूर्ण यहाँ टिप: मात्रा अभी भी वहाँ है, लेकिन आप पहुंच खो और यह -v ध्वज के साथ अपने HD => हटाना कंटेनर :) –

+0

अंतिम सवाल को प्रदूषित करता है! मेरे "डेटा" (डेटा-केवल) कंटेनर में मैंने इसे पढ़ने के लिए अभी बदल दिया: * वॉल्यूम्स: -/var/test/mysql:/var/lib/mysql *, और फिर * डॉकर-कंपोज़ बिल्ड, डॉकर-कंपोज़ अप -d * सब कुछ पुनर्निर्माण करने के लिए। मुझे अब HOST VM पर/var/test/mysql देखने की उम्मीद है लेकिन अभी भी कुछ भी नहीं है? * हेड स्क्रैच * एक बात जो मैं अभी देख रहा हूं वह यह है कि जब मैं अपने वीएम और * डॉकर पीएस * में सभी चलने वाले कंटेनर देखने के लिए एसएसएच करता हूं, तो * डेटा * कंटेनर कहीं भी नहीं देखा जा सकता है, भले ही इसे बनाया जा रहा हो। शायद यह एक और ट्यूटोरियल था :) धन्यवाद! –

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