হোস্টে ডকার মাউন্টিং ভলিউম


135

আমি ভলিউমগুলি ব্যবহার করে একটি ডকারের ধারক মধ্যে সফলভাবে ফোল্ডারগুলি ভাগ করতে সক্ষম হয়েছি

docker run -v /host/path:/container/path ...

তবে আমার প্রশ্নটি হ'ল এই এবং ব্যবহারের মধ্যে পার্থক্য কি VOLUME ডকফাইফিল কমান্ডটি মধ্যে কী পার্থক্য

VOLUME /path

আমি একটি চিত্র ব্যবহার করছি যার একটি VOLUMEকমান্ড রয়েছে এবং আমি কীভাবে এটি আমার হোস্টের সাথে ভাগ করব তা জানতে চাই। আমি -vউপরের কমান্ডটি ব্যবহার করে এটি করেছি , তবে আমি জানতাম না যে আমার -vএবং এর দুটিরই দরকার আছে কিনাVOLUME

উত্তর:


155

VOLUMEকমান্ড আপনার ধারক ভিতরে একটি ডিরেক্টরি মাউন্ট করবে এবং সংরক্ষণ আপনার হোস্ট ডিস্কে তৈরি করা বা ডিরেক্টরিটি ভিতরে সম্পাদিত কোন ফাইল ধারক ফাইলের গঠন বাহিরে , ইউনিয়ন ফাইল সিস্টেম বাইপাস করে।

ধারণাটি হ'ল আপনার ভলিউমগুলি আপনার ডকারের ধারকগুলির মধ্যে ভাগ করা যেতে পারে এবং যতক্ষণ না কোনও কনটেইনার (চলমান বা থামানো) থাকে সেগুলি যতক্ষণ না সেগুলি প্রায় থাকবে that

আপনি --volumes-fromযখন কোনও ধারক চালাবেন তখন কমান্ডটি ব্যবহার করে আপনার কাছে অন্যান্য ধারক বিদ্যমান ভলিউমগুলি (কার্যকরভাবে সেগুলি পাত্রে ভাগ করে নেওয়ার জন্য) মাউন্ট করতে পারেন ।

মধ্যে মৌলিক পার্থক্য VOLUMEএবং -v: এই হল -vআপনার অপারেটিং সিস্টেম থেকে বিদ্যমান ফাইলগুলি আপনার Docker ধারক ভিতরে মাউন্ট করবে এবং VOLUMEকরবে একটি নতুন, খালি ভলিউম তৈরি আপনার হোস্ট এবং আপনার ধারক ভিতরে এটি মাউন্ট।

উদাহরণ:

  1. আপনার একটি ডকফাইফাইল রয়েছে যা একটিকে সংজ্ঞায়িত করে VOLUME /var/lib/mysql
  2. আপনি ডকার চিত্রটি তৈরি এবং এটি ট্যাগ some-volume
  3. আপনি ধারক চালান

এবং তারপর,

  1. আপনার কাছে আরও একটি ডকার চিত্র রয়েছে যা আপনি এই ভলিউমটি ব্যবহার করতে চান
  2. আপনি নিম্নলিখিত সহ ডকার ধারক চালান: docker run --volumes-from some-volume docker-image-name:tag
  3. এখন আপনার কাছে একটি ডকার কনটেইনার চলছে যা some-volumeমাউন্ট করা থেকে ভলিউম পাবে/var/lib/mysql

দ্রষ্টব্য: ব্যবহার --volumes-fromকরে ভলিউমের অবস্থানটিতে যা কিছু রয়েছে তার উপরে ভলিউম মাউন্ট করবে। অর্থ্যাৎ আপনার যদি স্টাফ থাকে তবে /var/lib/mysqlএটি ভলিউমের সামগ্রীর সাথে প্রতিস্থাপন করা হবে।


12
আমি যদি VOLUME এ ইতিমধ্যে নির্দিষ্ট করে দেওয়া ডিরেক্টরিতে -v ব্যবহার করি তবে কী হবে?
জেফ স্টোরি

