আমি কীভাবে একটি ডকার পাত্রে এবং সম্পর্কিত ডেটা ধারক সামগ্রী সহ নিযুক্ত করব?


18

আমি স্বীকার করেই শুরু করব আমি ডকারের কাছে বেশ নতুন এবং অনুমানের ভুল সেট থেকে আমি এই সমস্যাটির দিকে এগিয়ে যাচ্ছি ... যদি তা হয় তবে আমাকে জানান। আমি ডকার মোতায়েনের জন্য কীভাবে কার্যকর তা নিয়ে প্রচুর আলোচনা দেখেছি কিন্তু বাস্তবে এটি কীভাবে হয়েছে তার কোনও উদাহরণ নেই।

আমি ভাবলাম যেভাবে এটি কার্যকর হবে:

  1. মেশিন এতে অবিচ্ছিন্ন কিছু তথ্য রাখতে ডেটা ধারক তৈরি করুন
  2. অ্যাপ্লিকেশন ধারক তৈরি করুন যা ডেটা ধারক থেকে ভলিউম ব্যবহার করে
  3. কিছু কাজ করুন, সম্ভাব্যভাবে ডেটা ধারকটিতে ডেটা পরিবর্তন করুন
  4. অ্যাপ্লিকেশন ধারক বন্ধ করুন
  5. প্রতিশ্রুতিবদ্ধ এবং ডেটা ধারক ট্যাগ করুন
  6. ডেটা ধারকটিকে একটি (প্রাইভেট) ভাণ্ডারে চাপ দিন
  7. মেশিন বিতে step ধাপ থেকে চিত্রটি টানুন এবং চালান
  8. আপনি বি মেশিনে কোথায় ফেলে এসেছেন তা বেছে নিন

এখানে মূল পদক্ষেপটি 5 ম পদক্ষেপ, যা আমি ভেবেছিলাম বর্তমান অবস্থা (ফাইল সিস্টেমের বিষয়বস্তু সহ) সংরক্ষণ করবে save তারপরে আপনি সেই রাজ্যটিকে কোনও ভাণ্ডারের দিকে ঠেলে দিতে পারেন এবং এটিকে অন্য কোথাও থেকে টেনে আনতে পারেন, আপনাকে এমন একটি নতুন ধারক সরবরাহ করতে হবে যা মূলত মূলরূপে অভিন্ন।

তবে এটি সেভাবে কাজ করবে বলে মনে হয় না। আমি যা পাই তা হ'ল যে পদক্ষেপ 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)।

ডেটা ভলিউম ধারক

সেই বিশেষ ধরণের পাত্রে বিশেষ কিছু নেই। এগুলি কেবলমাত্র ডেটা ভলিউম ব্যবহার করে কমপক্ষে একটি ধারক রাখার একমাত্র এবং অনন্য লক্ষ্য সহ একটি ডেটা ভলিউম ব্যবহার করে পাত্রে থামানো হয়েছে। মনে রাখবেন, প্রদত্ত ডেটা ভলিউম ব্যবহার করে শেষ পাত্রে (চলমান বা থামানো) যত তাড়াতাড়ি মুছে ফেলা হবে, সেই ভলিউম ডকার রান --volumes-from বিকল্পের মাধ্যমে অ্যাক্সেসযোগ্য হবে ।

ডেটা ভলিউম ধারকগুলির সাথে কাজ করা

কিভাবে ডেটা ভলিউম ধারক তৈরি করতে হয়

ডেটা ভলিউম ধারক তৈরি করতে ব্যবহৃত চিত্রটির কোনও গুরুত্ব নেই কারণ এ জাতীয় ধারক থামতে পারে এবং এখনও তার উদ্দেশ্য পূরণ করে। সুতরাং datatest_dataএকটি ভলিউমের জন্য নামক একটি ডেটা ধারক তৈরি করতে /datafolderআপনার কেবল চালানো দরকার:

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

এখানে baseচিত্রটির নাম (সুবিধামতো ছোট একটি) এবং trueএকটি কমান্ড যা ডক ডিমনকে একটি অনুপস্থিত কমান্ড সম্পর্কে অভিযোগ না দেখে আমরা এড়াতে পারি। যাইহোক , আপনার কমান্ডের বিকল্পের datatest_dataসাহায্যে সেই ভলিউমে পৌঁছানোর একমাত্র উদ্দেশ্য নিয়ে আপনার কাছে একটি থামানো ধারক রয়েছে after--volumes-fromdocker run

ডেটা ভলিউম ধারক থেকে কীভাবে পড়বেন

আমি ডেটা ভলিউম পড়ার দুটি উপায় জানি: প্রথমটি একটি ধারক মাধ্যমে। যদি সেই ডেটা ভলিউম অ্যাক্সেস করার জন্য আপনার কাছে কোনও বিদ্যমান পাত্রে শেল না থাকে তবে আপনি --volumes-fromসেই ডেটাটি পড়ার একমাত্র উদ্দেশ্যে বিকল্পের সাহায্যে একটি নতুন ধারক চালাতে পারেন ।

