मैं सामग्री सहित डॉकर कंटेनर और संबंधित डेटा कंटेनर को कैसे तैनात करूं?

मैं यह स्वीकार करके शुरू करूंगा कि मैं डॉकर के लिए बहुत नया हूं और मैं इस समस्या को मान्यताओं के गलत सेट से आ सकता हूं । .. अगर ऐसा है तो मुझे बताएं । मैंने बहुत सारी चर्चा देखी है कि डॉकर तैनाती के लिए कैसे उपयोगी है लेकिन वास्तव में यह कैसे किया जाता है इसका कोई उदाहरण नहीं है ।

यहाँ मैं जिस तरह से है सोचा यह काम करेगा:

  1. मशीन ए पर कुछ लगातार डेटा रखने के लिए डेटा कंटेनर बनाएं
  2. एप्लिकेशन कंटेनर बनाएं जो डेटा कंटेनर से वॉल्यूम का उपयोग करता है
  3. कुछ काम करें, संभावित रूप से डेटा कंटेनर में डेटा को बदलना
  4. एप्लिकेशन कंटेनर को रोकें
  5. डेटा कंटेनर को कमिट और टैग करें
  6. डेटा कंटेनर को (निजी) रिपॉजिटरी में पुश करें
  7. मशीन बी पर चरण 6 से छवि को खींचें और चलाएं
  8. उठाओ जहाँ आप मशीन बी पर छोड़ दिया

यहां मुख्य चरण चरण 5 है, जो मैंने सोचा था कि वर्तमान स्थिति (फ़ाइल सिस्टम की सामग्री सहित) को बचाएगा । फिर आप उस स्थिति को एक भंडार में धकेल सकते हैं और इसे कहीं और से खींच सकते हैं, जिससे आपको एक नया कंटेनर मिल सकता है जो मूल रूप से मूल के समान है ।

लेकिन यह उस तरह से काम नहीं लगता। मुझे जो मिलता है वह यह है कि या तो चरण 5 वह नहीं करता है जो मुझे लगता है कि यह करता है या चरण 7 (छवि को खींचना और चलाना) कंटेनर को प्रारंभिक स्थिति में "रीसेट" करता है ।

मैंने इसका परीक्षण करने के लिए तीन डॉकर छवियों और कंटेनरों का एक सेट एक साथ रखा है: एक डेटा कंटेनर, एक लेखक जो डेटा कंटेनर में हर 30 एस में एक फ़ाइल में एक यादृच्छिक स्ट्रिंग लिखता है, और एक पाठक जो बस echoडेटा कंटेनर फ़ाइल में मान और बाहर निकलता है ।

डेटा कंटेनर

के साथ बनाया गया

docker run \    --name datatest_data \    -v /datafolder \    myrepository:5000/datatest-data:latest

Dockerfile:

FROM ubuntu:trusty# make the data folder#RUN mkdir /datafolder# write something to the data file#RUN echo "no data here!" > /datafolder/data.txt# expose the data folder#VOLUME /datafolder

लेखक

के साथ बनाया गया

docker run \    --rm \    --name datatest_write \    --volumes-from datatest_data \    myrepository:5000/datatest-write:latest

Dockerfile:

FROM ubuntu:trusty# Add script#ADD run.sh /usr/local/sbin/run.shRUN chmod 755 /usr/local/sbin/*.shCMD ["/usr/local/sbin/run.sh"]

run.sh

#!/bin/bashwhile :do    sleep 30s    NEW_STRING=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)    echo "$NEW_STRING" >> /datafolder/data.txt    date >> /datafolder/data.txt    echo "wrote '$NEW_STRING' to file"done

यह स्क्रिप्ट एक यादृच्छिक स्ट्रिंग और दिनांक / समय लिखती है /datafolder/data.txt डेटा कंटेनर में ।

पाठक

के साथ बनाया गया

docker run \    --rm \    --name datatest_read \    --volumes-from datatest_data \    myrepository:5000/datatest-read:latest

Dockerfile:

FROM ubuntu:trusty# Add scriptsADD run.sh /run.shRUN chmod 0777 /run.shCMD ["/run.sh"]

run.sh:

#!/bin/bashecho "reading..."echo "-----"cat /datafolder/data.txtecho "-----"

जब मैं इन कंटेनरों का निर्माण और संचालन करता हूं, तो वे ठीक चलते हैं और जिस तरह से मैं उम्मीद करता हूं, काम करता हूं:

