তারা একটি উদাহরণ দিয়ে আমার কাছে সর্বাধিক উপলব্ধি করে ...
আপনার নিজের বিল্ডের স্তরগুলি ডকার ডিফের সাথে পরীক্ষা করে
আসুন একটি স্বীকৃত উদাহরণ ডকফেরফাইল নিতে দাও:
FROM busybox
RUN mkdir /data
# imagine this is downloading source code
RUN dd if=/dev/zero bs=1024 count=1024 of=/data/one
RUN chmod -R 0777 /data
# imagine this is compiling the app
RUN dd if=/dev/zero bs=1024 count=1024 of=/data/two
RUN chmod -R 0777 /data
# and now this cleans up that downloaded source code
RUN rm /data/one
CMD ls -alh /data
এই ddকমান্ডগুলির প্রত্যেকটি ডিস্কে 1M ফাইল আউটপুট করে। অস্থায়ী পাত্রে সংরক্ষণ করতে অতিরিক্ত পতাকা দিয়ে চিত্রটি তৈরি করতে দেয়:
docker image build --rm=false .
আউটপুটে, আপনি প্রতিটি চলমান কমান্ড অস্থায়ী পাত্রে ঘটতে দেখবেন যা আমরা এখন স্বয়ংক্রিয়ভাবে মোছার পরিবর্তে রাখি:
...
Step 2/7 : RUN mkdir /data
---> Running in 04c5fa1360b0
---> 9b4368667b8c
Step 3/7 : RUN dd if=/dev/zero bs=1024 count=1024 of=/data/one
---> Running in f1b72db3bfaa
1024+0 records in
1024+0 records out
1048576 bytes (1.0MB) copied, 0.006002 seconds, 166.6MB/s
---> ea2506fc6e11
আপনি যদি docker diffসেই কনটেইনার আইডির প্রত্যেকটিতে একটি চালনা করেন তবে আপনি দেখতে পাবেন যে সেই পাত্রে কী ফাইল তৈরি হয়েছিল:
$ docker diff 04c5fa1360b0 # mkdir /data
A /data
$ docker diff f1b72db3bfaa # dd if=/dev/zero bs=1024 count=1024 of=/data/one
C /data
A /data/one
$ docker diff 81c607555a7d # chmod -R 0777 /data
C /data
C /data/one
$ docker diff 1bd249e1a47b # dd if=/dev/zero bs=1024 count=1024 of=/data/two
C /data
A /data/two
$ docker diff 038bd2bc5aea # chmod -R 0777 /data
C /data/one
C /data/two
$ docker diff 504c6e9b6637 # rm /data/one
C /data
D /data/one
একটির সাথে উপস্থাপিত প্রতিটি লাইন Aফাইল যুক্ত করছে, Cবিদ্যমান ফাইলে পরিবর্তনের Dইঙ্গিত দেয় এবং মুছে ফেলা নির্দেশ করে।
এখানে টিএল; ডিআর অংশ
উপরের এই কনটেইনার ফাইল সিস্টেমগুলির একটি পৃথকভাবে একটি "স্তর" এ যায় যা আপনি কনটেইনার হিসাবে চিত্রটি চালানোর সময় একত্রিত হয়ে যান। একটি অ্যাড বা পরিবর্তন এলে পুরো ফাইলটি প্রতিটি স্তরটিতে থাকে, সুতরাং chmodকেবলমাত্র একটি অনুমতি বিট পরিবর্তন করেও এই কমান্ডগুলির প্রত্যেকটি পরবর্তী ফাইলটিতে পুরো ফাইলটি অনুলিপি করে। মুছে ফেলা / তথ্য / একটি ফাইলটি পূর্ববর্তী স্তরগুলিতে এখনও 3 বার প্রকৃতপক্ষে রয়েছে এবং আপনি যখন ছবিটি টানেন তখন নেটওয়ার্কের মাধ্যমে অনুলিপি করা হবে এবং ডিস্কে সংরক্ষণ করা হবে।
বিদ্যমান চিত্র পরীক্ষা করা হচ্ছে
আপনি কমান্ডগুলি দেখতে পাবেন যা কমান্ডটি দিয়ে একটি বিদ্যমান চিত্রের স্তর তৈরি করতে যায় docker history। আপনি docker image inspectকোনও ছবিতে একটি চালনাও করতে পারবেন এবং রুটএফএস বিভাগের অধীন স্তরগুলির তালিকা দেখতে পাবেন।
উপরের চিত্রটির ইতিহাস এখানে:
IMAGE CREATED CREATED BY SIZE COMMENT
a81cfb93008c 4 seconds ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "ls -… 0B
f36265598aef 5 seconds ago /bin/sh -c rm /data/one 0B
c79aff033b1c 7 seconds ago /bin/sh -c chmod -R 0777 /data 2.1MB
b821dfe9ea38 10 seconds ago /bin/sh -c dd if=/dev/zero bs=1024 count=102… 1.05MB
a5602b8e8c69 13 seconds ago /bin/sh -c chmod -R 0777 /data 1.05MB
08ec3c707b11 15 seconds ago /bin/sh -c dd if=/dev/zero bs=1024 count=102… 1.05MB
ed27832cb6c7 18 seconds ago /bin/sh -c mkdir /data 0B
22c2dd5ee85d 2 weeks ago /bin/sh -c #(nop) CMD ["sh"] 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ADD file:2a4c44bdcb743a52f… 1.16MB
নতুন স্তরগুলি শীর্ষে তালিকাভুক্ত রয়েছে are লক্ষণীয়, নীচে দুটি স্তর রয়েছে যা মোটামুটি পুরানো। এগুলি ব্যস্তবক্সের চিত্র থেকেই আসে। আপনি যখন একটি চিত্র তৈরি করেন, আপনি FROMলাইনে নির্দিষ্ট করা চিত্রের সমস্ত স্তর উত্তরাধিকারী হন । CMDলাইনের মতো ইমেজ মেটা-ডেটাতে পরিবর্তনের জন্য স্তরগুলি যুক্ত করা হচ্ছে । তারা সবেমাত্র কোনও জায়গা নেয় এবং আপনি যে চিত্রটি চালাচ্ছেন তাতে কী সেটিংস প্রয়োগ হয় তা রেকর্ড করার জন্য আরও বেশি।
স্তর কেন?
স্তরগুলির কয়েকটি সুবিধা রয়েছে। প্রথমত, তারা পরিবর্তনযোগ্য। একবার তৈরি হয়ে গেলে, sha256 হ্যাশ দ্বারা চিহ্নিত সেই স্তরটি কখনই পরিবর্তিত হবে না। সেই অপরিবর্তনীয়তা চিত্রগুলিকে নিরাপদে তৈরি এবং একে অপরের কাঁটাচামচ করতে দেয়। যদি দুটি ডকফায়াইলের একই প্রাথমিক লাইনের সেট থাকে এবং একই সার্ভারে নির্মিত হয় তবে তারা ডিস্কের স্থান সাশ্রয় করে প্রাথমিক স্তরগুলির একই সেটটি ভাগ করে দেবে। এর অর্থ হ'ল যদি আপনি কোনও চিত্র পুনর্নির্মাণ করেন, তবে ডকফাইফিলের শেষ কয়েকটি লাইন পরিবর্তনের অভিজ্ঞতা রয়েছে, কেবল সেই স্তরগুলি পুনরায় তৈরি করা দরকার এবং বাকী স্তর স্তরটি পুনরায় ব্যবহার করা যেতে পারে। এটি খুব দ্রুত ডকারের চিত্রগুলি পুনর্নির্মাণ করতে পারে।
একটি ধারক ভিতরে, আপনি চিত্র ফাইল সিস্টেম দেখতে পাবেন, কিন্তু যে ফাইল সিস্টেমটি অনুলিপি করা হয় নি। এই চিত্র স্তরগুলির উপরে, পাত্রে এটি নিজস্ব রিড-রাইটিং ফাইল সিস্টেম স্তর মাউন্ট করে। কোনও ফাইলের প্রতিটি পঠন স্তর পর্যন্ত চলে যায় যতক্ষণ না এটি একটি স্তরটিকে হিট করে যা ফাইলটি মোছার জন্য চিহ্নিত করেছে, সেই স্তরে ফাইলটির একটি অনুলিপি আছে বা পাঠকটি স্তরগুলি সন্ধানের জন্য চলেছে। প্রতিটি লেখাই পাত্রে নির্দিষ্ট পঠন-স্তর স্তর পরিবর্তন করে।
স্তর ফোটা কমাতে
স্তরগুলির একটি নেতিবাচক চিত্রগুলি তৈরি করা হচ্ছে যা নকল ফাইল বা শিপ ফাইলগুলি পরের স্তরে মুছে ফেলা হয়। সমাধানটি প্রায়শই একক RUNকমান্ডে একাধিক কমান্ড একত্রিত করা হয় । বিশেষত আপনি যখন বিদ্যমান ফাইলগুলি সংশোধন করছেন বা ফাইলগুলি মুছছেন, আপনি সেই পদক্ষেপগুলি একই কমান্ডে চালিত করতে চান যেখানে সেগুলি প্রথম তৈরি করা হয়েছিল। উপরের ডকফেরফিলের একটি পুনর্লিখন এর মতো দেখাবে:
FROM busybox
RUN mkdir /data \
&& dd if=/dev/zero bs=1024 count=1024 of=/data/one \
&& chmod -R 0777 /data \
&& dd if=/dev/zero bs=1024 count=1024 of=/data/two \
&& chmod -R 0777 /data \
&& rm /data/one
CMD ls -alh /data
এবং যদি আপনি ফলাফলগুলি তুলনা করেন:
- ব্যস্তবক্স: M 1MB
- প্রথম চিত্র: 6MB
- দ্বিতীয় চিত্র: M 2MB
সংক্ষিপ্ত উদাহরণে কিছু লাইন একত্রিত করে আমরা আমাদের চিত্রটিতে একই ফলস্বরূপ সামগ্রী পেয়েছি এবং আপনি আমাদের চূড়ান্ত চিত্রটিতে দেখতে পেলেন এমন 5MB থেকে 1MB ফাইলের মধ্যে আমাদের চিত্র সঙ্কুচিত করে।