Docker، پلتفرمی است که به شما اجازه ایجاد، اجرا، آزمایش و استقرار برنامه‌ها را بصورت مستقل و قابل انتقال می‌دهد؛ بطوری که آن برنامه‌ها تقریباً در هر کجا قابل اجرا باشند.

 

دستور docker run، یک Container از روی یک image مشخص ایجاد کرده و آن را با استفاده از یک دستور معین راه‌اندازی می‌نماید. این دستور، یکی از اولین دستوراتی است که هنگام شروع کار با Docker باید با آن آشنا شوید.

در این مقاله، به‌منظور نشان دادن انواع روش‌ها برای اجرای یک Container Docker، از Nginx image رسمی استفاده شده است.

 

این مطلب نیز ممکن است برای شما مفید باشد: نحوه نمایش containerها درDocker

 

ساختار دستور Docker run

ساختار دستور docker run، به صورت زیر است:

$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

نام imageای که Container باید از آن ساخته شود، تنها آرگومان مورد نیاز برای دستور run docker است.

دقت کنید که اگر Container روی سیستم محلی موجود نباشد، از رجیستری دریافت می‌شود.

در صورت عدم تعیین دستور، دستور مشخص شده در دستورالعمل‌های CMD یا ENTRYPOINT مربوط به Dockerfile، هنگام اجرای Container اجرا می‌شود.

از نسخه 1.13 به بالا، Docker CLI به گونه‌ای بازسازی شده است که همه دستورات براساس شی مرتبط، گروه‌بندی شده‌اند.

 

از آنجایی که دستور run با containerها تعامل دارد، زیرمجموعه‌ای از Container docker است. بنابراین، ساختار دستور جدید، به شرح زیر است:

$ docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]

ساختار اول که هم اکنون نیز در نسخه‌های پیش از 1.13 پشتیبانی می‌شود، یک نام مستعار از docker container run است.

چنانچه میخواهید با تمام گزینه‌های دستور docker container run آشنا شوید، به این سایت مراجعه نمایید.

 

این مطلب نیز ممکن است برای شما مفید باشد: نحوه اتصال به Docker Container

 

اجرای Container در پیش زمینه

به‌طور پیش فرض، هنگامی‌که هیچ گزینه‌ای به دستور docker run ارائه نشود، روند اصلی در پیش زمینه اجرا می‌شود. این بدان معنی است که ورودی، خروجی و خطای استاندارد از فرآیند اصلی به نشست ترمینال وصل می‌شوند.

$ docker container run nginx

خروجی فرآیند nginx باید در ترمینال شما نمایش داده شود. در اینجا، به دلیل عدم وجود اتصال به وب سرور، ترمینال خالی است.

برای متوقف کردن Container، اجرای فرایند Nginx را با فشار دادن کلید ترکیبی CTRL+C خاتمه دهید.

 

اجرای Container در حالت جدا

به‌منظور عدم توقف اجرای Container، هنگام خروج از نشست ترمینال، آن را در یک حالت جداگانه راه‌اندازی کنید. این، مشابه اجرای یک فرآیند لینوکس در پس زمینه است.

برای راه‌اندازی یک Container مستقل می‌توانید از گزینه d- استفاده نمایید:

$ docker container run -d nginx
output:
050e72d8567a3ec1e66370350b0069ab5219614f9701f63fcf02e8c8689f04fa

در این صورت، Container مستقل، تنها با خاتمه یافتن فرآیند اصلی متوقف می‌شود.

برای اطمینان، شما می‌توانید Containerهای در حال اجرا را با استفاده از دستور docker konten ls لیست کنید.

به منظور اتصال ترمینال خود به فرآیند ریشه Container مستقل، از دستور docker container attach استفاده نمایید.

 

این مطلب نیز ممکن است برای شما مفید باشد: رفع خطای "Permission Denied" پس از نصب Docker در اوبونتو

 

حذف Container بعد از خارج شدن

به‌طور پیش فرض، هنگامی‌که Container از سیستم میزبان خارج می‌شود، سیستم فایل آن همچنان بر روی سیستم میزبان ادامه می‌یابد.

گزینه‌های rm-- به‌همراه دستور docker run منجر به حذف خودکار Container، در هنگام خروج آن از سیستم میزبان می‌شود:

$ docker container run --rm nginx

در این صورت ممکن است، Nginx image بهترین نمونه برای پاک کردن سیستم فایل Container پس از خروج Container نباشد. این گزینه، معمولاً در containerهای پیش زمینه استفاده می‌شود که وظایف کوتاه مدت، مانند آزمایش‌ها یا پشتیبان‌گیری از پایگاه‌داده را انجام می‌دهند.

 

تنظیم نام Container

در Docker، هر Container با UUID و یک نام مشخص می‌شود. اگر این نام، به‌طور پیش فرض تنظیم نشده باشد، نام Container به‌طور خودکار توسط Daemon Demoner تولید می‌شود.

از گزینه name-- می‌توانید، برای اختصاص یک نام دلخواه به Container استفاده نمایید:

$ docker container run -d --name my_nginx nginx

دقت کنید که نام Container باید یکتا باشد. بنابراین، اگر سعی کنید یک Container دیگر با همین نام راه‌اندازی کنید، خطایی مشابه با خطای زیر دریافت خواهید کرد:

output:
docker: Error response from daemon: Conflict. The container name "/my_nginx" is already in use by container "9...c". You have to remove (or rename) that container to be able to reuse that name.

 

