آموزش سرور

دستورات پرکاربرد داکر؛ مرجع عملی مدیریت کانتینر، ایمیج و Volume

تهیه: کلودیفای (نگارش با کمک هوش مصنوعی) · انتشار: · زمان مطالعه: ۸ دقیقه

Volumeآموزش سروردستورات پرکاربرد داکر؛مرجع عملی مدیریتکانتینر، ایمیج و Volumeمجلهٔ کلودیفایclodify.net/blog
پاسخ کوتاه

برای کار روزمره با داکر چند دستور کافی است: docker run برای ساخت و اجرای کانتینر، docker ps برای فهرست، docker logs و docker exec برای عیب‌یابی، docker stop و docker rm برای توقف و حذف، docker images و docker pull برای ایمیج‌ها، docker volume برای داده‌های ماندگار و docker system df و prune برای مدیریت فضا. همیشه برای کانتینرها نام بگذارید، داده‌ها را در Volume نگه دارید و پیش از prune بدانید چه چیزی پاک می‌شود.

پیش از شروع

این مقاله مرجع عملی دستورهایی است که هنگام مدیریت داکر روی سرور هر روز به آن‌ها نیاز دارید. فرض بر این است که داکر نصب شده است؛ اگر نه، آموزش نصب داکر روی اوبونتو ۲۴.۰۴ را دنبال کنید. اگر با مفاهیم ایمیج و کانتینر آشنا نیستید، ابتدا داکر چیست را بخوانید.

برای اجرای دستورها بدون sudo، کاربر خود را به گروه docker اضافه کنید و یک بار خارج و دوباره وارد شوید. توجه کنید که عضویت در این گروه عملاً معادل دسترسی root است؛ فقط به کاربران مورد اعتماد بدهید.

sudo usermod -aG docker $USER
چرخهٔ عمر یک کانتینر
ساخت و اجراتوقفپاک کردنایمیجdocker pullکانتینر در حال اجراdocker runمتوقفdocker stopحذفdocker rmساخت و اجراتوقفپاک کردنایمیجdocker pullکانتینر در حال اجراdocker runمتوقفdocker stopحذفdocker rm
شکل ۱ ایمیج قالب است و کانتینر نمونهٔ اجرایی آن؛ Volumeها حتی پس از حذف کانتینر باقی می‌مانند.

اجرای کانتینر با docker run

مهم‌ترین و پرگزینه‌ترین دستور داکر docker run است که در صورت نبود ایمیج، آن را دانلود می‌کند، کانتینر را می‌سازد و اجرا می‌کند:

docker run -d --name web -p 8080:80 --restart unless-stopped nginx:1.27

گزینه‌های پرکاربرد:

گزینه کاربرد
-d اجرا در پس‌زمینه
--name نام ثابت برای کانتینر (به‌جای نام تصادفی)
-p host:container انتشار پورت؛ با 127.0.0.1: فقط محلی
-v اتصال Volume یا پوشهٔ میزبان
-e KEY=value متغیر محیطی
--env-file خواندن متغیرها از فایل
--restart سیاست اجرای دوباره پس از خطا یا ری‌استارت سرور
--rm حذف خودکار کانتینر پس از پایان (برای کارهای یک‌باره)
-it حالت تعاملی با ترمینال

همیشه برای کانتینرهای دائمی --name بگذارید؛ مدیریت کانتینری به نام web بسیار راحت‌تر از شناسه‌ای تصادفی است. و برچسب نسخه را مشخص کنید (nginx:1.27 به‌جای nginx) تا با اجرای دوباره، نسخهٔ ناخواسته‌ای جایگزین نشود.

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

docker ps                 # کانتینرهای در حال اجرا
docker ps -a              # همه، از جمله متوقف‌شده‌ها
docker inspect web        # همهٔ جزئیات کانتینر به‌صورت JSON
docker port web           # پورت‌های منتشرشده
docker stats              # مصرف زندهٔ CPU، رم و شبکه

docker stats برای پیدا کردن کانتینر پرمصرف بسیار مفید است و مشابه top اما برای کانتینرهاست. با --no-stream فقط یک بار خروجی می‌دهد.

لاگ و ورود به کانتینر

دو ابزار اصلی عیب‌یابی:

docker logs web                 # کل لاگ
docker logs -f --tail 100 web   # صد خط آخر و دنبال کردن زنده
docker logs --since 30m web     # سی دقیقهٔ اخیر

docker exec -it web sh          # ورود به شل داخل کانتینر
docker exec web nginx -t        # اجرای یک دستور بدون ورود

بسیاری از ایمیج‌های سبک bash ندارند؛ اگر bash خطا داد از sh استفاده کنید. تغییراتی که با exec داخل کانتینر می‌دهید با حذف کانتینر از بین می‌رود؛ تغییر دائمی باید در ایمیج یا Volume انجام شود.

