اشتراک گذاری دادهها بین Docker Containers در اوبونتو یکی از ویژگیهای مهم در استفاده از تکنولوژی داکر است. با استفاده از امکانات موجود در Docker، میتوان دادههایی را که توسط یک کانتینر تولید شده است، به کانتینرهای دیگر انتقال داد.
Docker پلتفرمی است که اجرای فرآیندهای ایجاد، پیاده سازی و اجرای برنامهها را در یک کانتینر بسیار ساده و آسان میکند.
استفاده از کانتینرهای Docker تضمین میکند که نرمافزار بدون توجه به جایی که در آن مستقر شده است، یکسان رفتار خواهد کرد، زیرا محیط زمان اجرا آن سازگار است.
به طور کلی، کانتینرهای داکر زودگذر هستند و تا زمانی که دستور صادر شده در کانتینر تکمیل شود، اجرا میشوند.
بیشتر بدانید: نصب داکر در CentOS
با این حال گاهی اوقات، برنامهها باید دسترسی به دادهها را به اشتراک بگذارند یا پس از حذف یک کانتینر، دادهها را حفظ کنند.
پایگاههای داده، محتوای تولید شده توسط کاربر برای یک وبسایت و فایلهای گزارش، تنها چند نمونه از دادههایی هستند که قرار دادن آنها در یک تصویر Docker غیرعملی یا غیرممکن است، اما برنامهها باید به آنها دسترسی داشته باشند. دسترسی مداوم به دادهها با Docker Volumes ارائه میشود.
Docker Volumes را میتوان با همان دستوری که یک کانتینر ایجاد میکند ایجاد و متصل کرد، یا میتوان آنها را مستقل از هر کانتینری ایجاد و بعداً متصل کرد.
در این مقاله به چهار روش مختلف برای به اشتراک گذاری دادهها بین کانتینرها خواهیم پرداخت، پس تا پایان این مطلب همراه ما باشید.
پیش نیازها
برای اجرای این آموزش به یک سرور ابری با سیستم عامل اوبونتو با کاربر non-root با امتیازات sudo نیاز دارید.
ابر آسیاتک با ارائه سرور ابری رایگان به مدت ۲۴ ساعت، این امکان را برای کاربران فراهم میآورد تا برای یادگیری بهتر بتوانند مطالب آموزشی را در سرور خود تست و پیادهسازی کنند.
نحوه ایجاد یک حجم مستقل
دستور ایجاد حجم داکر این امکان را برای شما فراهم میآورد تا بدون اتصال آن به هر کانتینر خاص، یک حجم ایجاد کنید.
با استفاده از دستور زیر میتوانید حجمی به نام DataVolume۱ اضافه کنید.
docker volume create --name DataVolume1
نام حجم موردنظر شما نمایش داده میشود که نشان میدهد دستور شما موفقیت آمیز بوده است.
Output
DataVolume1
برای استفاده از این حجم، لازم است یک کانتینر جدید از تصویر اوبونتو ایجاد کنید.
با استفاده از دستور rm– میتوانید آن را به طور خودکار در هنگام خروج حذف کنید و از دستور v- برای نصب حجم جدید استفاده کنید.
v- به نام حجم، به یک کولون، سپس مسیر مطلق به جایی که حجم باید در داخل کانتینر ظاهر شود، نیاز دارد.
اگر دایرکتوریهای موجود در مسیر به عنوان بخشی از تصویر وجود نداشته باشند، هنگام اجرای دستور ایجاد میشوند.
اگر آنها وجود داشته باشند، حجم نصب شده محتوای موجود را پنهان میکند.
docker run -ti --rm -v DataVolume1:/datavolume1 ubuntu
در حالی که در کانتینر هستید، مقداری داده در حجم بنویسید.
echo "Example1" > /datavolume1/Example1.txt
از آنجایی که از دستور rm– استفاده کردهاید، پس از خروج، کانتینر شما به طور خودکار حذف میشود. با این حال، حجم شما همچنان در دسترس خواهد بود.
exit
شما میتوانید با بررسی حجم داکر، وجود حجم کش در سیستم خود را تایید کنید.
docker volume inspect DataVolume1
خروجی زیر را دریافت خواهید کرد.
Output
[
{
"CreatedAt": "2018-07-11T16:57:54Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/DataVolume1/_data",
"Name": "DataVolume1",
"Options": {},
"Scope": "local"
}
]
سپس، یک کانتینر جدید راه اندازی کنید و DataVolume۱ را به آن متصل کنید.
docker run --rm -ti -v DataVolume1:/datavolume1 ubuntu
با اجرای دستور زیر محتویات را بررسی کنید.
cat /datavolume1/Example1.txt
خروجی زیر را دریافت خواهید کرد.
Output
Example1
با اجرای دستور زیر از کانتینر خارج شوید.
exit
در این آموزش، شما یک حجم ایجاد کردید، آن را به یک کانتینر متصل و پایداری آن را تایید کردید.
نحوه ایجاد حجمی که پس از حذف کانتینر باقی میماند
در ادامه، همزمان با کانتینر، به ایجاد حجم، حذف container و سپس اتصال حجم به کانتینر خواهیم پرداخت.
بادستور docker run میتوانید یک کانتینر جدید با استفاده از تصویر پایه اوبونتو ایجاد کنید.
دستور t- یک ترمینال و i- امکان تعامل با آن را ارائه میدهد. برای وضوح، از name– برای شناسایی کانتینر استفاده کنید.
بیشتر بدانید : نحوه استفاده از passwd و adduser در لینوکس
دستور v- این امکان را برای شما فراهم میکند تا یک حجم جدید با نام DataVolume2 ایجاد کنید.
برای جدا کردن این نام از مسیری که حجم باید در کانتینر نصب شود، لازم است از یک کولون استفاده کنید.
در نهایت، تصویر پایه اوبونتو را مشخص کرده و با استفاده از دستور پیش فرض در فایل Docker، تصویر پایه اوبونتو و bash را در یک پوسته قرار دهید.
docker run -ti --name=Container2 -v DataVolume2:/datavolume2 ubuntu
در حالی که در کانتینر هستید، برخی از دادهها را روی حجم مینویسید.
echo "Example2" > /datavolume2/Example2.txt
cat /datavolume2/Example2.txt
خروجی زیر را دریافت خواهید کرد.
Output
Example2
با اجرای دستور زیر از کانتینر خارج شوید.
exit
هنگامی که کانتینر را مجددا راه اندازی میکنید، حجم به صورت خودکار افزایش مییابد.
docker start -ai Container2
با اجرای دستور زیر بررسی کنید که حجم نصب شده است و دادههای شما در موقعیت خود قرار دارند.
cat /datavolume2/Example2.txt
خروجی زیر را دریافت خواهید کرد.
Output
Example2
در نهایت، با اجرای دستور زیر از حجم خارج شوید و آن را پاک کنید.
exit
داکر به ما اجازه نمیدهد حجمی را حذف کنیم، بخصوص اگر یک کانتینر به آن ارجاع داده شود. با اجرای دستور زیر میتوانید ببینید چه اتفاقی میافتد.
docker volume rm DataVolume2
خروجی این دستور نشان میدهد که حجم هنوز در حال استفاده است و نسخه طولانی شناسه کانتینر را ارائه میدهد.
Output
Error response from daemon: unable to remove volume: remove DataVolume2: volume is in use - [d0d2233b668eddad4986313c7a4a1bc0d2edaf0c7e1c02a6a6256de27db17a63]
شما میتوانید از شناسه موجود در پیام خطای بالا برای حذف کانتینر استفاده کنید.
docker rm d0d2233b668eddad4986313c7a4a1bc0d2edaf0c7e1c02a6a6256de27db17a63
خروجی زیر را دریافت خواهید کرد.
Output
d0d2233b668eddad4986313c7a4a1bc0d2edaf0c7e1c02a6a6256de27db17a63
حذف کانتینر تاثیری بر حجم آن نخواهد داشت. شما میتوانید با فهرست کردن حجمها با docker volume ls ببینید که هنوز هم در سیستم وجود دارد.
docker volume ls
خروجی زیر را دریافت خواهید کرد.
Output
DRIVER VOLUME NAME
local DataVolume2
و برای حذف آن می توانید از دستور docker volume rm استفاده کنید.
docker volume rm DataVolume2
در این آموزش، شما همزمان با ایجاد یک کانتینر، یک حجم داده خالی ایجاد کردهاید.
در ادامه مطلب اشتراک گذاری دادهها بین Docker Containers در اوبونتو، بررسی خواهیم کرد که وقتی یک حجم با یک دایرکتوری کانتینری ایجاد میکنید که حاوی داده نیز هست، چه اتفاقی میافتد.
نحوه ایجاد حجم از دایرکتوری موجود با دادهها
ایجاد یک حجم به طور مستقل با ایجاد حجم داکر و ایجاد یک حجم در حین ایجاد یک کانتینر، با یک استثنا، معادل هستند. اگر همزمان با ایجاد یک کانتینر حجمی ایجاد کنید و مسیر دایرکتوری حاوی دادههای تصویر پایه را ارائه دهید، آن داده در حجم کپی میشود.
به عنوان مثال، شما میتوانید یک کانتینر ایجاد کنید و حجم داده را در var/، یک دایرکتوری که حاوی دادهها در تصویر اصلی است، اضافه کنید.
docker run -ti --rm -v DataVolume3:/var ubuntu
تمام محتوای دایرکتوری var/ تصویر پایه در این حجم کپی میشود و میتوانید آن حجم را در یک کانتینر جدید قرار دهید.
برای خروج از کانتینر فعلی دستور زیر را اجرا کنید.
exit
این بار، به جای متکی شدن بر دستور bash پیشفرض تصویر پایه، دستور ls را اجرا کنید تا محتویات حجم را بدون وارد شدن به پوسته نشان دهد.
docker run --rm -v DataVolume3:/datavolume3 ubuntu ls datavolume3
دایرکتوری datavolume3 اکنون یک کپی از محتویات دایرکتوری var/ تصویر پایه دارد.
Output
backups
cache
lib
local
lock
log
mail
opt
run
spool
tmp
در ادامه، نشان خواهیم داد که چگونه میتوان یک حجم را بین چندین کانتینر به اشتراک گذاشت.
به اشتراک گذاری دادهها بین چندین کانتینر Docker
تا کنون، شما یک حجم را به یک کانتینر متصل کردهاید. اما اغلب شما میخواهید چندین کانتینر به یک حجم داده متصل شوند.
بیشتر بدانید : مشاهده پورتهای باز در لینوکس
انجام این کار نسبتاً ساده است، اما در حال حاضر، Docker قفل فایل را کنترل نمیکند. اگر به چندین کانتینر برای نوشتن روی حجم نیاز دارید، برنامههایی که در آن کانتینرها اجرا میشوند باید طوری طراحی شوند که برای ذخیره دادههای به اشتراک گذاشته شده بنویسند تا از انحراف دادهها جلوگیری شود.
نحوه ایجاد Container4 و DataVolume4
از docker run برای ایجاد یک کانتینر جدید به نام Container4 با حجم داده ضمیمه شده استفاده کنید.
docker run -ti --name=Container4 -v DataVolume4:/datavolume4 ubuntu
سپس، یک فایل ایجاد و متنی اضافه کنید.
echo "This file is shared between containers" > /datavolume4/Example4.txt
درنهایت، با اجرای دستور زیر از کانتینر خارج خواهید شد.
exit
این دستور ما را به خط فرمان هاست برمیگرداند، جایی که شما یک کانتینر جدید میسازید که حجم دادهها را از Container4 نصب کند.
نحوه ایجاد Container5 و Mount Volumes از Container4
در ادامه با ایجاد Container5 حجمها را از Container4 نصب کنید.
docker run -ti --name=Container5 --volumes-from Container4 ubuntu
با اجرای دستور زیر پایداری دادهها را بررسی کنید.
cat /datavolume4/Example4.txt
Output
This file is shared between containers
اکنون با اجرای دستور زیر، متنی از Container5 اضافه کنید.
echo "Both containers can write to DataVolume4" >> /datavolume4/Example4.txt
در نهایت، از کانتینر خارج خواهید شد.
exit
مشاهده تغییرات ایجاد شده در Container5
در ادامه مطلب اشتراک گذاری دادهها بین Docker Containers در اوبونتو، اکنون تغییراتی که توسط Container5 در حجم داده نوشته شده است را با راه اندازی مجدد Container4 بررسی کنید.
docker start -ai Container4
با اجرای دستور، زیر تغییرات را بررسی کنید.
cat /datavolume4/Example4.txt
Output
This file is shared between containers
Both containers can write to DataVolume4
اکنون که تأیید کردید هر دو کانتینر قادر به خواندن و نوشتن از حجم داده هستند، از کانتینر خارج خواهید شد.
exit
Docker هیچ گونه قفل فایل را مدیریت نمیکند، بنابراین لازم است برنامهها این موضوع را در نظر بگیرند.
میتوان حجم داکر را بهعنوان فقط خواندنی نصب کرد تا اطمینان حاصل شود که خرابی دادهها به طور تصادفی اتفاق نمیافتد، زمانی که یک کانتینر به دسترسی فقط خواندنی نیاز دارد میتوانید با افزودن .ro: آن را مشاهده کنید.
نحوه راه اندازی Container 6 و نصب Volume Read-Only
هنگامی که یک حجم در یک کانتینر نصب شد، به جای آن که مانند یک سیستم فایل لینوکس معمولی آن را باز کنید، میتوانید به جای این روش، یک کانتینر جدید ایجاد کنید که به روشی که میخواهید نصب شده است و در صورت نیاز، کانتینر قبلی را حذف کنید. برای خواندن حجم فقط کافی است ro: را به انتهای نام کانتینر اضافه کنید.
docker run -ti --name=Container6 --volumes-from Container4:ro ubuntu
با تلاش برای حذف فایل نمونه خود، با اجرای دستور زیر وضعیت فقط خواندنی را بررسی کنید.
rm /datavolume4/Example4.txt
Output
rm: cannot remove '/datavolume4/Example4.txt': Read-only file system
در نهایت، از کانتینر خارج شوید و کانتینر و حجمهای آزمایشی خود را پاکسازی کنید.
exit
اکنون، کانتینر و حجم خود را نیز پاکسازی کنید.
docker rm Container4 Container5 Container6
docker volume rm DataVolume4
جمع بندی
داکر یکی از محبوبترین پلتفرمهای مجازیسازی است که به کاربران امکان میدهد برنامهها را در یک محیط مجازی ایزوله و قابل حمل اجرا کنند. با مطالعه مقاله اشتراک گذاری دادهها بین Docker Containers در اوبونتو، شما میتوانید یک حجم ایجاد کنید و این امکان را برای دادهها فراهم آورید تا از طریق حذف یک کانتینر باقی بمانند. همچنین میتوانید حجم دادهها را بین کانتینرها به اشتراک بگذارید. در نهایت، نحوه نصب یک حجم مشترک را در حالت فقط خواندنی میآموزید.
[yasr_overall_rating]