मैं मानता हूँ कि मैं डॉकटर के लिए बहुत नया हूँ और मैं इस समस्या को मान्यताओं के गलत सेट से प्राप्त कर सकता हूँ ... मुझे बताएं कि क्या यह मामला है। मैंने बहुत चर्चा की है कि डॉकियर तैनाती के लिए कैसे उपयोगी है लेकिन वास्तव में कैसे किया जाता है इसका कोई उदाहरण नहीं है।
यहाँ मैंने सोचा है कि यह काम करेगा:
- मशीन A पर कुछ लगातार डेटा रखने के लिए डेटा कंटेनर बनाएँ
- एप्लिकेशन कंटेनर बनाएं जो डेटा कंटेनर से वॉल्यूम का उपयोग करता है
- कुछ काम करते हैं, संभवतः डेटा कंटेनर में डेटा बदल रहे हैं
- आवेदन कंटेनर बंद करो
- डेटा कंटेनर को कमिट और टैग करें
- डेटा कंटेनर को एक (निजी) भंडार में धकेलें
- मशीन B पर चरण 6 से चित्र को खींचें और चलाएँ
- उठाएँ जहाँ आपने मशीन B पर छोड़ा था
यहां महत्वपूर्ण चरण चरण 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.sh
RUN chmod 755 /usr/local/sbin/*.sh
CMD ["/usr/local/sbin/run.sh"]
run.sh
#!/bin/bash
while :
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 scripts
ADD run.sh /run.sh
RUN chmod 0777 /run.sh
CMD ["/run.sh"]
run.sh:
#!/bin/bash
echo "reading..."
echo "-----"
cat /datafolder/data.txt
echo "-----"
जब मैं इन कंटेनरों का निर्माण और संचालन करता हूं, तो वे ठीक चलते हैं और मेरी अपेक्षा के अनुरूप काम करते हैं:
विकास मशीन पर रोकें और शुरू करें:
- डेटा कंटेनर बनाएँ
- लेखक चलाते हैं
- पाठक को तुरंत चलाएं, "यहां कोई डेटा नहीं!" संदेश
- थोड़ा इंतज़ार करिए
- रीडर चलाएं, यादृच्छिक स्ट्रिंग देखें
- लेखक बंद करो
- लेखक को पुनः आरंभ करें
- पाठक को चलाएं, उसी यादृच्छिक स्ट्रिंग को देखें
लेकिन कमिटमेंट और धक्का वह नहीं करता जो मैं उम्मीद करता हूं:
- डेटा कंटेनर बनाएँ
- लेखक चलाते हैं
- पाठक को तुरंत चलाएं, "यहां कोई डेटा नहीं!" संदेश
- थोड़ा इंतज़ार करिए
- रीडर चलाएं, यादृच्छिक स्ट्रिंग देखें
- लेखक बंद करो
- के साथ डेटा कंटेनर को कमिट करें और टैग करें
docker commit datatest_data myrepository:5000/datatest-data:latest
- भंडार में धक्का
- सभी कंटेनरों को हटा दें और उन्हें पुनः बनाएँ
इस बिंदु पर, मैं पाठक को चलाने और उसी यादृच्छिक स्ट्रिंग को देखने की उम्मीद करूंगा, क्योंकि डेटा कंटेनर को प्रतिबद्ध किया गया है, रिपॉजिटरी में धकेल दिया गया है, और फिर रिपॉजिटरी में उसी छवि से पुनः बनाया गया है। हालांकि, जो मैं वास्तव में देखता हूं वह "यहां कोई डेटा नहीं है!" संदेश।
क्या कोई समझा सकता है कि मैं यहाँ गलत कहाँ जा रहा हूँ? या, वैकल्पिक रूप से, एक उदाहरण की ओर इशारा करते हैं कि डोकर के साथ तैनाती कैसे की जाती है?