در این درسگفتار میآموزی چگونه با استفاده [استفادن] از ایمیجهای همگانی موجود در hub.docker.com، یه کانتینر را اجرا کنی [باجرایی]، متوقف کنی [بایستی]، دوباره اجرا کنی [بازاجرایی]، و حذف کنی [بحذفی].
توجه. چون علاقه زیادی به آسان کردن [آسانیدن] و باقاعده کردن زبان دارم، واژگان زیادی ساختهام؛ که بدلیل ناشناخته بودن اشان تنها برای شناساندن ازشان استفاده کردهام [استفادهام]. ریشهی بیشتر این واژگان آشکار است؛ و در ویکیواژه تعریفشان کردهام [تعریفتهام اشان] یا خواهم کرد [تعریفینم اشان].
امیدوارم خوشایندت باشد.
سخنی با خواننده. قصد دارم [قصتادم] خودآموز داکر را از پایه برای برنامهنویسان تازهکاری که هیچ آشنایی با داکر ندارند بنویسم. ولی چون امکان دستهبندی [گروهیستن] مقالهها در ویرگول وجود ندارد، عنوان مقالههای این مجموعه را همانند زیر میگذارم:
خودآموز داکر: درس <شماره درس> - <موضوع درس>
که «شماره درس» از ۰۱ شروع شده [شروعارده]. پس، بعنوان مثال، برای یافتن درس سوم کافیه عبارت «خودآموز داکر: درس ۰۳» را در ویرگول جستجو کنی [بجویی]. درضمن، پیشنهاد میکنم [میتوصیم] درسها را بترتیب بخوانی.
نخست موتور داکر را براساس نوع سیستمعاملت طبق مستندات داکر نصب کن [بنصب]:
توجه. اگر هنگام نصبیدن داکر به مشکل دسترسی به هاست برخوردی، میتوانی از تحریمشکنهایی مانند «شکن» و «بگذر» استفاده کنی [باستفایی]. از «docker.ir» و «docker-registry.ir» هم میتوانی بعنوان جایگزین مخزن ایمیج داکر (Docker Registry) استفاده کنی [باستفایی].
افراشتن یه کانتینر بمعنی ساختن یه کانتینر و اجراییدن دستور پیشفرض در کانتینر هه است. درواقع، هنگامیکه یه کانتینر را میافرازیم (با دستور docker run)، یه کانتیر (ازروی یه ایمیج) ساخته (مانند استفاده دستی از docker create) و دستور پیشفرض (که در ایمیج یا دستور اعلامیده شده) درونش اجرا میشود [اجرایشد] (docker start).
افراشتن کانتینر با دستور پیشفرض: docker run [image-name]
معمولا برای هر ایمیج یه دستور پیشفرض تعیین میشود [تعینشد] تا پس از بالا آمدن [افرازاردن] کانتینر درونش اجرا شود [اجرایشد]. [نگران نباش، در درسگفتارهای بعدی بیشتر درموردش توضیح میدهم].
برای افراشتن کانتینر hello-world دستور زیر را اجرا کن [باجرای]. با اجرای [اجراییدن] دستور زیر، اگر ایمیج hello-world در ایمیجهای محلیت وجود نداشته باشد، از مخزن https://hub.docker.com بارگیری میشود. سپس یه کانتینر از رویش ساخته و دستور پیشفرض (که در این مورد چاپ اطلاعاتی در پایانه است) درش اجرا میشود [اجرایشد]؛ دقت کن [بنگر] که کانتینر هه پس از پایان اجرای دستور متوقف میشود [میایستاید].
docker run hello-world # خروجی Unable to find image 'hello-world:latest' locally # نیافتن ایمیج هه در مخزن محلی latest: Pulling from library/hello-world # بارگرفتن ایمیج هه 2db29710123e: Pull complete Digest: sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a9798ff6d2b2e67 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. # ...
افراشتن کانتینر با روسواردن (override) دستور پیشفرض: docker run [image-name] [command]
برای روسواردن دستور پیشفرض هنگام افراشتن یه کانتینر کافیه دستور مورد نظر بعد از نام ایمیج نوشته شود [نویسشد]. بعنوان مثال، برای گرفتن فهرست [فهرستیدن] فایل/پوشههای مسیر / (ریشه) دستور زیر را اجرا کن [باجرای]:
docker run alpine ls -la # خروجی total 0 drwxr-xr-x 1 root root 134 Apr 19 11:34 . drwxr-xr-x 1 root root 134 Apr 19 11:34 .. # ...
افراشتن کانتینر بشکل تعاملی(interactive): docker run -i -t [image-name] [command]
برای اینکه یه کانتینر را براجرا (درحالت اجرا) نگهداری [بَراِجْرایی] از تگهای i و t مانند زیر استفاده کن [باستفای]. بهتره برای مقایسه [قیاسیدن] دستورهای زیر را بترتیب اجرا کنی [باجرایی].
docker run alpine sh # کانتینر بیدرنگ پس از پایان اجرای دستور متوقف میشود docker run -i alpine sh # تعاملی، ولی نه چیزی که باید باشد # به پایانهات دقت کن docker run -i -t alpine sh # == docker run -it alpine sh
افراشتن کانتینر در پسزمینه: docker run -d [image-name] [command]
با تگ d میتوانی از اتصال پایانهات به کانتینر جلوگیری کنی:
# نخست این را باجرای تا خروجی دستور هه را ببینی؛ برای بستن: Ctrl + c docker run alpine ping google.com # پس از قطعیدن از کانتینر بالا دستور زیر را باجرا [کانتینرت براجرا میماند ولی در پایانهات هیچی نمیبینی] docker run -d alpine ping google.com
برای آشنایی بیشتر:
docker run --help
میدانیم کانتینرها پس از متوقف شدن حذف نمیشوند [نمیحذفشند].
فهرستیدن کانتینرهای براجرا (درحال اجرا): docker ps
برای گرفتن کانتینرهای براجرا از دستور زیر استفاده کن [باستفای]:
# پایانه اول: این پایانه را پیش از دیدن خروجی زیر نبند docker run alpine sh # پایانه دوم: این دستور را در یکبار پیش از بستن پایانه اول و یکبار هم بعد از بستن اش اجرا کن docker ps
فهرستیدن همه کانتینرها: docker ps -a
برای گرفتن فهرست همهی کانتینرهایت دستور زیر را اجرا کن [باجرای]:
docker ps -a
اجرای یه کانینر میتواند در پسزمینه یا پیشزمینه برای مدتی ادامه یابد.
ایستیدن باایمنی کانتینر: docker stop [container id]
با اجرای [اجراییدن] این دستور، سیگنال SIGTERM (سیگنال خاتمه، Termination Signals) در کانتینر صادر میشود [صدورشد] و به نرمافزارهای براجرا ۱۰ ثانیه فرصت بستهشدن داده میشود [دادشد]. اگر درین مدت نرمافزارها پاسخ خاتمهکار ندهند، داکر سیگنال SIGKILL را در سیستمعامل صادر میکند [میصدورد].
# نخست یه کانتینر در پسزمینه باجرای docker run -d alpine ping google.com # سپس کانتینرهای براجرایت را بفهرست docker ps # خروجی CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6bb5ad7b6946 alpine "ping google.com" 15 seconds ago Up 12 seconds admiring_robinson # درآخر، با استفادن از شناسه کانتینر هه، باایمنی بایست اش # درمورد این مثال، کانتینر پس از ۱۰ ثانیه بزور ایستشد docker stop [container id] # برای من docker stop 6bb5ad7b6946
ایستیدن بزور کانتینر: docker kill [container id]
با اجرای [اجراییدن] این دستور ازابتدا سیگنال SIGKILL در سیستمعامل صادر میشود [صدورشد] و سیستمعامل همه برنامههای براجرا را بزور متوقف میکند [ایستاید].
# نخست یه کانتینر در پسزمینه باجرای docker run -d alpine ping google.com # سپس کانتینرهای براجرایت را بفهرست docker ps # درآخر، با استفادن از شناسه کانتینر هه، بزور بایست اش docker kill [container id]
میدانیم کانتینرها پس متوقف شدن [ایستشتن] حذف نمیشوند. ولی چطور یه کانتیر متوقفشده [ایستاده] را دوباره بکار بندازیم [بازشروعانیم]؟
شروعاندن کانتینر در پسزمینه: docker start [container id]
این دستور باعث بازاجرا شدن [بازاجرایشتن] دستور پیشفرض کانتینر در پسزمینه میشود.
# اجراییدن یه کانتینر docker run alpine echo Hello World! # فهرستیدن همه کانتیرها docker ps -a # بازاجراییدن کانتینر هه docker start [container id]
گرفتن روینگار (logs) خروجی: docker logs [container id]
هنگام اجراییدن یه کانتینر در پسزمینه، خروجی اش در پایانه چاپ نمیشود. ولی بشکل زیر میتوان روینگارهای (logs) یه کانتینر را گرفت.
docker logs [container id]
شروعاندن کانتینر در پیشزمینه: docker start -a [container id]
این دستور باعث بازاجرا شدن [بازاجرایشتن] دستور پیشفرض کانتیر در پیشزمینه، بشکل غیرتعاملی، میشود. بعبارتی خروجی دستور اجراشونده [اجرایشنده] در کانتینر در پایانهات چاپ میشود. مثال:
# اجراییدن یه کانتینر docker run alpine echo Hello World! # فهرستیدن همه کانتیرها docker ps -a # بازاجراییدن کانتینر هه docker start -a [container id]
شروعاندن تعاملی کانتینر در پیشزمینه: docker start -it [container id]
این دستور باعث بازاجرا شدن [بازاجرایشتن] دستور پیشفرض کانتینر در پیشزمینه، بشکل تعامل میشود. برای دیدن تفاوت حتما دستورهای زیر را اجرا کن.
docker run -it alpine sh / # exit # خروج از کانتینر docker ps -a # یافتن شناسه کانتینر هه docker start -i [container id] # بازاجراییدن تعاملی کانتینر هه
دیدیم که چگونه هنگام بالاآوردن [افراشتن] یه کانتینر میتوان دستور پیشفرض ایمیج را روسوارد. ولی چطور چندتا دستور را در یه کانتینر بشکل موازی اجرا کنیم؟
اجراییدن دستور در کانتینر براجرا: docker exec [image-name] [command]
docker run -it --rm alpine sh # اجراییدن یه کانتینر بشکل تعاملی # در یه پایانه دیگر docker ps # فهرستیدن کانتینرهای براجرا docker exec [container id] ls -la
اجراییدن دستور در کانتینر براجرا بشکل تعاملی: docker exec -it [image-name] [command]
با تگهای i و t میتوان یه دستور را بشکل تعاملی در یه کانتیر براجرا اجرایید.
docker run -it --rm alpine sh # اجراییدن یه کانتینر بشکل تعاملی # در یه پایانه دیگر docker ps # فهرستیدن کانتینرهای براجرا docker exec -it [container id] sh # اجراییدن شل در کانتینر
با حذف [حذفیدن] یه کانتینر، درواقع نمونه اجرایی یه ایمیج حذف میشود [حذفشد].
حذفتن کانتینر ایستیده (متوقفشده): docker rm [containers id]
با این دستور میتوان چند کانتینر را برای حذف شدن اعلام کرد [اعلامید].
# فهرستیدن همهی کانتینرها docker ps -a # خروجی من CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6bb5ad7b6946 alpine "ping google.com" 15 seconds ago Exited (137) 12 seconds ago admiring_robinson b7750bc279e1 alpine "sh" 60 seconds ago Exited (0) 54 seconds ago friendly_bhabha # حذفیتن کانتینرهای ایستیده docker rm 6bb5ad7b6946 b7750bc279e1
حذفیدن کانتینر پس از ایستیدن اش: docker run -it --rm [image-name] [command]
این دستور را هنگامی استفاده کن [باستفای] که میخواهی کانتینرت پس از متوقف شدن [ایستادن] بشکل خودکار حذف شود [حذفشد]. برای مثال، دستور زیر را اجرا کن [باجرای] و پس از متوقف کردن [ایستیدن] کانتینر هه فهرست کانتینرهایت را بگیر.
docker run -it --rm alpine sh # فهرستیدن کانتینرها docker ps -a
حذفیدن همه شیهای داکر: docker system prune
از این دستور تنها هنگامی استفاده کن [باستفای] که میخواهی همه شیهای داکر شامل ایمیجها، کانتینرها، و رابطهای شبکه را حذف کنی [بحذفی].
docker system prune
یه کانتینر اجرا و درونش یه پوشه بنام my_dir در مسیر / (ریشه) ایجاد کن [بایجاد] (با دستور mkdir my_dir). بعد کانتینر هه را متوقف کن [بایست] (با بستن پایانه یا اجرای دستور exit)، بعدش کانتینر هه را دوباره اجرا کن [بازاجرای] و فهرست پوشههای / (ریشه) را با دستور ls -la بگیر.
پاسخ. پیش از نگاه کردن [نگریستن] به پاسخ حتما تلاش کن خودت حلش کنی.
docker run -it alpine sh # در کانتینر mkdir my_dir # ساختن پوشه exit # بستن پایانه در کانتینر # در پایانه ماشین میزبان docker ps -a # فهرستیدن کانتینرها docker start -ai [container id] # بازاجراییدن کانتینر هه ls -la # فهرستیدن فایلها/پوشههای مسیر ریشه
خب، همین دستورها برای شروع کار کافیه. از درسگفتار بعدی چگونگی ساختن ایمیج سفارشی را شروع میکنم.