6
--volumes-fromআপনি VOLUMEযেটি নির্দিষ্ট করবেন তার শীর্ষে আপনাকে মাউন্ট করবে -v। মজার বিষয় হচ্ছে, এটি সুবিধামত মোডে কন্টেইনারটি চালানোর মতো দেখায় ( docker run --privileged) এবং umountআইএনজি /var/lib/mysqlকেবল একটি খালি দির ছেড়ে দেবে যাতে আপনার -vমাউন্টটি এ এর ​​সাথে বিরোধের সময়ে সম্পূর্ণ উপেক্ষা করা হবে VOLUME
ক্রিস ম্যাককিনেল

2
আপনি বলছেন ভলিউম যতক্ষণ একটি ধারক সেটির উল্লেখ করে থাকে ততক্ষণ রাখা হয় এবং আমি সে অন্য কোথাও দেখেছি। docs.docker.com/userguide/dockervolume বলছে "ডেটা ভলিউমগুলি ধারকটির জীবনচক্রের থেকে পৃথক করে ডেটা বজায় রাখার জন্য ডিজাইন করা হয়েছে therefore ডকার অতএব আপনি যখন কোনও ধারক অপসারণ করেন তখন স্বয়ংক্রিয়ভাবে ভলিউমগুলি মুছবেন না বা এটি" আবর্জনা সংগ্রহ "ভলিউমগুলি আর ছাড়বে না একটি ধারক দ্বারা রেফারেন্স। " এই বিবৃতিগুলির একটি অবশ্যই ভুল হতে পারে।
এমসি 0

1
ভলিউমের মধ্যে থাকা ফাইলগুলি ডিস্কে রাখা হয় যখন কোনও ধারক আর এটি উল্লেখ করে না, তবে ভলিউমটি নিজেই আর ব্যবহারযোগ্য হয় না (যদি না আপনি নিজেই জানেন যে কীভাবে কোনও ধারক পর্যন্ত ভলিউমটি ম্যানুয়ালি হুক করতে হয় তবে তবুও আমি ডন করি না ' এটি সম্ভব কিনা তা জানতে পারেন)। যখন আমি আর ব্যবহারযোগ্য না বলি, এর অর্থ আপনি এটিকে ব্যবহার করতে - ভলিউম-থেকে ব্যবহার করতে পারবেন না। যখন তারা উপরের "আবর্জনা সংগ্রহ" বলছেন, তাদের অর্থ হ'ল ভলিউমে থাকা আপনার ডিস্ক থেকে ফাইলগুলি মুছুন।
ক্রিস ম্যাককিনেল

1
এগুলি -v ব্যবহারের উপযোগী তবে ভলিউম-থেকে নয়। ভলিউম-থেকে ভলিউম ডেটা আনতে একটি ধারক নাম নেয় (আমি বিশ্বাস করি এটি সমস্ত ভলিউম পয়েন্ট নেয়)। -V নিজেই, তবে, ম্যানুয়ালটিতে উল্লেখ করা হয়েছে যে আপনি -v আকারে একটি নামযুক্ত ভলিউম সরবরাহ করতে পারেন named-volume:/path/in/container। নামহীন ভলিউমগুলিকে নামের জন্য হ্যাশ দেওয়া হয় এবং অনাথ খণ্ডগুলিতে অ্যাক্সেসের হোস্ট-পাথের পরিবর্তে সেই হ্যাশগুলি সরবরাহ করা যেতে পারে। :) সচেতন থাকুন volume lsতাদের সমস্ত নাও দেখাতে পারে - docker volume ls -f dangling=trueপাশাপাশি চেষ্টা করুন ।
জুঁই হেগম্যান

44

আমাকে আমার নিজের উত্তর যুক্ত করতে দাও, কারণ আমি বিশ্বাস করি যে অন্যরা ডকারের বিন্দুটি অনুপস্থিত।

ব্যবহার VOLUMEডকফাইফিলে করা হ'ল সঠিক উপায় because কারণ আপনি ডকারকে জানতে দিয়েছেন যে কোনও নির্দিষ্ট ডিরেক্টরিতে স্থায়ী ডেটা থাকে। ডকার সেই ডেটার জন্য একটি ভলিউম তৈরি করবে এবং কখনও এটি মুছে ফেলবে না, এমনকি আপনি যদি এটি ব্যবহার করে এমন সমস্ত পাত্রে সরিয়ে ফেলেন।