root@server: ~
$ docker psCONTAINER ID  IMAGE  ...  STATUS        PORTS                  NAMES...           ...    ...  Up ... hours  0.0.0.0:8080->80/tcp   web...           ...    ...  Up ... hours  5432/tcp               db$ docker logs --tail 2 web... "GET / HTTP/1.1" 200 ...$ docker stats --no-streamNAME  CPU %  MEM USAGE / LIMIT  NET I/O$ 
شکل ۲ ps وضعیت و پورت‌ها، logs آخرین رویدادها و stats مصرف منابع هر کانتینر را نشان می‌دهد.

توقف، ری‌استارت و حذف

docker stop web        # توقف مؤدبانه (سیگنال SIGTERM، سپس SIGKILL)
docker start web       # اجرای دوبارهٔ کانتینر متوقف‌شده
docker restart web
docker rm web          # حذف کانتینر متوقف‌شده
docker rm -f web       # توقف و حذف یک‌جا

حذف کانتینر، Volumeهای نام‌دار متصل به آن را پاک نمی‌کند؛ داده‌های ماندگار سر جایشان می‌مانند و کانتینر جدید می‌تواند دوباره به آن‌ها وصل شود.

مدیریت ایمیج‌ها

docker images                  # فهرست ایمیج‌های محلی
docker pull redis:7            # دانلود یا به‌روزرسانی ایمیج
docker rmi redis:6             # حذف ایمیج
docker build -t myapp:1.0 .    # ساخت ایمیج از Dockerfile
docker tag myapp:1.0 registry.example.com/myapp:1.0
docker push registry.example.com/myapp:1.0

برای به‌روزرسانی کانتینری که با docker run ساخته‌اید: ایمیج جدید را pull کنید، کانتینر قدیمی را حذف کنید و با همان گزینه‌ها دوباره بسازید. چون یادآوری همهٔ گزینه‌ها سخت است، برای سرویس‌های دائمی Docker Compose را به کار ببرید که همهٔ تنظیمات را در فایل نگه می‌دارد.

اگر روی سرور ایران docker pull با خطای ۴۰۳ یا timeout متوقف می‌شود، راه‌حل‌ها در رفع خطای ۴۰۳ داکر و apt در ایران آمده است.

سیاست‌های اجرای دوباره (Restart Policy)

گزینهٔ --restart تعیین می‌کند داکر وقتی کانتینر متوقف شد یا سرور ری‌استارت شد چه کند. انتخاب درست آن تفاوت بین سرویسی که پس از قطعی برق خودش برمی‌گردد و سرویسی که تا صبح خاموش می‌ماند است:

  • no: پیش‌فرض؛ هیچ اجرای دوباره‌ای انجام نمی‌شود. برای کارهای یک‌باره مناسب است.
  • on-failure: فقط اگر کانتینر با کد خطا خارج شود دوباره اجرا می‌شود. می‌توانید سقف تلاش هم بگذارید، مثل on-failure:5.
  • unless-stopped: همیشه دوباره اجرا می‌شود، مگر اینکه خودتان دستی متوقفش کرده باشید. برای بیشتر سرویس‌های دائمی بهترین انتخاب است.
  • always: حتی کانتینری که دستی متوقف کرده‌اید، پس از ری‌استارت سرویس داکر دوباره اجرا می‌شود.

کپی فایل بین سرور و کانتینر

گاهی لازم است فایلی را از کانتینر بیرون بیاورید (مثلاً یک فایل لاگ یا خروجی) یا فایلی را موقتاً داخلش بگذارید. دستور docker cp این کار را بدون نیاز به Volume انجام می‌دهد؛ مثلاً docker cp web:/etc/nginx/nginx.conf ./nginx.conf فایل را از کانتینر به پوشهٔ جاری می‌آورد و جهت برعکس هم با جابه‌جا کردن مبدأ و مقصد کار می‌کند. یادتان باشد فایلی که این‌طور داخل کانتینر می‌گذارید، با ساختن دوبارهٔ کانتینر از بین می‌رود؛ برای تغییر دائمی، آن را در ایمیج یا Bind Mount قرار دهید.

خواندن کد خروج کانتینرهای متوقف

در خروجی docker ps -a، ستون STATUS برای کانتینرهای متوقف عبارتی مثل Exited (1) دارد. این عدد سرنخ خوبی است: صفر یعنی برنامه به‌طور عادی تمام شده، یک یا اعداد کوچک معمولاً خطای خود برنامه است و ۱۳۷ یعنی فرایند با سیگنال KILL بسته شده که اغلب نشانهٔ کمبود رم یا اجرای دستور kill است. ۱۴۳ هم یعنی برنامه با SIGTERM و به‌طور مرتب متوقف شده است.

Volume و دادهٔ ماندگار

docker volume create pgdata
docker run -d --name db -v pgdata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=secret postgres:16
docker volume ls
docker volume inspect pgdata

دو روش نگه داشتن داده وجود دارد: Volume نام‌دار (مثل pgdata) که داکر مدیریتش می‌کند و برای دیتابیس‌ها توصیه می‌شود، و Bind Mount (مثل -v /opt/site:/usr/share/nginx/html) که یک پوشهٔ مشخص سرور را به کانتینر وصل می‌کند و برای فایل‌های پیکربندی یا محتوایی که می‌خواهید مستقیم ویرایش کنید مناسب است.

