मैं यह स्वीकार करके शुरू करूंगा कि मैं डॉकर के लिए बहुत नया हूं और मैं इस समस्या को मान्यताओं के गलत सेट से आ सकता हूं । .. अगर ऐसा है तो मुझे बताएं । मैंने बहुत सारी चर्चा देखी है कि डॉकर तैनाती के लिए कैसे उपयोगी है लेकिन वास्तव में यह कैसे किया जाता है इसका कोई उदाहरण नहीं है ।
यहाँ मैं जिस तरह से है सोचा यह काम करेगा:
- मशीन ए पर कुछ लगातार डेटा रखने के लिए डेटा कंटेनर बनाएं
- एप्लिकेशन कंटेनर बनाएं जो डेटा कंटेनर से वॉल्यूम का उपयोग करता है
- कुछ काम करें, संभावित रूप से डेटा कंटेनर में डेटा को बदलना
- एप्लिकेशन कंटेनर को रोकें
- डेटा कंटेनर को कमिट और टैग करें
- डेटा कंटेनर को (निजी) रिपॉजिटरी में पुश करें
- मशीन बी पर चरण 6 से छवि को खींचें और चलाएं
- उठाओ जहाँ आप मशीन बी पर छोड़ दिया
यहां मुख्य चरण चरण 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 "-----"
जब मैं इन कंटेनरों का निर्माण और संचालन करता हूं, तो वे ठीक चलते हैं और जिस तरह से मैं उम्मीद करता हूं, काम करता हूं:
बंद करो और विकास मशीन पर शुरू:
- डेटा कंटेनर बनाएँ
- लेखक भागो
- पाठक को तुरंत चलाएं, "यहां कोई डेटा नहीं देखें!"संदेश
- थोड़ी देर रुकिए
- पाठक चलाएं, यादृच्छिक स्ट्रिंग देखें
- लेखक को रोकें
- लेखक को पुनरारंभ करें
- पाठक चलाएं, वही यादृच्छिक स्ट्रिंग देखें
लेकिन प्रतिबद्ध और धक्का मैं क्या उम्मीद नहीं करते:
- डेटा कंटेनर बनाएँ
- लेखक भागो
- पाठक को तुरंत चलाएं, "यहां कोई डेटा नहीं देखें!"संदेश
- थोड़ी देर रुकिए
- पाठक चलाएं, यादृच्छिक स्ट्रिंग देखें
- लेखक को रोकें
- डेटा कंटेनर को कमिट और टैग करें
docker commit datatest_data myrepository:5000/datatest-data:latest
- रिपॉजिटरी को पुश करें
- सभी कंटेनरों को हटा दें और उन्हें फिर से बनाएं
इस बिंदु पर, मैं पाठक को चलाने की उम्मीद करता हूं और उसी यादृच्छिक स्ट्रिंग को देखता हूं, क्योंकि डेटा कंटेनर प्रतिबद्ध है, रिपॉजिटरी में धकेल दिया गया है, और फिर रिपॉजिटरी में उसी छवि से फिर से बनाया गया है । हालांकि, जो मैं वास्तव में देख रहा हूं वह "यहां कोई डेटा नहीं है!"संदेश।
क्या कोई समझा सकता है कि मैं यहाँ कहाँ गलत हो रहा हूँ? या, वैकल्पिक रूप से, मुझे एक उदाहरण के लिए इंगित करें कि डॉकर के साथ तैनाती कैसे की जाती है?