مقدمه
Docker یک ابزار کانتینریسازی است که به توسعهدهندگان کمک میکند تا کانتینرهای قابل حمل و سازگار لینوکس را ایجاد و مدیریت کنند.
هنگام توسعه یا استقرار کانتینرها، اغلب باید به داخل یک کانتینر در حال اجرا نگاه کنید تا وضعیت فعلی آن را بررسی کنید یا مشکلی را رفع کنید. برای این منظور، Docker دستور docker exec را برای اجرای برنامهها در کانتینرهای در حال اجرا ارائه میکند.
در این آموزش با دستور docker exec و نحوه استفاده از آن برای اجرای دستورات و دریافت یک پوسته تعاملی در یک ظرف داکر آشنا خواهیم شد.
پیش نیازها
این آموزش فرض می کند که شما قبلاً Docker را نصب کرده اید و کاربر شما اجازه اجرای docker را دارد. اگر نیاز به اجرای docker به عنوان کاربر اصلی دارید، لطفاً به یاد داشته باشید که sudo را به دستورات این آموزش اضافه کنید.
راه اندازی کانتاینر تست
برای استفاده از دستور docker exec، به یک کانتینر داکر در حال اجرا نیاز دارید. اگر قبلاً یک کانتینر ندارید، یک کانتینر آزمایشی را با دستور اجرای docker زیر شروع کنید:
docker run -d --name container-name alpine watch "date >> /var/log/date.log"
این دستور یک ظرف Docker جدید از تصویر رسمی آلپاین ایجاد می کند. این یک تصویر محفظه لینوکس محبوب است که از Alpine Linux استفاده می کند، یک توزیع سبک وزن و حداقل لینوکس.
ما از -d برای جدا کردن کانتینر از ترمینال و اجرای آن در پسزمینه استفاده میکنیم. –name container-name نام کانتینر را نامگذاری می کند. میتوانید هر نامی را که دوست دارید در اینجا انتخاب کنید یا این را کاملاً کنار بگذارید تا Docker به طور خودکار یک نام منحصر به فرد برای کانتینر جدید ایجاد کند.
بعد alpine داریم که تصویری را که می خواهیم برای کانتینر استفاده کنیم را مشخص می کند.
و در نهایت، “تاریخ >> /var/log/date.log” را داریم. این دستوری است که می خواهیم در کانتینر اجرا کنیم. ساعت به طور پیش فرض هر دو ثانیه یک بار دستوری را که شما به آن می دهید اجرا می کند. دستوری که ساعت در این حالت اجرا می شود date >> /var/log/date.log است. date تاریخ و زمان فعلی را چاپ می کند، مانند:
OutputFri Jul 23 14:57:05 UTC 2021
بخش >> /var/log/date.log فرمان خروجی را از date تغییر مسیر داده و آن را به فایل /var/log/date.log اضافه می کند. هر دو ثانیه یک خط جدید به فایل اضافه می شود و پس از چند ثانیه چیزی شبیه به این خواهد شد:
Output
Fri 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
در مرحله بعد، نحوه یافتن نام کانتینرهای Docker را یاد خواهیم گرفت. اگر قبلاً کانتینری را دارید که هدف آن قرار گرفتهاید، اما مطمئن نیستید نام آن چیست، این کار مفید خواهد بود.
پیدا کردن نام کانتینر داکر
ما باید docker exec را با نام (یا شناسه کانتینر) کانتینری که میخواهیم با آن کار کنیم ارائه کنیم. ما می توانیم این اطلاعات را با استفاده از دستور docker ps پیدا کنیم:
docker ps
این دستور همه کانتینرهای Docker در حال اجرا بر روی سرور را فهرست می کند و برخی از اطلاعات سطح بالا را در مورد آنها ارائه می دهد:
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76aded7112d4 alpine "watch 'date >> /var…" 11 seconds ago Up 10 seconds container-name
در این مثال، شناسه و نام کانتینر برجسته شده است. شما میتوانید از هر کدام برای گفتن اینکه از کدام کانتینر استفاده کنید به docker exec استفاده کنید.
اگر می خواهید نام کانتینر خود را تغییر دهید، از دستور تغییر نام docker استفاده کنید:
docker rename container-name new-name
در مرحله بعد، چندین مثال از استفاده از docker exec برای اجرای دستورات در یک ظرف داکر را اجرا خواهیم کرد.
اجرای یک پوسته تعاملی در یک داکر کانتینر
اگر نیاز به راه اندازی یک پوسته تعاملی در داخل یک داکر کانتینر دارید، شاید برای کاوش در سیستم فایل یا اشکال زدایی فرآیندهای در حال اجرا، از docker exec با پرچم -i و -t استفاده کنید.
پرچم -i ورودی را به ظرف باز نگه میدارد و پرچم -t یک شبه پایانه ایجاد میکند که پوسته میتواند به آن متصل شود. این پرچم ها را می توان به صورت زیر ترکیب کرد:
docker exec -it container-name sh
با این کار shell در ظرف مشخص شده اجرا میشود و به شما یک درخواست اولیه پوسته میدهد. برای خروج از کانتینر، exit را تایپ کرده و ENTER را فشار دهید:
exit
اگر تصویر ظرف شما شامل پوسته پیشرفته تری مانند bash است، می توانید sh را با bash در بالا جایگزین کنید.
اجرای یک فرمان غیر تعاملی در یک داکر کانتینر
اگر نیاز به اجرای دستوری در داخل یک کانتینر در حال اجرا دارید، اما نیازی به تعامل ندارید، از دستور docker exec بدون هیچ پرچمی استفاده کنید:
docker exec container-name tail /var/log/date.log
این دستور tail /var/log/date.log را روی ظرف نام کانتینر اجرا می کند و نتایج را به بیرون می دهد. به طور پیش فرض، دستور tail ده خط آخر یک فایل را چاپ می کند. اگر کانتینر آزمایشی را که در بخش اول تنظیم کردهایم اجرا میکنید، چیزی شبیه به این خواهید دید:
Output
Mon 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
این در اصل مانند باز کردن یک پوسته تعاملی برای ظرف Docker است (همانطور که در مرحله قبل با docker exec -it container-name sh انجام شد) و سپس اجرای دستور tail /var/log/date.log. با این حال، به جای باز کردن یک پوسته، اجرای دستور، و سپس بستن پوسته، این دستور همان خروجی را در یک دستور واحد بدون باز کردن شبه پایانه برمیگرداند.
اجرای دستورات در یک فهرست جایگزین در یک داکر کانتینر
برای اجرای یک دستور در دایرکتوری خاصی از کانتینر خود، از پرچم –workdir برای مشخص کردن دایرکتوری استفاده کنید:
docker exec --workdir /tmp container-name pwd
این دستور مثال دایرکتوری tmp / را به عنوان دایرکتوری کاری تنظیم می کند، سپس دستور pwd را اجرا می کند که دایرکتوری کاری فعلی را چاپ می کند:
Output
/tmp
دستور pwd تأیید کرده است که دایرکتوری کار / tmp است.
اجرای دستورات به عنوان یک کاربر متفاوت در یک داکر کانتینر
برای اجرای یک فرمان به عنوان یک کاربر دیگر در داخل ظرف خود، پرچم –user را اضافه کنید:
docker exec --user guest container-name whoami
این از کاربر مهمان برای اجرای دستور whoami در کانتینر استفاده می کند. دستور whoami نام کاربری فعلی کاربر را چاپ می کند:
Output
guest
دستور whoami تایید می کند که کاربر فعلی کانتینر مهمان است.
انتقال متغیرهای محیطی به کانتینر داکر
گاهی اوقات لازم است متغیرهای محیطی را به همراه دستور اجرا به یک ظرف منتقل کنید. پرچم -e به شما امکان می دهد یک متغیر محیطی را مشخص کنید:
docker exec -e TEST=sammy container-name env
این دستور متغیر محیطی TEST را برابر با sammy قرار می دهد، سپس دستور env را در داخل کانتینر اجرا می کند. سپس دستور env تمام متغیرهای محیط را چاپ می کند:
Output
PATH=/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
ما از .env به عنوان نام فایل استفاده می کنیم، زیرا این استاندارد محبوبی برای استفاده از این نوع فایل ها برای مدیریت اطلاعات خارج از کنترل نسخه است.
متغیرهای KEY=value خود را در فایل، یکی در هر خط، مانند شکل زیر بنویسید:
TEST=sammy
ENVIRONMENT=prod
ذخیره کنید و فایل را ببندید. برای ذخیره فایل و خروج از nano، CTRL+O و سپس ENTER را برای ذخیره و سپس CTRL+X را برای خروج فشار دهید.
اکنون دستور docker exec را اجرا کنید و نام فایل صحیح را بعد از –env-file مشخص کنید:
docker exec --env-file .env container-name env
Output
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
ENVIRONMENT=prod
HOME=/root
دو متغیر در فایل تنظیم شده است.
شما می توانید چندین فایل را با استفاده از چندین پرچم –env-file مشخص کنید. اگر متغیرهای موجود در فایلها با یکدیگر همپوشانی داشته باشند، هر کدام از فایلها در آخرین دستور فهرست شده باشد، فایلهای قبلی را لغو میکند.
خطاهای رایج
هنگام استفاده از دستور docker exec، ممکن است با چند خطای رایج روبرو شوید:
Error: No such container: container-name
خطای No such container به این معنی است که ظرف مشخص شده وجود ندارد و ممکن است نشان دهنده اشتباه املایی نام ظرف باشد. از docker ps برای فهرست کردن کانتینرهای در حال اجرا خود استفاده کنید و نام را دوباره بررسی کنید.
Error response from daemon: Container 2a94aae70ea5dc92a12e30b13d0613dd6ca5919174d73e62e29cb0f79db6e4ab is not running
این پیام در حال اجرا به این معنی است که ظرف وجود دارد اما متوقف شده است. می توانید کانتینر را با docker start container-name راه اندازی کنید
Error response from daemon: Container container-name is paused, unpause the container before exec
خطای Container is paused مشکل را به خوبی توضیح می دهد. قبل از ادامه، باید کانتینر را با docker unpause container-name لغو مکث کنید.
نتیجه
در این آموزش ما یاد گرفتیم که چگونه دستورات را در یک ظرف داکر در حال اجرا اجرا کنیم، همراه با برخی از گزینه های خط فرمان در هنگام انجام این کار.