مقدمه
Docker یک ابزار کانتینریسازی محبوب است که برای ارائه برنامههای نرمافزاری با یک سیستم فایل که شامل همه چیزهایی است که برای اجرا نیاز دارند، استفاده میشود. استفاده از کانتینرهای Docker تضمین میکند که نرمافزار بدون توجه به جایی که در آن مستقر شده است، یکسان رفتار میکند، زیرا محیط زمان اجرا آن بیرحمانه سازگار است. در این آموزش، مروری کوتاه بر رابطه بین تصاویر داکر و کانتینرهای داکر ارائه خواهیم کرد. سپس، نگاهی دقیق تر به نحوه اجرا، شروع، توقف و حذف ظروف خواهیم داشت.
بررسی اجمالی
میتوانیم تصویر Docker را به عنوان یک الگوی بیاثر در نظر بگیریم که برای ایجاد کانتینرهای Docker استفاده میشود. تصاویر معمولاً با یک فایل سیستم ریشه شروع می شوند و تغییرات سیستم فایل و پارامترهای اجرای مربوطه آنها را در لایه های مرتب و فقط خواندنی اضافه می کنند. برخلاف یک توزیع معمولی لینوکس، یک تصویر Docker معمولاً فقط شامل موارد ضروری ضروری برای اجرای برنامه است. تصاویر حالت ندارند و تغییر نمی کنند. در عوض، آنها نقطه شروع کانتینرهای Docker را تشکیل می دهند. تصاویر با دستور docker run زنده می شوند، که با افزودن یک لایه خواندن و نوشتن در بالای تصویر، یک ظرف ایجاد می کند. این ترکیب از لایههای فقط خواندنی که در بالای آن لایه خواندن-نوشتن قرار گرفتهاند، به عنوان یک سیستم فایل اتحادیه شناخته میشوند. هنگامی که تغییری در یک فایل موجود در یک کانتینر در حال اجرا ایجاد میشود، فایل از فضای فقط خواندنی در لایه خواندن-نوشتن کپی میشود، جایی که تغییرات اعمال میشوند. نسخه موجود در لایه خواندن و نوشتن فایل اصلی را پنهان می کند اما آن را حذف نمی کند. تغییرات در لایه خواندن و نوشتن فقط در یک نمونه کانتینر جداگانه وجود دارد. هنگامی که یک کانتینر حذف می شود، هرگونه تغییر از بین می رود مگر اینکه اقداماتی برای حفظ آنها انجام شود.
نحوه کار با کانتینرهای داکر
- دو کانتینر داکر ایجاد کنید
- اولین کانتینر را مجددا راه اندازی کنید
- هر دو کانتینر را حذف کنید
کار با کانتینرها
هر بار که از دستور docker run
استفاده می کنید، یک کانتینر جدید از تصویری که شما مشخص کرده اید ایجاد می کند. این می تواند منبع سردرگمی باشد، بنابراین بیایید با چند مثال نگاهی بیندازیم:
مرحله 1: ایجاد دو کانتینر
دستور اجرای docker
زیر با استفاده از تصویر پایه اوبونتو یک کانتینر جدید ایجاد می کند. -t
یک ترمینال به ما می دهد و -i
به ما امکان تعامل با آن را می دهد. ما به دستور پیشفرض در فایل Docker تصویر پایه اوبونتو، bash
، تکیه میکنیم تا ما را در یک پوسته رها کند.
docker run -ti ubuntu
خط فرمان تغییر می کند تا نشان دهد که ما در داخل کانتینر به عنوان کاربر اصلی هستیم و به دنبال آن شناسه ظرف 12 کاراکتری قرار می گیرد.
root@11cc47339ee1:/#
ما تغییری را با بازتاب متنی در پوشه /tmp
کانتینر ایجاد می کنیم، سپس از cat
برای تأیید اینکه با موفقیت ذخیره شده است استفاده می کنیم.
echo "Example1" > /tmp/Example1.txt
cat /tmp/Example1.txt
Output
Example1
حالا بیایید از ظرف خارج شویم.
exit
کانتینرهای Docker به محض تکمیل فرمانی که صادر کردند، کار نمیکنند، بنابراین کانتینر ما با خروج از پوسته bash متوقف شد. اگر دستور ps
را اجرا کنیم، فرمان نمایش کانتینرهای در حال اجرا، دستور خود را نخواهیم دید.
docker ps
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
اگر پرچم -a
را اضافه کنیم که همه کانتینرها را نشان می دهد، متوقف شده یا در حال اجرا هستند، ظرف ما در لیست ظاهر می شود:
docker ps -a
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11cc47339ee1 ubuntu "/bin/bash" 6 minutes ago Exited (127) 8 seconds ago small_sinoussi
زمانی که کانتینر ایجاد شد، شناسه کانتینر و نامی که به صورت تصادفی تولید شده بود به آن داده شد. در این مورد، 11cc47339ee1
شناسه کانتینر و small_sinoussi
نامی است که بهطور تصادفی تولید میشود. ps -a
آن مقادیر و همچنین تصویری که کانتینر از آن ساخته شده است (ubuntu)، هنگام ایجاد کانتینر (شش دقیقه پیش) و دستوری که در آن اجرا شده است (/bin/bash) را نشان می دهد. خروجی همچنین وضعیت کانتینر (Exited) و مدت زمانی که کانتینر وارد آن حالت شده (6 ثانیه پیش) را ارائه می دهد. اگر کانتینر همچنان در حال کار بود، وضعیت «بالا» را مشاهده میکردیم، به دنبال آن مدت زمانی که کار میکرد.
اگر همان دستور را دوباره اجرا کنیم، یک ظرف کاملاً جدید ایجاد می شود:
docker run -ti ubuntu
میتوانیم بگوییم که یک ظرف جدید است، زیرا شناسه در خط فرمان متفاوت است، و وقتی به دنبال فایل Example1 خود میگردیم، آن را پیدا نمیکنیم:
cat /tmp/Example1
Output
cat: /tmp/Example1: No such file or directory
این می تواند به نظر برسد که داده ها ناپدید شده اند، اما اینطور نیست. اکنون از کانتینر دوم خارج می شویم تا ببینیم که آن و اولین کانتینر ما با فایلی که ایجاد کردیم، هر دو در سیستم هستند.
exit
وقتی دوباره کانتینرها را لیست می کنیم، هر دو ظاهر می شوند:
docker ps -a
Output
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
مرحله 2: راه اندازی مجدد اولین کانتینر
برای راهاندازی مجدد یک کانتینر موجود، از دستور start با پرچم -a برای اتصال به آن و پرچم -i برای تعاملی کردن آن و به دنبال آن شناسه یا نام کانتینر استفاده میکنیم. حتماً شناسه کانتینر خود را در دستور زیر جایگزین کنید:
docker start -ai 11cc47339ee1
ما یک بار دیگر خود را در اعلان bash کانتینر مییابیم و وقتی فایلی را که قبلاً ایجاد کردهایم cat میکنیم، هنوز آنجاست.
cat /tmp/Example1.txt
Output
Example1
اکنون می توانیم از کانتینر خارج شویم:
exit
این خروجی نشان می دهد که تغییرات ایجاد شده در داخل کانتینر از طریق توقف و راه اندازی آن ادامه می یابد. تنها زمانی که ظرف حذف می شود، محتوا حذف می شود. این مثال همچنین نشان میدهد که تغییرات محدود به ظرف جداگانه بوده است. وقتی ظرف دوم را راه اندازی کردیم، حالت اولیه تصویر را منعکس می کرد.
مرحله 3: حذف هر دو کانتینر
ما دو کانتینر ایجاد کردهایم و آموزش کوتاه خود را با حذف آنها به پایان میرسانیم. دستور docker rm که فقط روی کانتینرهای متوقف شده کار می کند، به شما امکان می دهد نام یا شناسه یک یا چند کانتینر را مشخص کنید، بنابراین می توانیم هر دو را با موارد زیر حذف کنیم:
docker rm 11cc47339ee1 kickass_borg
Output
11cc47339ee1
kickass_borg
هر دو کانتینر و هر تغییری که در داخل آنها ایجاد کردیم، اکنون از بین رفته اند.
نتیجه
ما نگاهی دقیق به دستور docker run
انداختهایم تا ببینیم چگونه هر بار که اجرا میشود به طور خودکار یک کانتینر جدید ایجاد میکند. ما همچنین نحوه یافتن یک کانتینر متوقف شده، راه اندازی و اتصال به آن را دیده ایم. اگر میخواهید درباره مدیریت کانتینرها اطلاعات بیشتری کسب کنید، ممکن است به راهنمای نامگذاری کانتینرهای Docker: 3 نکته برای مبتدیان علاقه مند شوید.