دستورهای پایه‌ای و چرخه‌ی حیات کانتینرها

چرخه‌ی حیات یک کانتینر (Container Lifecycle)

یک کانتینر از زمان ساخته شدن تا پاک شدن، وضعیت‌های مختلفی (States) را سپری می‌کند:

 1               ┌──────────────┐
 2               │   Created    │
 3               └──────┬───────┘
 4                      │ docker start
 5                      ▼
 6               ┌──────────────┐  docker pause   ┌──────────────┐
 7               │   Running    │ ──────────────► │    Paused    │
 8               └──────┬───────┘ ◄────────────── └──────────────┘
 9                      │         docker unpause
10       docker stop /  │
11       process exit   ▼
12               ┌──────────────┐
13               │ Stopped /    │
14               │   Exited     │
15               └──────┬───────┘
16                      │ docker rm
17                      ▼
18               ┌──────────────┐
19               │   Removed    │
20               └──────────────┘
  1. Created: کانتینر ساخته شده اما پردازش درون آن هنوز آغاز نشده است.
  2. Running: پردازش اصلی کانتینر (Process 1) در حال اجراست.
  3. Paused: پردازش‌های کانتینر با سیگنال‌های فریز سیستم‌عامل معلق شده‌اند.
  4. Stopped (Exited): پردازش کانتینر متوقف شده یا کارش به پایان رسیده است. در این حالت فایل‌ها هنوز روی دیسک باقی مانده‌اند.
  5. Removed: کانتینر و لایه‌ی خواندن/نوشتن موقت آن کاملاً از سیستم حذف شده‌اند.

دستور همه‌کاره‌ی docker run

دستور docker run در واقع ترکیب دو مرحله است: ابتدا کانتینر را می‌سازد (docker create) و سپس آن را اجرا می‌کند (docker start). اگر ایمیج در سیستم موجود نباشد، داکر ابتدا آن را از رجیستری دانلود می‌کند (docker pull).

Flag های حیاتی docker run:

  • -d (Detached): اجرای کانتینر در پس‌زمینه (مناسب وب‌سرورها و دیتابیس‌ها).
  • -it (Interactive + TTY): اتصال ورودی ترمینال به داخل کانتینر (مناسب ورود به شل).
  • --name <name>: اختصاص نام مشخص به کانتینر (به‌جای نام‌های تصادفی داکر).
  • --rm: حذف خودکار کانتینر به‌محض خروج یا توقف (بسیار مفید برای تست‌های موقت).
  • -p <host_port>:<container_port>: انتشار یا نگاشت پورت سرور میزبان به پورت داخل کانتینر.
  • -e <KEY>=<VALUE>: تنظیم متغیرهای محیطی برای پردازش داخل کانتینر.
  • --restart <policy>: سیاست راه‌اندازی مجدد در صورت کرش یا ریبوت سرور:
    • no: عدم اجرای مجدد خودکار (پیش‌فرض).
    • always: راه‌اندازی مجدد در هر شرایطی.
    • unless-stopped: راه‌اندازی مجدد خودکار، مگر اینکه کاربر صریحاً آن را متوقف کرده باشد.
    • on-failure: راه‌اندازی مجدد فقط در صورتی که پردازش با خطایی غیر از کد صفر خارج شود.

مثال ۱: اجرای یک وب‌سرور Nginx در پس‌زمینه

1docker run -d --name webserver -p 8080:80 nginx:alpine

حالا با زدن دستور زیر در سرور می‌توانید پاسخ وب‌سرور را ببینید:

1curl http://localhost:8080

مثال ۲: اجرای یک شل تعاملی موقت در Alpine Linux

1docker run --rm -it alpine:latest sh

پس از ورود به شل کانتینر می‌توانید مشخصات سیستم را بررسی کنید و با exit خارج شوید:

1/ # cat /etc/os-release
2/ # exit

به دلیل وجود flag --rm، پس از تایپ exit، کانتینر بلافاصله از سیستم پاک می‌شود و منابع دیسک آزاد می‌گردد.


مدیریت وضعیت کانتینرها

مشاهده‌ی لیست کانتینرها

کانتینرهای در حال اجرا را با دستور زیر مشاهده کنید:

1docker ps

برای مشاهده‌ی همه‌ی کانتینرها (شامل متوقف‌شده‌ها):

1docker ps -a

متوقف کردن و شروع مجدد

 1# ارسال سیگنال خروج نرم (SIGTERM) و پس از ۱۰ ثانیه بستن اجباری (SIGKILL)
 2docker stop webserver
 3
 4# شروع مجدد کانتینر متوقف‌شده
 5docker start webserver
 6
 7# ریستارت سریع کانتینر
 8docker restart webserver
 9
10# توقف آنی و بدون مهلت (ارسال فوری SIGKILL)
11docker kill webserver

حذف کانتینرها

کانتینری که در حال اجراست را نمی‌توان حذف کرد (مگر با فلگ -f). ابتدا باید متوقف شود:

1docker stop webserver
2docker rm webserver

دستورهای عملیاتی و اشکال‌زدایی (Debugging)

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

۱. مشاهده‌ی لاگ‌ها (docker logs)

دیدن خروجی استاندارد (stdout و stderr) پردازش‌های درون کانتینر:

1# مشاهده‌ی زنده و دنباله‌دار لاگ‌ها (Follow) همراه با نمایش ۵۰ خط آخر
2docker logs -f --tail 50 webserver

۲. ورود به داخل کانتینر در حال اجرا (docker exec)

دستور exec به شما اجازه می‌دهد پردازش جدیدی (مثل شل لینوکس) را داخل کانتینری که قبلاً اجرا شده راه‌اندازی کنید:

1docker exec -it webserver sh

درون کانتینر می‌توانید فایل‌های پیکربندی را ببینید یا اتصال شبکه را بررسی کنید. برای خروج کافیست exit بزنید (کانتینر اصلی خاموش نخواهد شد).

۳. بررسی جزئیات و متادیتا (docker inspect)

دیدن تمام تنظیمات، آدرس IP، مسیرهای Mount و وضعیت کانتینر با فرمت JSON:

1docker inspect webserver

می‌توانید با فیلتر --format اطلاعات خاصی مثل آدرس IP کانتینر را استخراج کنید:

1docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' webserver

۴. نظارت بر مصرف منابع (docker stats)

مشاهده‌ی مصرف لحظه‌ای رم، پردازنده، ورودی/خروجی شبکه و دیسک کانتینرها شبیه به ابزار top:

1docker stats

۵. کپی کردن فایل بین هاست و کانتینر (docker cp)

1# کپی فایل از هاست به کانتینر
2docker cp index.html webserver:/usr/share/nginx/html/index.html
3
4# کپی فایل لاگ از کانتینر به هاست
5docker cp webserver:/var/log/nginx/access.log ./nginx-access.log

پاک‌سازی فضای دیسک (docker system prune)

با گذشت زمان، کانتینرهای خاموش، ایمیج‌های قدیمی بدون نام (Dangling Images) و کش‌های بیلد دیسک سرور را پر می‌کنند. برای پاک‌سازی امن آن‌ها:

1docker system prune

اگر می‌خواهید تمام والیوم‌های بی‌استفاده و همه‌ی ایمیج‌های استفاده‌نشده نیز کاملاً پاک شوند (با احتیاط استفاده شود):

1docker system prune -a --volumes

منابع یادگیری

ویدیو

مستندات و مقالات

  • Docker Run Reference — راهنمای جامع جزئیات و پارامترهای اجرایی کانتینرها