बंद करो और विकास मशीन पर शुरू:

  1. डेटा कंटेनर बनाएँ
  2. लेखक भागो
  3. पाठक को तुरंत चलाएं, "यहां कोई डेटा नहीं देखें!"संदेश
  4. थोड़ी देर रुकिए
  5. पाठक चलाएं, यादृच्छिक स्ट्रिंग देखें
  6. लेखक को रोकें
  7. लेखक को पुनरारंभ करें
  8. पाठक चलाएं, वही यादृच्छिक स्ट्रिंग देखें

लेकिन प्रतिबद्ध और धक्का मैं क्या उम्मीद नहीं करते:

  1. डेटा कंटेनर बनाएँ
  2. लेखक भागो
  3. पाठक को तुरंत चलाएं, "यहां कोई डेटा नहीं देखें!"संदेश
  4. थोड़ी देर रुकिए
  5. पाठक चलाएं, यादृच्छिक स्ट्रिंग देखें
  6. लेखक को रोकें
  7. डेटा कंटेनर को कमिट और टैग करें docker commit datatest_data myrepository:5000/datatest-data:latest
  8. रिपॉजिटरी को पुश करें
  9. सभी कंटेनरों को हटा दें और उन्हें फिर से बनाएं

इस बिंदु पर, मैं पाठक को चलाने की उम्मीद करता हूं और उसी यादृच्छिक स्ट्रिंग को देखता हूं, क्योंकि डेटा कंटेनर प्रतिबद्ध है, रिपॉजिटरी में धकेल दिया गया है, और फिर रिपॉजिटरी में उसी छवि से फिर से बनाया गया है । हालांकि, जो मैं वास्तव में देख रहा हूं वह "यहां कोई डेटा नहीं है!"संदेश।

क्या कोई समझा सकता है कि मैं यहाँ कहाँ गलत हो रहा हूँ? या, वैकल्पिक रूप से, मुझे एक उदाहरण के लिए इंगित करें कि डॉकर के साथ तैनाती कैसे की जाती है?

डॉकर में वॉल्यूम कैसे काम करते हैं, इसके बारे में आपको गलत धारणा मिली । मैं यह समझाने की कोशिश करूंगा कि वॉल्यूम डॉकर कंटेनरों और डॉकर छवियों से कैसे संबंधित है और उम्मीद है कि बीच अंतर डेटा वॉल्यूम और डेटा वॉल्यूम कंटेनर स्पष्ट हो जाएगा ।

पहले कुछ परिभाषाओं को याद करते हैं

डॉकर तस्वीरें

डॉकर छवियां अनिवार्य रूप से एक यूनियन फाइल सिस्टम + मेटाडेटा हैं । आप डॉकर इमेज यूनियन फाइल सिस्टम की सामग्री का निरीक्षण कर सकते हैं docker export कमांड, और आप एक डॉकर छवि मेटाडेटा का निरीक्षण कर सकते हैं docker inspect कमान।

डेटा वॉल्यूम

से डॉकर उपयोगकर्ता गाइड:

डेटा वॉल्यूम एक या एक से अधिक कंटेनरों के भीतर एक विशेष रूप से निर्दिष्ट निर्देशिका है जो लगातार या साझा डेटा के लिए कई उपयोगी सुविधाएँ प्रदान करने के लिए यूनियन फ़ाइल सिस्टम को बायपास करता है ।

यहां यह ध्यान रखना महत्वपूर्ण है कि एक दिया गया वॉल्यूम (निर्देशिका या फ़ाइल जिसमें डेटा है) केवल पुन: प्रयोज्य है यदि यह कम से कम एक डॉकर कंटेनर का उपयोग कर मौजूद है । डॉकर छवियों में वॉल्यूम नहीं होते हैं, उनके पास केवल मेटाडेटा होता है जो अंततः बताता है कि यूनियन फाइल सिस्टम पर वॉल्यूम कहां लगाए जाएंगे । डेटा वॉल्यूम डॉकर कंटेनर यूनियन फाइल सिस्टम का हिस्सा नहीं हैं, तो वे कहां हैं? के तहत /var/lib/docker/volumes डॉकर होस्ट पर (जबकि कंटेनरों को नीचे संग्रहीत किया जाता है /var/lib/docker/containers).

डेटा वॉल्यूम कंटेनर

उस विशेष प्रकार के कंटेनर में कुछ खास नहीं है । वे उस डेटा वॉल्यूम का उपयोग करके कम से कम एक कंटेनर रखने के एकमात्र और अद्वितीय लक्ष्य के साथ डेटा वॉल्यूम का उपयोग करके कंटेनर बंद कर रहे हैं । याद रखें, जैसे ही किसी दिए गए डेटा वॉल्यूम का उपयोग करके अंतिम कंटेनर (चल रहा है या बंद) हटा दिया जाता है, वह वॉल्यूम के माध्यम से पहुंच से बाहर हो जाएगा डॉकर रन --volumes-from विकल्प।

