آنچه در این مقاله میخوانید
- پیشنیازها
- راهاندازی یک کانتینر آزمایشی
- پیدا کردن نام یک کانتینر داکر
- دسترسی به شل(shell) تعاملی در کانتینر داکر
- اجرای دستور به صورت خودکار در کانتینر داکر
- اجرای دستورات در یک دایرکتوری جایگزین در کانتینر داکر
- اجرای دستورات به عنوان یک کاربر متفاوت در کانتینر داکر
- ارسال متغیرهای محیطی به کانتینر داکر
- خطاهای رایج و راهحلها
- جمعبندی
- سوالات متداول
نحوه استفاده از docker exec برای اجرای دستورات در کانتینر Docker
۲۵ بهمن ۱۴۰۴
داکر (Docker) یک ابزار قدرتمند و انعطافپذیر است که اجرای اپلیکیشنها را در محیطهای ایزوله شده و سبکوزن ممکن میسازد. برخلاف ماشینهای مجازی که نیاز به شبیهسازی کامل سیستمعامل دارند، داکر تنها از کرنل سیستمعامل میزبان استفاده میکند، و همین باعث میشود اجرای برنامهها، سریعتر، سبکتر و بسیار مقیاسپذیرتر باشد. با Docker میتوانید وابستگیها، تنظیمات و حتی فایلهای اجرایی را بهصورت یک پکیج قابل حمل مدیریت کنید؛ این به معنی استقرار سریعتر، خطاهای کمتر و در نهایت یک فرایند توسعه تا دیپلوی قابل اتکا، بدون اینکه درگیر کانفیگهای محیطی یا تفاوتهای بین سیستمها شوید.
چنانچه نیاز دارید مدیریت کانتینرها را بهینه کنید؛ بدون اینکه نیاز باشد کانتینر را متوقف کنید یا تنظیمات جدیدی اعمال کنید، این مطلب برای شما نوشته شده است. در این آموزش از سری آموزشهای داکر با دستور docker exec آشنا میشویم و یاد میگیریم چگونه از آن برای اجرای دستورات و دسترسی به شل (shell) داخل کانتینر داکر استفاده کنیم. تا پایان این آموزش همراه ما باشید:)