درنتیجه بهتر است قبل از تعیین نام، دستور Container docker ls –a را برای مشاهده نام تمام containerها اجرا نمایید:

$ docker container ls
output:
CONTAINER ID  IMAGE  COMMAND                 CREATED         STATUS         PORTS   NAMES
9d695c1f5ef4  nginx  "nginx -g 'daemon of…"  36 seconds ago  Up 35 seconds  80/tcp  my_nginx

نام‌های معنی‌دار برای ارجاع Container از طریق یک شبکه Docker یا هنگام اجرای دستورات docker CLI کاربردی هستند.

 

این مطلب نیز ممکن است برای شما مفید باشد: ایجاد و اجرای Docker Image با استفاده از Dockerfile

 

تعیین پورت‌های Container

به‌طور پیش فرض، در صورت عدم تعیین پورت، اجرای فرآیند در Container تنها از داخل Container قابل دسترسی است.

تعیین پورت‌ها، به معنی نگاشت پورت‌های Container به پورت‌های دستگاه میزبان است به گونه‌ای که این پورت‌ها در خارج از سرویس‌های Docker نیز قابل دسترسی باشند.

برای تعیین یک پورت، می‌توانید از گزینه p- به صورت زیر استفاده کنید:

-p host_ip:host_port:container_port/protocol

اگر در دستور بالا، هیچ host_ip مشخص نشده باشد، به صورت پیش فرض 0.0.0.0 تنظیم خواهد شد.

اگر protocol مشخص نشده باشد، به صورت پیش فرض TCP تعیین خواهد شد.

برای تعیین پورت‌های مختلف، باید از چندین گزینه p- استفاده نمایید.

 

به‌منظور نگاشت پورت TCP 80 (nginx) در Container به پورت 8080 در رابط localhost میزبان، باید دستور زیر را کنید:

$ docker container run --name web_server -d -p 8080:80 nginx

با باز کردن آدرس http://localhost:8080 در مرورگر خود؛ یا اجرای دستور curl بصورت زیر، برروی میزبان Docker می‌توانید؛ تأیید کنید که این پورت تعیین شده است:

$ curl -I http://localhost:8080

در این صورت، خروجی چیزی شبیه به این خواهد بود:

output:
HTTP/1.1 200 OK
Server: nginx/1.17.6
Date: Tue, 26 Nov 2019 22:55:59 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 19 Nov 2019 12:50:08 GMT
Connection: keep-alive
ETag: "5dd3e500-264"
Accept-Ranges: bytes

 

به اشتراک گذاری داده‌ها

هنگامی‌که یک Container متوقف شود، تمام داده‌های تولید شده توسط آن Container حذف می‌شوند. Docker Volume‌ها روش ممتازی برای نگه‌داری داده‌ها و به اشتراک گذاری آن‌ها در Container‌های مختلف هستند.

برای ایجاد و مدیریت volumeها، از گزینه‌های p- به صورت زیر استفاده کنید:

-v host_src:container_dest:options

host_src می‌تواند، مسیری مطلق برای یک volume نام‌گذاری شده یا یک فایل یا دایرکتوری در میزبان باشد.

container_dest، یک مسیر مطلق برای یک فایل یا دایرکتوری موجود در Container است.

در این دستور، Optionها می‌توانند، rw (خواندن-نوشتن) و ro (فقط خواندن) باشند. اگر هیچ گزینه ای مشخص نشده باشد، rw به صورت پیش فرض انتخاب می‌شود.

به‌منظور شرح نحوه عملکرد، در ادامه یک مثال اجرا می‌نماییم.

بدین منظور، ابتدا یک دایرکتوری در هاست ایجاد کرده و یک فایل index.html در آن قرار دهید:

$ mkdir public_html
$ echo "Testing Docker Volumes" > public_html/index.html

 

سپس، دایرکتوری public_html را در مسیر usr/share/nginx/html/ در Container بصورت mount قرار دهید:

$ docker run --name web_server -d -p 8080:80 -v $(pwd)/public_html:/usr/share/nginx/html nginx

به‌جای مشخص کردن مسیر مطلق برای دایرکتوری public_html، در اینجا از دستور (pwd)$ استفاده می‌کنیم که دایرکتوری کنونی را چاپ می‌کند.

اکنون، اگر در مرورگر خود آدرس http://localhost: 8080 را تایپ کنید، باید محتوای فایل index.html را مشاهده نمایید. بدین منظور می‌توانید از دستور curl نیز استفاده کنید:

$ curl http://localhost:8080
output:
Testing Docker Volumes

 

اجرای Container به صورت تعاملی

هنگام برخورد با فرآیندهای تعاملی مانند bash، از گزینه‌های i- و t- برای راه‌اندازی Container استفاده نمایید.

گزینه it- به Docker می‌گوید که ورودی استاندارد را به ترمینال متصل کرده و یک pseudo-tty تعیین نماید:

$ docker container run -it nginx /bin/bash

پوسته Bash مربوط به Container به ترمینال وصل می‌شود و خط فرمان به صورت زیر تغییر می‌یابد:

output:
root@1da70f1937f5:/#

اکنون می‌توانید، با پوسته Container تعامل برقرار کرده و هر دستوری را درون آن اجرا نمایید.

در این مثال، یک دستور (bin/bash/) به‌عنوان آرگومان به دستور docker run ارائه شده است.

 

 

منبع:

linuxize