آنچه در این مقاله میخوانید
نحوه اشتراک گذاری داده ها بین کانتینر داکر و هاست
۱ آبان ۱۴۰۴
داکر یکی از محبوبترین ابزارهای کانتینرسازی است که به نرمافزارها یک فایلسیستم کامل میدهد؛ سیستمی که شامل همه چیز مورد نیاز برای اجرا است. با استفاده از کانتینرهای داکر، مطمئن خواهید شد که نرمافزارتان همیشه و همهجا از لپتاپ توسعهدهنده تا سرورهای ابری دقیقا مانند هم رفتار میکند. دلیل آن چه خواهد بود؟ محیط اجرایی ثابت و یکسان نگه داشته خواهد شد.
در این آموزش کوتاه اما بسیار کاربردی از لیارا، ابتدا نگاهی اجمالی به ارتباط بین تصاویر داکر (Docker images) و کانتینرهای داکر (Docker containers) خواهیم داشت. بعد از آن، با جزئیات بیشتری به چگونگی اجرا، راهاندازی، توقف و حذف کانتینرها خواهیم پرداخت. هدف این است که با زبانی ساده اما دقیق، قدمبهقدم پیش برویم تا حتی اگر تازهکار هستید، بتوانید دست به کار شوید و در عین حال، اگر حرفهای هستید، نکات ظریف در این آموزش را از دست ندهید.