پیشنیازها
برای دنبال کردن این آموزش، ابتدا باید داکر را نصب کرده باشید و کاربر شما دسترسی لازم (sudo) برای اجرای دستورات داکر را داشته باشد. در صورتی که داکر را نصب نکردهاید، پیشنهاد میکنیم این مقاله را مطالعه کنید.
در ادامه بخوانید:
- راهاندازی یک کانتینر آزمایشی
- پیدا کردن نام یک کانتینر داکر
- اجرای پوسته تعاملی در کانتینر داکر
- اجرای یک دستور غیر تعاملی در کانتینر داکر
- اجرای دستورات در یک دایرکتوری جایگزین در کانتینر داکر
- اجرای دستورات به عنوان یک کاربر متفاوت در کانتینر داکر
- ارسال متغیرهای محیطی به کانتینر داکر
- خطاهای رایج و راهحلها
- جمعبندی
- سوالات متداول
همین حالا به سادگی پروژههای داکر خود را در هاست ابری لیارا دیپلوی کنید!
✅ دامنه رایگان ✅ ترافیک نامحدود ✅ هزینه ساعتی
خرید هاست ابری Docker
راهاندازی یک کانتینر آزمایشی
برای شروع و استفاده از دستور docker exec به یک کانتینر داکر، در حال اجرا نیاز داریم. اگر هنوز کانتینری راهاندازی نکردهاید، میتوانید با استفاده از دستور docker run یک کانتینر آزمایشی راهاندازی کنید:
docker run -d --name container-name alpine watch "date >> /var/log/date.log"
دستور بالا، یک کانتینر جدید از ایمیج رسمی Alpine ایجاد میکند، که یکی از معروفترین و سبکترین توزیعهای لینوکس به حساب میآید. با نصب از این ایمیج، کانتینر شما به حداقل منابع نیاز داشته و در عین حال، عملکرد فوقالعادهای خواهد داشت.
خروجی دستور بالا بهصورت زیر میباشد:
Fri Jul 23 14:57:05 UTC 2021
قسمت >> /var/log/date.log در کد بالا، خروجی دستور date را به فایل /var/log/date.log هدایت کرده و هر دو ثانیه یک بار به انتهای آن اضافه میکند:
OutputFri Jul 23 15:00:26 UTC 2021
Fri Jul 23 15:00:28 UTC 2021
Fri Jul 23 15:00:30 UTC 2021
Fri Jul 23 15:00:32 UTC 2021
Fri Jul 23 15:00:34 UTC 2021
تا اینجا، یک کانتینر جدید از ایمیج Alpine ایجاد و با دستور docker run آن را در پسزمینه اجرا کردیم. دستور watch "date >> /var/log/date.log" باعث میشود که تاریخ و زمان جاری هر دو ثانیه یکبار به فایل /var/log/date.log اضافه شود.
در بخش بعد، یاد میگیریم چگونه نام کانتینرهای داکر را پیدا کنیم. این کار زمانی مفید است که یک کانتینر دارید و میخواهید به آن دسترسی پیدا کنید، اما از نام آن مطمئن نیستید:(
آموزش کامل نصب داکر روی اوبونتو 22.04 را در مقاله زیر مطالعه کنید.
نصب داکر روی اوبونتو
پیدا کردن نام یک کانتینر داکر
برای اجرای دستور docker exec، باید نام یا شناسه کانتینر را مشخص کنیم. برای پیدا کردن این اطلاعات، از دستور docker ps استفاده کنید:
docker ps
دستور فوق، لیستی از تمام کانتینرهای در حال اجرا روی سرور را نشان میدهد، و اطلاعات کلی از آنها میدهد:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76aded7112d4 alpine "watch 'date >> /var…" 11 seconds ago Up 10 seconds container-name
در این مثال از آموزش لیارا، شناسه کانتینر و نام آن هایلایت شده است. میتوانید از هر کدام برای مشخص کردن کانتینری که میخواهید از دستور docker exec استفاده کنید. اگر بخواهید نام کانتینر خود را تغییر دهید، دستور docker rename را اجرا کنید:
docker rename container-name new-name
در ادامه آموزش، چندین مثال از استفاده دستور docker exec برای اجرای دستورات در یک کانتینر داکر را بررسی خواهیم کرد.
برای آشنایی با کوبرنتیز (Kubernetes) و چگونگی کارکرد آن، مقاله زیر را میتوانید مطالعه کنید.
کوبرنتیز(Kubernetes) چیست؟
دسترسی به شل(shell) تعاملی در کانتینر داکر
برای دسترسی به شل تعاملی داخل یک کانتینر داکر، مثلا جستجو در سیستم فایل یا دیباگ کردن پروسههای در حال اجرا، از دستور docker exec با فلگهای -i و -t استفاده کنید.
فلگ -i ورودی را برای کانتینر باز نگه میدارد و فلگ -t یک ترمینال مجازی ایجاد میکند که شل میتواند به آن وصل شود. این فلگها میتوانند به صورت ترکیبی به این شکل استفاده شوند:
docker exec -it container-name sh
دستور فوق، شل sh را در کانتینر مشخصشده اجرا میکند و یک پرامپت شل پایه برای شما آماده میکند. برای خروج از کانتینر، حالا کافی است دستور exit را تایپ کنید و ENTER را بزنید:
exit
اگر ایمیج کانتینر شما شامل شل پیشرفتهتری مانند bash باشد، بهجای sh از bash استفاده کنید.
اجرای دستور به صورت خودکار در کانتینر داکر
در این بخش اگر فقط میخواهید یک دستور ساده را داخل کانتینر داکر اجرا کنید و نیازی به دسترسی تعاملی یا محیط شبیه ترمینال ندارید، خیلی راحت میتوانید از دستور docker exec بدون هیچ فلگی استفاده کنید.
این روش بیشتر برای مواقعی است که بخواهید یک اسکریپت، یک دستور سریع را اجرا کنید یا یک بررسی ساده را بدون وارد شدن به محیط کانتینر انجام دهید.
دستور زیر یک نمونه از اجرای دستور بهصورت خودکار داخل کانتینر داکر میباشد:
docker exec container-name tail /var/log/date.log
دستور فوق، tail /var/log/date.log را داخل کانتینری به اسم container-name اجرا میکند و خروجی آن بهصورت زیر خواهد بود:
OutputMon Jul 26 14:39:33 UTC 2021
Mon Jul 26 14:39:35 UTC 2021
Mon Jul 26 14:39:37 UTC 2021
Mon Jul 26 14:39:39 UTC 2021
Mon Jul 26 14:39:41 UTC 2021
Mon Jul 26 14:39:43 UTC 2021
Mon Jul 26 14:39:45 UTC 2021
Mon Jul 26 14:39:47 UTC 2021
Mon Jul 26 14:39:49 UTC 2021
Mon Jul 26 14:39:51 UTC 2021
اجرای دستورات در یک دایرکتوری جایگزین در کانتینر داکر
اگر بخواهید یک دستور را در یک مسیر مشخص داخل کانتینر اجرا کنید، میتوانید از فلگ --workdir در دستور docker exec استفاده کنید. این فلگ مسیر کاری (working directory) را تعیین میکند؛ یعنی قبل از اجرای دستور، داکر وارد آن مسیر میشود.
برای مثال:
docker exec --workdir /tmp container-name pwd
در این مثال، مسیر، روی /tmp تنظیم شده و پس از آن دستور pwd اجرا میشود. خروجی این دستور، مسیر فعلی داخل کانتینر را نمایش میدهد.
به عبارتی، با این کار بهصورت مستقیم به یک مسیر خاص درون کانتینر میروید و دستور مدنظرتان را همانجا اجرا میکنید:
Output/tmp
در خروجی بالا، دستور pwd تأیید میکند که دایرکتوری فعلی /tmp میباشد.
برای آسنایی با نحوه کار کانتینرهای داکر (ساخت + مدیریت و حذف کانتینرها)، مقاله زیر را مطالعه کنید.
آموزش کار با کانتینرهای داکر
اجرای دستورات به عنوان یک کاربر متفاوت در کانتینر داکر
برای اجرای دستور با کاربری متفاوت در داخل کانتینر، باید از --user استفاده کنید:
docker exec --user guest container-name whoami
این دستور، همانطور که میبینید از کاربر مهمان برای اجرای whoami در کانتینر استفاده میکند. whoami نام کاربری کاربر جاری را چاپ میکند:
Outputguest
در خروجی، دستور whoami تأیید میکند که کاربر جاری کانتینر، کاربر مهمان (guest) است.
ارسال متغیرهای محیطی به کانتینر داکر
گاهی اوقات نیاز دارید تا متغیرهای محیطی را همراه با دستور اجرایی به داخل کانتینر منتقل کنید. با فلگ -e میتوانید یک متغیر محیطی را وارد کانتینر کرده تا هنگام اجرای دستورات یا برنامهها، بهآنها دسترسی داشته باشید.
برای مثال:
docker exec -e TEST=sammy container-name env
دستور بالا، متغیر محیطی TEST را روی مقدار sammy تنظیم میکند و پس از آن دستور env را داخل کانتینر اجرا میکند. دستور env، تمام متغیرهای محیطی موجود را نمایش میدهد:
OutputPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
HOME=/root
متغیر TEST روی مقدار sammy تنظیم شد.
برای پیکربندی چندین متغیر محیطی، کافیست فلگ -e را برای هرکدام تکرار کنید:
docker exec -e TEST=sammy -e ENVIRONMENT=prod container-name env
حالا اگر بخواهید، مجموعهای از متغیرهای محیطی را با یک فایل وارد کنید، فلگ --env-file را بهکار ببرید.
برای اینکار، ابتدا فایل را با ویرایشگر متن مانند nano یا هر ویرایشگر متن دیگری ایجاد کنید:
nano .env
پس از ایجاد فایل، هر متغیر محیطی را به صورت KEY=value و هر کدام را در یک خط جداگانه بنویسید:
TEST=sammy
ENVIRONMENT=prod
بعد از نوشتن متغیرها، فایل را ذخیره کرده و از آن خارج شوید.
در نهایت، برای اجرای دستور docker exec و استفاده از فایل محیطی، دستور زیر را اجرا کنید:
نکته: فراموش نکنید که باید نام فایل را بعد از env-file-- مشخص کنید.
docker exec --env-file .env container-name env
OutputPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
ENVIRONMENT=prod
HOME=/root
در آخر، دو متغیر در فایل تنظیم شدند.
اگر نیاز داشتید، میتوانید با چندین فلگ --env-file، چندین فایل را مشخص کنید. اگر متغیرها در این فایلها با هم تداخل داشته باشند، فایل آخری که در دستور آورده شده، فایلهای قبلی را بازنویسی میکند.
آموزش نصب و استفاده از داکر کامپوز (Docker Compose) در اوبونتو را از دست ندهید.
نصب داکر کامپوز
خطاهای رایج و راهحلها
پس از اینکه با دستور docker exec آشنا شدید و کاربردهای مختلفش را بررسی کردید، ممکن است در حین استفاده با برخی خطاهای رایج مواجه شوید. در این بخش چند خطای معمولی و راهحلهای پیشنهادی برای رفع آنها را آوردهایم.
خطای Container not found
Error: No such container: container-name
خطای Container not found زمانی رخ میدهد که نام یا شناسه کانتنیر اشتباه وارد شده یا کانتینر مورد نظر در حال اجرا نیست. برای رفع این مشکل باید بررسی کنید که کانتینر در حال اجرا باشد، برای اینکار از دستور docker ps استفاده کنید تا لیست کانتینرهای درحال اجرا را مشاهده کنید. اگر کانتینر متوقف شده باشد، با دستور docker start <container-name> آنرا دوباره راهاندازی کنید.
خطای Permission denied
Error response from daemon: Permission denied
خطای Permission denied معمولا زمانی اتفاق میافتد که کاربری که دستور docker exec را اجرا میکند، اجازه دسترسی به کانتینر را ندارد. برای رفع این خطا، مطمئن شوید که که کاربر دسترسیهای کافی برای انجام عملیات را داشته باشد. اگر دسترسیها کافی نیست، دستور docker exec را با sudo به صورت زیر اجرا کنید:
sudo docker exec -it container-name command
خطای Container is not running
Error response from daemon: Container 2a94aae70ea5dc92a12e30b13d0613dd6ca5919174d73e62e29cb0f79db6e4ab is not running
این پیغام نشان میدهد که کانتینر مشخص شده، وجود دارد اما الان در حال اجرا نیست. برای رفع این خطا، کانتینر را دوباره با دستور docker start راهاندازی کرده و نام کانتینر را وارد کنید:
docker start container-name
پس از اینکه کانتینر را راهاندازی کردید، حال میتوانید دستورات داخل آن را با دستور docker exec اجرا کنید.
خطای Container is paused
Error response from daemon: Container container-name is paused, unpause the container before exec
خطای Container is paused به این معنی است که کانتینر مشخص شده در حال حاضر در وضعیت معلق (paused) قرار دارد. یعنی کانتینر نه در حال اجرا است و نه متوقف شده. برای اجرای دستورات داخل کانتینر باید آن را با دستور docker unpause container-name از حالت معلق خارج کنید.
راهحلها
چند نکته مهم برای اینکه موقع استفاده از دستور docker exec به خطا برنخورید:
- اول از همه مطمئن شوید که نام کانتینر را درست وارد کردهاید و آن کانتینر واقعا در حال اجرا است. گاهی اوقات جا افتادن یک حرف از اسم کانتینر، باعث میشود دستور اجرا نشود.
- اگر با خطای Permission مواجه شدید، بررسی کنید که با کاربر مناسبی، دستور را اجرا میکنید. اگر نیاز بود از
sudoاستفاده کنید. - حواستان باشد کانتینر در حالت Paused نباشد. زیرا در این وضعیت نه اجرا میشود و نه stop است.
- در نهایت، مطمئن شوید که دستور
docker execرا بهصورت صحیح نوشتهاید. بیشتر خطاها ناشی از یک اشتباه تایپی یا ترتیب نادرست پارامترها است.
آموزش گام به گام راه اندازی رجیستری خصوصی داکر در اوبونتو را در مقاله زیر بخوانید.
راه اندازی رجیستری خصوصی داکر
چطور از docker exec استفاده کنیم که سرعت کانتینر کم نشود؟
وقتی با docker exec دستورات سنگین اجرا میکنید، بهتر است بدانید که این بر عملکرد کلی کانتینر شما تاثیر منفی میگذارد. چند نکته مهم برای رفع این مشکل وجود دارد، در ادامه بررسی میکنیم:
- زمانی که یک دستور زمانبر داخل کانتینر اجرا میکنید، بهتر است از فلگ
--detachاستفاده کنید. با این کار، دستور بهصورت بکگراند اجرا میشود و ترمینال هم برای اجرای دستورات دیگر، آزاد میماند. برای مثال:
docker exec --cpu-shares 512 --memory 512m container-name command
- چنانچه نمیخواهید یک دستور داخل کانتینر کل منابع CPU یا RAM را درگیر کند و روی عملکرد دیگر سرویسهایتان تاثیر بگذارد، حتما از فلگهای
--cpu-sharesو--memoryاستفاده کنید. با اینکار، تعیین میکنید که این دستور چه مقدار میتواند از منابع را بکار گیرد. بطور مثال:
docker exec --cpu-shares 512 --memory 512m container-name command
- دستوراتی که با
docker execاجرا میکنید، اگر سنگین یا پیچیده باشند، بهتر است آنها بهینه کنید تا فشار زیادی به کانتینر وارد نشود. بهطور مثال:
docker exec container-name optimized-command
- اگر در حال اجرای یک تسک سنگین هستید که به منابع زیادی نیاز دارد، بهترین کار این است که آن وظیفه را از کانتینر اصلی جدا کرده و در یک کانتینر مستقل دیگر اجرا کنید. مثلا:
docker run --name heavy-task-container heavy-task-image
- عملکرد کانتینر خود را زیر نظر داشته باشید تا اگر مصرف منابع آن زیاد شد یا گلوگاهی پیش آمد، سریعا بتوانید آن را پیدا کرده و بهینهاش کنید. سادهترین روش استفاده از ابزار داخلی داکر یعنی
docker statsمیباشد. دستور زیر یک داشبورد زنده از مصرف CPU، RAM و دیسک کانتینرها را نشان میدهد.
docker stats container-name
- از اجرای دستورات غیرضروری خودداری کنید؛ دستورات اضافی یا تکراری که باعث کند شدن کانتینر شود، پرهیز کنید. به طور مثال:
docker exec container-name necessary-command
- از ویژگیهای بهینهسازی عملکرد داخلی Docker استفاده کنید؛ docker ویژگیهایی مانند
--oom-kill-disableرا ارائه میدهد که از توقف ناخواسته کانتینر به دلیل خطاهای کموبد حافظه جلوگیری میکند. از این ویژگیها برای بهینهسازی عملکرد کانتینر خود استفاده کنید. برای مثال:
docker run --oom-kill-disable container-name
با دنبال کردن این نکات، میتوانید مطمئن شوید که اجرای دستورات سنگین با استفاده از دستور docker exec، تاثیر قابل توجهی روی عملکرد کانتینر شما نگذارد.
جمعبندی
در این مقاله از لیارا، به بررسی نکاتی پرداختیم که میتواند به شما کمک کند تا با استفاده از دستور docker exec، دستورات و وظایف مختلف را در داخل کانتینر اجرا کنید. فراموش نکنید که docker ابزاری قدرتمند برای مدیریت کانتینرهاست و با رعایت اصولی که در این مطلب به آنها اشاره شد، میتوانید تجربه بهتری در استفاده از داکر داشته باشید. همینطور با مانیتورینگ دائمی و بهینهسازی منابع، میتوانید از حداکثر پتانسیل کانتینرها استفاده کنید.
برای آشنایی کامل با داکر، مزایا و کاربردهای آن، مقاله زیر را میتوانید مطالعه کنید.
داکر چیست؟
سوالات متداول
دستور docker exec، چیست؟
دستور docker exec یک دستور در Docker است که به شما امکان میدهد دستوری را داخل یک کانتینر در حال اجرا اجرا کنید. این دستور راهی برای اجرای دستورات در کانتینری است که قبلاً راهاندازی شده و در حال اجرا است، بدون اینکه نیازی به راهاندازی یک کانتینر جدید داشته باشید. این ویژگی بهویژه برای دیباگ کردن، بررسی وضعیت یا تغییر وضعیت یک کانتینر در حال اجرا مفید است.
برای مثال، برای اجرای یک دستور ساده ls در داخل یک کانتینر در حال اجرا، میتوانید از دستور زیر استفاده کنید:
docker exec <container-name> ls
چطور میتوانم به شل یک کانتینر در حال اجرا با استفاده از دستور docker exec دسترسی پیدا کنم؟
برای دسترسی به شل یک کانتینر در حال اجرا با استفاده از دستور docker exec، میتوانید از فلگهای -it استفاده کنید. فلگ -i به شما اجازه میدهد با کانتینر تعامل داشته باشید و فلگ -t یک ترمینال مجازی به کانتینر اختصاص میدهد. این کار به شما امکان میدهد تا دقیقا مثل زمانی که روبروی کانتینر نشستهاید با آن ارتباط برقرار کنید.
برای مثال، برای دسترسی به شل کانتینر میتوانید از دستور زیر استفاده کنید:
docker exec -it <container-name> bash
آیا میتوانم دستورات را به عنوان یک کاربر خاص داخل کانتینر داکر اجرا کنم؟
بله، میتوانید دستورات را به عنوان یک کاربر خاص داخل کانتینر داکر با استفاده از پرچم –user اجرا کنید. این پرچم به شما این امکان را میدهد که شناسه کاربری یا نام کاربری را برای اجرای دستور مشخص کنید.
برای مثال، برای اجرای یک دستور به عنوان کاربر روت داخل کانتینر، میتوانید از دستور زیر استفاده کنید:
docker exec --user root <container-name> command
چطور میتوانم چندین دستور را داخل یک کانتینر با استفاده از دستور docker exec اجرا کنم؟
برای اجرای چندین دستور داخل یک کانتینر با استفاده از دستور docker exec، میتوانید از فلگ -c استفاده کرده و دستورات مورد نظر خود را بعد از آن بنویسید. دستورات باید با علامت سمیکالن از هم جدا شوند.
در اینجا یک مثال از نحوه اجرای چندین دستور داخل یک کانتینر آورده شده است:
docker exec <container-name> -c "command1; command2; command3"
این دستور دستورات command1، command2 و command3 را بهصورت متوالی داخل کانتینر اجرا میکند.
اگر دستور docker exec کار نکرد، باید چه کار کنم؟
اگر دستور docker exec طبق انتظارتان عمل نکرد، چند نکته وجود دارد که میتوانید برای عیبیابی امتحان کنید:
- وضعیت کانتینر را بررسی کنید: مطمئن شوید که کانتینر در حال اجراست. برای این کار از دستور
docker psاستفاده کنید. اگر کانتینر در حال اجرا نیست، آن را با دستورdocker startراهاندازی کنید. - نام کانتینر را بررسی کنید: مطمئن شوید که از نام یا شناسه صحیح کانتینر استفاده میکنید. میتوانید با دستور
docker psهمه کانتینرهای در حال اجرا را لیست کنید و نام درست را بررسی کنید. - سینتکس دستور را چک کنید: اطمینان حاصل کنید که دستوری که قصد اجرای آن را دارید، به درستی فرمت شده است.
- تنظیمات کانتینر را بررسی کنید: اگر دارید دستوری را اجرا میکنید که نیاز به دسترسی خاص یا مجوزهای ویژه دارد، مطمئن شوید که کانتینر به درستی تنظیم شده تا آن دسترسی را بدهد.
- نسخه Docker را چک کنید: مطمئن شوید که از نسخهای از Docker استفاده میکنید که با سیستم شما سازگار است. برای این کار میتوانید از دستور
docker --versionاستفاده کنید.