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


18

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

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

  1. मशीन A पर कुछ लगातार डेटा रखने के लिए डेटा कंटेनर बनाएँ
  2. एप्लिकेशन कंटेनर बनाएं जो डेटा कंटेनर से वॉल्यूम का उपयोग करता है
  3. कुछ काम करते हैं, संभवतः डेटा कंटेनर में डेटा बदल रहे हैं
  4. आवेदन कंटेनर बंद करो
  5. डेटा कंटेनर को कमिट और टैग करें
  6. डेटा कंटेनर को एक (निजी) भंडार में धकेलें
  7. मशीन B पर चरण 6 से चित्र को खींचें और चलाएँ
  8. उठाएँ जहाँ आपने मशीन 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 "-----"

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

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

  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. सभी कंटेनरों को हटा दें और उन्हें पुनः बनाएँ

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

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

जवाबों:


22

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

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

डॉकटर चित्र

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

डेटा वॉल्यूम

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

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

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

डेटा मात्रा कंटेनर

उस विशेष प्रकार के कंटेनर में कुछ खास नहीं है। वे केवल डेटा वॉल्यूम का उपयोग करके कम से कम एक कंटेनर होने के एकमात्र और अनन्य लक्ष्य के साथ डेटा वॉल्यूम का उपयोग कर कंटेनर बंद कर दिए जाते हैं। याद रखें, जैसे ही किसी दिए गए डेटा वॉल्यूम का उपयोग करते हुए अंतिम कंटेनर (चल रहा है या बंद) हटा दिया जाता है, वह वॉल्यूम docker रन --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

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

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

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

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


गुड आर्टिकल रीगलिंग वॉल्यूम: http://container42.com/2014/11/03/docker-indepth-volumes/


ऐसा लगता है "डेटा वॉल्यूम कंटेनर बनाने के लिए उपयोग की जाने वाली छवि का कोई महत्व नहीं है" बहुत सही नहीं है। बस एक "खरोंच" छवि के साथ प्रयास करें जो आपको "निष्पादन:" सच ": निष्पादन योग्य फ़ाइल नहीं मिली"
tcurdt

इस त्रुटि के बावजूद आपके कंटेनर को वॉल्यूम धारक के रूप में अपनी भूमिका को पूरा करने के लिए बनाया जाएगा
थॉमसलेविल 18

1
हम्म - शायद तब के लिए एक मुद्दा खुला।
21

नहीं, यह व्यवहार अपेक्षित है क्योंकि खरोंच छवि एक खाली छवि है जो /bin/trueबाइनरी (या कोई अन्य) वैसे भी नहीं हो सकती है
थॉमसलेविल

1
बस एक बात। आपने कहा कि "जैसे ही किसी दिए गए डेटा की मात्रा का उपयोग करते हुए अंतिम कंटेनर (चल रहा है या बंद) हटा दिया जाता है, docker उस डेटा वॉल्यूम को / var / lib / docker / संस्करणों से नष्ट कर देगा।", लेकिन यह वास्तव में सच नहीं है: बस देखें: docs.docker.com/userguide/dockervolumes (डेटा वॉल्यूम तब भी जारी रहता है जब कंटेनर स्वयं हटा दिया जाता है। आपको docker rm -vअंतिम कंटेनर के लिए कमांड को एक वॉल्यूम हटाने के लिए भी निर्दिष्ट करना होगा )
juanra

1

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

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

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 file
RUN echo "no data here!" > /data-image/data.txt

# expose the data folder 
#
VOLUME /datafolder

ENTRYPOINT cp -r /data-image/* /datafolder/

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


यह वही है जिसकी मैं तलाश कर रहा हूं, लेकिन स्वीकृत उत्तर में स्पष्ट उल्लेख है कि यह नहीं किया जा सकता है। अब इसे आज़माएँ
-हो

1
दूसरी नज़र में, स्वीकृत उत्तर कहता है कि वॉल्यूम (या उसके भीतर का डेटा) अभ्यस्त नहीं होगा, लेकिन आप डेटा का उपयोग करके कंटेनर में जोड़ सकते हैं COPYया डॉकरफाइल में ADDउपयोग करके वॉल्यूम बना VOLUMEसकते हैं।
-हो नोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.