এই ক্ষেত্রে:

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

অন্য উপায়টি হ'ল /var/lib/docker/volumesফোল্ডারটি থেকে ভলিউমটি অনুলিপি করা । ভলিউমটি ব্যবহার করে আপনি কোনও একটি ধারকটির মেটাডেটা পরীক্ষা করে সেই ফোল্ডারে ভলিউমের নামটি আবিষ্কার করতে পারেন। বিস্তারিত জানার জন্য এই উত্তরটি দেখুন ।

খণ্ডের সাথে কাজ করা (ডকারের ১.৯.০ থেকে)

কীভাবে একটি ভলিউম তৈরি করা যায় (ডকার 1.9.0 থেকে)

ডকার ১.৯.০ একটি নতুন কমান্ড চালু করেছে docker volumeযা ভলিউম তৈরি করতে দেয়:

docker volume create --name hello

কীভাবে কোনও ভলিউম থেকে পড়তে হবে (ডকার ১.৯.০ থেকে)

ধরা যাক আপনি নামের helloসাথে একটি ভলিউম তৈরি করেছেন docker volume create --name hello, আপনি -vবিকল্পটি দিয়ে এটি একটি ধারকটিতে মাউন্ট করতে পারেন :

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

প্রতিশ্রুতিবদ্ধ এবং পাত্রে ঠেলাঠেলি সম্পর্কে

এটি এখন পরিষ্কার হওয়া উচিত যেহেতু ডেটা ভলিউম কোনও ধারক (ইউনিয়ন ফাইল সিস্টেম) এর অংশ নয়, সুতরাং একটি নতুন ডকার চিত্র তৈরি করার জন্য ধারককে প্রতিশ্রুতিবদ্ধ করা কোনও ডেটা ভলিউমে থাকা কোনও ডেটা ধরে রাখবে না।

ডেটা ভলিউমের ব্যাকআপ তৈরি করা

ডকার ব্যবহারকারী গাইডের ডেটা ভলিউমের ব্যাকআপ তৈরি সম্পর্কে একটি দুর্দান্ত নিবন্ধ রয়েছে ।


ভাল নিবন্ধটি খণ্ড খণ্ডিত: http://container42.com/2014/11/03/docker-indepth-volume/


দেখে মনে হচ্ছে "একটি ডেটা ভলিউম ধারক তৈরিতে ব্যবহৃত চিত্রটির কোনও গুরুত্ব নেই" যথেষ্ট সঠিক নয়। কেবল "স্ক্র্যাচ" চিত্র দিয়ে চেষ্টা করুন যা আপনাকে "এক্সিকিউটিভ:" সত্য ": এক্সিকিউটেবল ফাইলটি পাওয়া যায় নি"
tcurdt

এই ত্রুটি সত্ত্বেও আপনার
ধারকটি

1
এইচএম - তার জন্য সম্ভবত কোনও সমস্যা খোলার পক্ষে মূল্য রয়েছে।
tcurdt

না, স্ক্র্যাচ চিত্রটি খালি চিত্র হওয়ায় যে আচরণটি প্রত্যাশিত তা /bin/trueকোনওভাবেই বাইনারি (বা অন্য কোনও) থাকতে পারে না
থমাসলভিল

1
শুধু একটা কথা. আপনি বলেছিলেন যে "প্রদত্ত ডেটা ভলিউম ব্যবহার করে শেষ পাত্রে (চলমান বা থামানো) মুছে ফেলার সাথে সাথে ডকার সেই ডাটা ভলিউমটি / var / lib / ডকার / ভলিউম থেকে ধ্বংস করে দেবে" "তবে এটি সত্য নয়: কেবল দেখুন: docs.docker.com/userguide/dockervolume (কনটেইনার নিজেই মুছে ফেলা সত্ত্বেও ডেটা ভলিউম অব্যাহত থাকে docker rm -va ভলিউম মোছার জন্য আপনাকে অবশ্যই শেষ পাত্রে বিরুদ্ধে কমান্ডটি নির্দিষ্ট করতে হবে )
জুনআর

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/

আপনি এখন আপনার ইমেজটি ধাক্কা দিতে পারেন এবং ভলিউম-ইত্যাদি ব্যবহার করতে পারেন ...


এটি আমি যা খুঁজছি, তবে গ্রহণযোগ্য উত্তর স্পষ্টভাবে উল্লেখ করে যে এটি করা যায় না। এখনই এটি চেষ্টা করে দেখুন।
andho

1
দ্বিতীয় নজরে তারিখে গৃহীত উত্তর বলছেন ভলিউম (অথবা এটা মধ্যে ডেটা) প্রতিশ্রুতিবদ্ধ হতে অভ্যস্ত, কিন্তু আপনি ব্যবহার ধারক ডেটা যোগ করতে পারেন COPYবা ADDএবং ভলিউম ব্যবহার তৈরি VOLUMEDockerfile হবে।
andho
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.