এটি ইউনিয়ন ফাইল সিস্টেমকেও বাইপাস করে, যাতে ভলিউম প্রকৃতপক্ষে একটি আসল ডিরেক্টরি হয় যা ভাগ করে নেওয়া সমস্ত পাত্রে সঠিক জায়গায় মাউন্ট হয় (পঠন-লিখন বা কেবলমাত্র পড়তে পারে)।

এখন, হোস্ট থেকে সেই ডেটা অ্যাক্সেস করার জন্য, আপনাকে কেবলমাত্র আপনার ধারকটি পরীক্ষা করতে হবে:

# docker inspect myapp
[{
    .
    .
    .
    "Volumes": {
        "/var/www": "/var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6...",
        "/var/cache/nginx": "/var/lib/docker/vfs/dir/62499e6b31cb3f7f59bf00d8a16b48d2...",
        "/var/log/nginx": "/var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87..."
    },
    "VolumesRW": {
        "/var/www": false,
        "/var/cache/nginx": true,
        "/var/log/nginx": true
    }
}]

আমি সাধারণত যা করি তা হ'ল / এসআরভি-র মতো কিছু স্ট্যান্ডার্ড জায়গায় সিমলিংক তৈরি করা , যাতে আমি সহজেই ভলিউমগুলিতে অ্যাক্সেস করতে পারি এবং সেগুলিতে থাকা ডেটা পরিচালনা করতে পারি (কেবলমাত্র আপনি যে খণ্ডগুলির জন্য যত্নশীল)

ln -s /var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6... /srv/myapp-www
ln -s /var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87... /srv/myapp-log

ডকার হোস্ট যদি কোনও ভিএম-তে চলছে তবে কী হবে? উদাহরণস্বরূপ, ম্যাকে বুট 2 ডকার। তারপরে এই খণ্ডগুলি কেবল দূরবর্তীভাবে উপলব্ধ available এছাড়াও, আপনি বর্ণিত হিসাবে ডকফেরলে ভলিউম ব্যবহার করার সময়, চিত্রের বিষয়বস্তুগুলি ভলিউমে অনুলিপি করা হবে। তবে স্থানীয় ডিরেক্টরিতে মাউন্ট করার সময় এই অনুলিপিটি ঘটে না। কেন জানি এই ঘটনা? স্থানীয়ভাবে মাউন্ট করা ভলিউম থাকার কোনও উপায় কি তবে চিত্র থেকে পাওয়া ফাইলগুলি নিয়ে এখনও 'নতুন করে শুরু' করতে পারেন?
4'15 হারিয়েছেন ala

4
ডকার-রচনা দিয়ে আপনি ঠিক এটি করতে পারেন , হোস্ট ওএসের একটি নির্দিষ্ট অবস্থানে একটি ভলিউম মাউন্ট করুন । কোনও সিমলিংকের দরকার নেই ...
হুগো কোপম্যানস

@Tobia: উদাহরণস্বরূপ Docker-রচনা ডক্স দেখতে docs.docker.com/compose/compose-file/...
হুগো Koopmans

11

ভলিউম ব্যবহার করা হয় Dockerfileভলিউম অন্যান্য পাত্রে দ্বারা ব্যবহার করা হবে তা প্রকাশ করার। উদাহরণ, তৈরিDockerfile হিসাবে :

উবুন্টু থেকে: 14.04

RUN mkdir /myvol  
RUN echo "hello world" > /myvol/greeting  
VOLUME /myvol

ছবিটি তৈরি করুন:

$ docker build -t testing_volume .

ধারকটি চালান, ধারক 1 বলুন:

$ docker run -it <image-id of above image> bash

এখন ভলিউম-থেকে বিকল্প হিসাবে অন্য ধারকটি চালান (বলুন-ধারক 2)

$ docker run -it --volumes-from <id-of-above-container> ubuntu:14.04 bash

আপনি ধারক 1 /myvolডিরেক্টরি থেকে সমস্ত অবস্থান একই স্থানে ধারক 2 এ পাবেন।