डेटा वॉल्यूम कंटेनरों के साथ काम करना

डेटा वॉल्यूम कंटेनर कैसे बनाएं

डेटा वॉल्यूम कंटेनर बनाने के लिए उपयोग की जाने वाली छवि का कोई महत्व नहीं है क्योंकि इस तरह के कंटेनर को रोका जा सकता है और फिर भी इसका उद्देश्य भर सकता है । तो नामित डेटा कंटेनर बनाने के लिए datatest_data में एक मात्रा के लिए /datafolder आपको केवल चलाने की जरूरत है:

docker run --name datatest_data --volume /datafolder busybox true

यहाँ base छवि का नाम है (एक सुविधाजनक रूप से छोटा) और true एक कमांड है जो हम केवल डॉकर डेमॉन को लापता कमांड के बारे में शिकायत देखने से बचने के लिए प्रदान करते हैं । वैसे भी आपके पास एक बंद कंटेनर नाम है datatest_data आपको उस मात्रा तक पहुंचने की अनुमति देने के एकमात्र उद्देश्य के साथ --volumes-from का विकल्प docker run कमान।

डेटा वॉल्यूम कंटेनर से कैसे पढ़ें

मुझे डेटा वॉल्यूम पढ़ने के दो तरीके पता हैं: पहला एक कंटेनर के माध्यम से है । यदि आपके पास उस डेटा वॉल्यूम तक पहुंचने के लिए मौजूदा कंटेनर में शेल नहीं हो सकता है, तो आप इसके साथ एक नया कंटेनर चला सकते हैं --volumes-from उस डेटा को पढ़ने के एकमात्र उद्देश्य के लिए विकल्प ।

उदाहरण के लिए:

docker run --rm --volumes-from datatest_data busybox cat /datafolder/data.txt

दूसरा तरीका वॉल्यूम को कॉपी करना है /var/lib/docker/volumes फ़ोल्डर। आप वॉल्यूम का उपयोग करके कंटेनर में से किसी एक के मेटाडेटा का निरीक्षण करके उस फ़ोल्डर में वॉल्यूम का नाम खोज सकते हैं । देखें यह जवाब विवरण के लिए ।

वॉल्यूम के साथ काम करना (डॉकर 1.9.0 के बाद से)

वॉल्यूम कैसे बनाएं (डॉकर 1.9.0 के बाद से)

डॉकर 1.9.0 ने एक नया कमांड पेश किया docker volume जो वॉल्यूम बनाने की अनुमति देता है :

docker volume create --name hello

वॉल्यूम से कैसे पढ़ें (डॉकर 1.9.0 के बाद से)

मान लें कि आपने नाम का वॉल्यूम बनाया है hello साथ में docker volume create --name hello, आप इसे एक कंटेनर में माउंट कर सकते हैं -v विकल्प :

docker run -v hello:/data busybox ls /data

कंटेनरों को कम करने और धकेलने के बारे में

अब यह स्पष्ट होना चाहिए कि चूंकि डेटा वॉल्यूम एक कंटेनर (यूनियन फाइल सिस्टम) का हिस्सा नहीं हैं, इसलिए एक नई डॉकर छवि बनाने के लिए एक कंटेनर करने से कोई भी डेटा जारी नहीं रहेगा जो डेटा वॉल्यूम में होगा ।

डेटा वॉल्यूम का बैकअप बनाना

डॉकर उपयोगकर्ता गाइड के बारे में एक अच्छा लेख है डेटा वॉल्यूम का बैकअप बनाना.


अच्छा लेख reagarding मात्रा: http://container42.com/2014/11/03/docker-indepth-volumes/

आप कोड को तैनात करने के लिए डॉकर डेटा कंटेनर का भी उपयोग कर सकते हैं

मुझे नहीं पता कि यह एक अच्छा अभ्यास है, लेकिन मैं इसे ऐसे ही करता हूं :

FROM ubuntu:trusty# make the data folder#RUN mkdir /data-image# in my case, I have a # ADD dest.tar /data-image/## but to follow your example :# write something to the data fileRUN echo "no data here!" > /data-image/data.txt# expose the data folder #VOLUME /datafolderENTRYPOINT cp -r /data-image/* /datafolder/

अब आप अपनी छवि को धक्का दे सकते हैं और वॉल्यूम का उपयोग कर सकते हैं-से , आदि । ..