محمد علی امینی
محمد علی امینی
خواندن ۸ دقیقه·۳ سال پیش

خودآموز داکر: درس ۰۴ - اداریدن کانتینرها

در این درسگفتار می‌آموزی چگونه با استفاده [استفادن] از ایمیج‌های همگانی موجود در 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 &quotping google.com&quot 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 &quotping google.com&quot 15 seconds ago Exited (137) 12 seconds ago admiring_robinson b7750bc279e1 alpine &quotsh&quot 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 # فهرستیدن فایل‌ها/پوشه‌های مسیر ریشه

خب، همین دستورها برای شروع کار کافیه. از درسگفتار بعدی چگونگی ساختن ایمیج سفارشی را شروع می‌کنم.

داکر
توسعه‌دهنده سایت با چارچوب جنگو
شاید از این پست‌ها خوشتان بیاید