-vধারক চলমান সময় বিকল্প দেওয়া হয় যা হোস্টে ধারকগুলির ডিরেক্টরি মাউন্ট করতে ব্যবহৃত হয়। এটি ব্যবহার করা সহজ, -vযুক্তি হিসাবে কেবল বিকল্প সরবরাহ করুন <host-path>:<container-path>। পুরো কমান্ড যেমন হতে পারে$ docker run -v <host-path>:<container-path> <image-id>


8

মূলত VOLUMEএবং -vবিকল্প প্রায় সমান। এর অর্থ 'আপনার ধারকটিতে নির্দিষ্ট ডিরেক্টরি মাউন্ট করুন'। উদাহরণস্বরূপ, VOLUME /dataএবং -v /dataঠিক একই অর্থ। আপনি যদি চিত্রটি VOLUME /dataবা -v /dataবিকল্প সহ চালনা করেন ,/data ডিরেক্টরিটি আপনার ধারকটিকে মাউন্ট করা হবে। এই ডিরেক্টরিটি আপনার ধারকটির নয়।

কল্পনা করুন যে আপনি ধারকটিতে কিছু ফাইল যুক্ত করেছেন /data, তারপরে ধারকটিকে নতুন চিত্রে প্রতিশ্রুতিবদ্ধ করুন। ডেটা ডিরেক্টরিতে কোনও ফাইল নেই কারণ মাউন্টড /dataডিরেক্টরিটি মূল ধারকটির অন্তর্ভুক্ত।

$ docker run -it -v /data --name volume ubuntu:14.04 bash
root@2b5e0f2d37cd:/# cd /data
root@2b5e0f2d37cd:/data# touch 1 2 3 4 5 6 7 8 9
root@2b5e0f2d37cd:/data# cd /tmp
root@2b5e0f2d37cd:/tmp# touch 1 2 3 4 5 6 7 8 9
root@2b5e0f2d37cd:/tmp# exit
exit

$ docker commit volume nacyot/volume  
835cfe3d8d159622507ba3256bb1c0b0d6e7c1419ae32751ad0f925c40378945
nacyot $ docker run -it nacyot/volume
root@dbe335c7e64d:/# cd /data
root@dbe335c7e64d:/data# ls
root@dbe335c7e64d:/data# cd /tmp
root@dbe335c7e64d:/tmp# ls
1  2  3  4  5  6  7  8  9
root@dbe335c7e64d:/tmp# 
root@dbe335c7e64d:/tmp# 

এই মাউন্ট করা ডিরেক্টরিটি /dataআপনার অ্যাপ্লিকেশনটির সাথে সম্পর্কিত নয় এমন ডেটা সঞ্চয় করতে ব্যবহৃত হয়। এবং আপনি ব্যবহার করে ধারকটির অন্তর্গত নয় এমন ডেটা ডিরেক্টরিটি পূর্বনির্ধারিত করতে পারেনVOLUME

Volumeএবং -vবিকল্পের মধ্যে পার্থক্য হ'ল আপনি -vধারক শুরু করার ক্ষেত্রে বিকল্পটি গতিশীলভাবে ব্যবহার করতে পারেন । এর অর্থ আপনি গতিশীল কিছু ডিরেক্টরি মাউন্ট করতে পারেন। এবং অন্য পার্থক্য হ'ল আপনি ব্যবহার করে আপনার ধারকটিতে আপনার হোস্ট ডিরেক্টরিটি মাউন্ট করতে পারেন-v


8

এটি ডকার ডকুমেন্টেশন নিজে থেকেই, এটি সহজ, সরল এবং সরল হতে পারে:

"হোস্ট ডিরেক্টরিটি তার প্রকৃতি অনুসারে হোস্ট-নির্ভর। এই কারণে, আপনি ডকফেরফাইল থেকে কোনও হোস্ট ডিরেক্টরি মাউন্ট করতে পারবেন না, ভলিউম নির্দেশ কোনও হোস্ট-ডায়ার পাস করার পক্ষে সমর্থন করে না, কারণ নির্মিত চিত্রগুলি পোর্টেবল হতে হবে A একটি হোস্ট ডিরেক্টরি সমস্ত সম্ভাব্য হোস্টগুলিতে পাওয়া যায় না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.