شبکه

docker network create appnet
docker run -d --name api --network appnet myapp:1.0
docker run -d --name cache --network appnet redis:7
docker network ls

کانتینرهای داخل یک شبکهٔ سفارشی، یکدیگر را با نام پیدا می‌کنند؛ برنامهٔ api می‌تواند به آدرس cache:6379 وصل شود، بدون اینکه پورت Redis روی سرور منتشر شود. این روش امن‌تر از انتشار پورت سرویس‌های داخلی است.

مدیریت فضای دیسک و پاک‌سازی

داکر به‌مرور ایمیج‌های قدیمی، کانتینرهای متوقف و کش ساخت را جمع می‌کند:

docker system df                 # چه چیزی چقدر فضا گرفته
docker container prune           # حذف کانتینرهای متوقف
docker image prune               # حذف ایمیج‌های بدون برچسب
docker image prune -a            # حذف همهٔ ایمیج‌های بی‌کانتینر
docker builder prune             # کش ساخت

دربارهٔ docker volume prune و docker system prune --volumes بسیار محتاط باشید؛ Volumeی که کانتینرش موقتاً حذف شده، از نظر داکر «بلااستفاده» است و پاک می‌شود. پیش از هر prune حجمی، فهرست را ببینید. اگر دیسک سرور پر شده، روند کامل را در رفع خطای No space left on device دنبال کنید.

Volume نام‌دار یا Bind Mount؟
Volume نام‌دار
  • داکر محل ذخیره را مدیریت می‌کند
  • مناسب دیتابیس‌ها
  • مستقل از ساختار پوشه‌های سرور
  • بکاپ با ابزار داکر یا دیتابیس
در برابر
Bind Mount
  • یک پوشهٔ مشخص سرور
  • مناسب فایل تنظیمات و محتوا
  • ویرایش مستقیم از سرور
  • حساس به مجوز و مالکیت فایل‌ها
شکل ۳ برای داده‌های دیتابیس Volume و برای فایل‌هایی که خودتان ویرایش می‌کنید Bind Mount مناسب‌تر است.

جدول خلاصه برای مراجعهٔ سریع

کار دستور
اجرای کانتینر docker run -d --name NAME IMAGE
فهرست docker ps -a
لاگ docker logs -f NAME
ورود docker exec -it NAME sh
توقف و حذف docker rm -f NAME
مصرف منابع docker stats
فضا docker system df

نکته‌های امنیتی هنگام کار روزمره

  • پورت‌های منتشرشده با -p ممکن است فایروال UFW را دور بزنند؛ سرویس‌های داخلی را روی 127.0.0.1 منتشر کنید. توضیح در آموزش فایروال UFW.
  • رمزها را در فرمان docker run تایپ نکنید؛ در تاریخچهٔ شل و خروجی inspect باقی می‌مانند. از --env-file با فایل محافظت‌شده استفاده کنید.
  • فقط ایمیج‌های رسمی یا از منابع معتبر را اجرا کنید.

دستورهای عمومی لینوکس که در کنار داکر به کارتان می‌آید را در دستورات پرکاربرد لینوکس برای سرور ببینید. برای تمرین این دستورها هم می‌توانید یک سرور ساعتی در کلودیفای بسازید و پس از پایان حذفش کنید.

سؤالات متداول

تفاوت docker stop و docker kill چیست؟

stop ابتدا سیگنال SIGTERM می‌فرستد تا برنامه فرصت داشته باشد کارش را مرتب تمام کند و اگر در زمان مقرر بسته نشد، SIGKILL می‌فرستد. kill بلافاصله SIGKILL می‌فرستد و ممکن است باعث از دست رفتن داده‌های در حال نوشتن شود.

چطور بفهمم کانتینر چرا متوقف شده است؟

با docker ps -a کد خروج را ببینید و با docker logs نام‌کانتینر آخرین پیام‌ها را بخوانید. کد ۱۳۷ معمولاً یعنی کانتینر kill شده که اغلب به‌خاطر کمبود رم است.

آیا docker rm داده‌های کانتینر را پاک می‌کند؟

داده‌های داخل لایهٔ قابل‌نوشتن کانتینر پاک می‌شوند، اما Volumeهای نام‌دار و پوشه‌های میزبان متصل‌شده باقی می‌مانند. به همین دلیل دادهٔ مهم را همیشه در Volume نگه دارید.

چطور کانتینری را بعد از ری‌استارت سرور خودکار اجرا کنم؟

هنگام ساخت از --restart unless-stopped یا always استفاده کنید و مطمئن شوید سرویس داکر با systemctl enable docker فعال است. برای کانتینر موجود هم می‌توانید با docker update --restart unless-stopped سیاست را تغییر دهید.

آماده‌اید؟ سرورتان را بسازید.

از ۱٬۲۰۰ تومان در ساعت · پرداخت ریالی

سرورتان را همین حالا بسازید.

ساعتی بپردازید. هر وقت خواستید حذف کنید.