نگاهی کلی، تصاویر و کانتینرها، مثل قالب و مجسمه
تصاویر داکر الگوهای ثابت و غیرقابل تغییر هستند که برای ایجاد کانتینرها به کار میروند. این تصاویر از یک فایلسیستم ریشه آغاز میشوند و به صورت لایهبهلایه، تغییرات فایلسیستم و پارامترهای اجرایی را به صورت فقط-خواندنی (read-only) اضافه میکنند. برخلاف توزیعهای لینوکس معمولی که شامل نرمافزارهای اضافی زیادی هستند، یک تصویر داکر تنها اجزای ضروری یعنی حداقلهای لازم برای اجرای برنامه را شامل میشود. تصاویر هیچ حالتی (state) ندارند و تغییر نمیکنند؛ آنها صرفا نقطه شروع برای کانتینرها هستند.
حال، تصاویر با دستور docker run فعال میشوند. این دستور یک کانتینر جدید ایجاد میکند و روی تصویر، یک لایه خواندنی-نوشتنی (read-write) اضافه میکند. ترکیب این لایههای فقط-خواندنی با لایه نوشتنی بالایی، به نام سیستم فایل اتحادی (union file system) شناخته میشود. اگر در کانتینر در حال اجرا تغییری در یک فایل اعمال کنید، فایل از فضای فقط-خواندنی به لایه نوشتنی کپی میشود و تغییرات روی آن اعمال میگردد. نسخه تغییر یافته در لایه نوشتنی، نسخه اصلی را پنهان میکند اما آن را حذف نمیکند. این تغییرات تنها در آن کانتینر خاص وجود دارند. وقتی کانتینر را حذف کنید، تغییرات از دست میروند مگر اینکه اقدامی برای حفظ آنها انجام دهید، مانند commit کردن به یک تصویر جدید.
کار با کانتینرها، از ساخت تا مدیریت
هر بار که دستور docker run
را اجرا میکنید، یک کانتینر تازه از تصویر مشخصشده میسازد. این موضوع گاهی گیجکننده است، پس بیایید با مثالهای عملی این موضوع را پیش ببریم. فرض کنید داکر را روی سیستمتان نصب کردهاید (اگر نه، از سایت رسمی داکر دانلود کنید و راهاندازی کنید).
ابتدا: ساخت دو کانتینر جداگانه
این دستور یک کانتینر جدید از تصویر پایه اوبونتو میسازد. پرچم -t یک ترمینال به ما میدهد و -i اجازه تعامل را:
docker run -ti ubuntu
خط فرمان حالا تغییر میکند و نشان میدهد که داخل کانتینر هستیم، به عنوان کاربر root، همراه با یک ID ۱۲ کاراکتری منحصربهفرد برای کانتینر.
حالا بیایید تغییری ایجاد کنیم: یک متن ساده را به فایل /tmp/Example1.txt بنویسیم و با cat چک کنیم:
echo "Example1" > /tmp/Example1.txt
cat /tmp/Example1.txt
خروجی به صورت زیر خواهد بود.
Example1
حال باید از کا
exit
کانتینرهای داکر به محض تمام شدن دستوری که اجرا میکنند، متوقف میشوند. پس وقتی از شل bash خارج شدیم، کانتینر هم خوابید. اگر docker ps را بزنید (که کانتینرهای در حال اجرا را نشان میدهد)، چیزی نمیبینید:
docker ps
خروجی که به شما نشان خواهد داد:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
اما با اضافه کردن پرچم -a (برای نمایش همه کانتینرها، چه متوقف چه فعال)، کانتینرمان ظاهر میشود:
docker ps -a
خروجی نمونه:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11cc47339ee1 ubuntu "/bin/bash" 6 minutes ago Exited (127) 8 seconds ago small_sinoussi
وقتی کانتینر ساخته شد، یک ID منحصربهفرد (مثل 11cc47339ee1) و یک نام تصادفی (مثل small_sinoussi) گرفت. لیست ps -a جزئیاتی مثل تصویر مبنا (ubuntu)، زمان ساخت (شش دقیقه پیش)، دستور اجرا شده (/bin/bash)، وضعیت (Exited) و زمان توقف را نشان میدهد. اگر کانتینر فعال بود، وضعیت “Up” با مدت زمان اجرا را میدیدید.
حالا همان دستور را دوباره بزنید:
docker run -ti ubuntu
این یک کانتینر کاملاً جدید میسازد. ID جدیدش را در پرامپت میبینید. اگر فایل Example1 را چک کنید:
cat /tmp/Example1.txt
خروجی:
cat: /tmp/Example1.txt: No such file or directory
دادهها گم نشدهاند؛ فقط در کانتینر قبلی هستند. خارج شوید:
exit
حالا لیست کنید:
docker ps -a
خروجی نمونه:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e4341887b69 ubuntu "/bin/bash" About a minute ago Exited (1) 6 seconds ago kickass_borg
11cc47339ee1 ubuntu "/bin/bash" 13 minutes ago Exited (127) 6 minutes ago small_sinoussi
هر دو کانتینر حالا روی سیستمتان هستن، اما تغییرات فقط در کانتینر اول مانده.
گام ۲: راهاندازی مجدد کانتینر اول
برای راهاندازی یک کانتینر موجود، از docker start با پرچمهای -a (برای اتصال) و -i (تعاملی) استفاده کنید، همراه با ID یا نام کانتینر. ID خودتان را جایگزین کنید:
docker start -ai 11cc47339ee1
دوباره در شل bash کانتینر هستیم. فایل را چک کنید:
cat /tmp/Example1.txt
خروجی:
Example1
خارج شوید:
exit
این نشان میدهد که تغییرات داخل کانتینر، با توقف و راهاندازی حفظ میشوند. فقط حذف کانتینر همه چیز را پاک میکند. و یادتان باشد: تغییرات به کانتینرهای دیگر سرایت نمیکند؛ هر کدام مستقلاند.
گام ۳: حذف هر دو کانتینر
دو کانتینر ساختیم؛ حالا حذفشان کنیم. دستور docker rm فقط روی کانتینرهای متوقف کار میکند و میتوانید ID یا نام یکی یا چندتا را مشخص کنید:
docker rm 11cc47339ee1 kickass_borg
خروجی:
11cc47339ee1
kickass_borg
هر دو کانتینر و تغییراتشان حالا پاک شدن.
جمع بندی
در این آموزش، دیدیم که docker run هر بار کانتینر جدیدی میسازد و چطور کانتینرهای متوقف را پیدا، راهاندازی و بهشان وصل شویم. این اصول پایهای مدیریت کانتینرها هستند و کمک میکنند تا محیطهای اجراییتان را بدون دردسر کنترل کنید. اگر میخواهید بیشتر بدانید، به راهنمای “نامگذاری کانتینرهای داکر: ۳ نکته برای تازهکاران” نگاهی بیندازید ابزاری عالی برای سازماندهی بهتر پروژههایتان. با تمرین این مثالها،很快 میتوانید کانتینرها را مثل حرفهایها مدیریت کنید و از ثبات داکر برای پروژههای واقعی بهره ببرید.