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

 

به‌عبارت‌دیگر، container این امکان را برای برنامه‌نویسان و توسعه‌دهندگان فراهم می‌کند که یک برنامه را با تمام ماژول‌ها و وابستگی‌های آن ( مانند کتابخانه‌ها ، توابع و … ) یکی کرده و به‌صورت یک پکیج درآورد تا آن برنامه‌ی تولید شده در پلتفرم‌ها و سیستم‌های مختلف بدون مشکل اجرا شود. در حقیقت container، بدون نگرانی از تنظیمات و وابستگی‌های یک برنامه خاص در پلتفرم‌های دیگر، آن برنامه را در هر محیطی قابل اجرا می‌نماید.

Docker، وظیفه مدیریت این containerها را به عهده دارد و بیشتر شبیه یک ماشین مجازی عمل می‌کند. تفاوت Docker با ماشین مجازی در این است که در ماشین مجازی، اگر بخواهیم برنامه‌های مختلف به صورت ایزوله و مجزا از هم کار کنند، باید VMهای مختلف ساخته شود که همین موضوع، افزایش بار پردازشی و مصرف منابع سیستمی را روی سرور منجر می‌شود؛ در حالی که این کار را می‌توان برروی یک Docker و بدون وجود هیچ‌گونه مشکلی انجام داد.

 

این مطلب نیز ممکن است برای شما مفید باشد: نصب KVM برای مدیریت ماشین‌های مجازی در اوبونتو 18.04

 

اتصال به یک Docker Container در حال اجرا، زمانی مفید است که بخواهید ببینید، چه چیزی داخل Docker Container رخ می‌دهد. اگر Docker Container آن‌طور که انتظار می‌رود کار نکند، می‌توانید به container وصل شوید، یا اینکه یک shell به او داده و دستوراتی مانند ps یا top را اجرا نمایید. شما همچنین می‌توانید وارد container شده، بسته‌های جدید را نصب نمایید و یک Docker image جدید از آن بسازید.

در این آموزش، چگونگی اتصال به فرایند اصلی و در حال اجرای container و چگونگی ارائه یک shell به یک container در حال اجرا شرح داده می‌شود.

 

اتصال به یک container

اگرچه اجرای چندین فرایند در یک container امکان پذیر است؛ اما اکثر Docker Containerها فقط یک فرآیند واحد را اجرا می‌کنند. دستوری که هنگام راه‌اندازی یک container اجرا می‌شود، با استفاده از دستورالعمل ENTRYPOINT و / یا RUN مشخص می‌شود.

دستور docker attach به شما امکان می‌دهد که ترمینال خود را به container در حال اجرا وصل کنید. این کار زمانی مفید است که می‌خواهید آنچه را که در خروجی استاندارد نوشته می‌شود، در زمان واقعی ببینید؛ یا اینکه فرآیند را به صورت تعاملی کنترل نمایید.

برای درک بهتر نحوه عملکرد دستور attach، باید یک Nginx container جدا شده را با استفاده از Nginx image رسمی اجرا کنید.

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

گزینه p 8080: 80- به Docker می‌گوید، پورت 8080 مربوط به container را به پورت 80 روی دستگاه میزبان وصل کند.

اکنون containerها را لیست کنید تا مطمئن شوید container مربوط به "my_nginx" در حال اجرا است:

$ docker container ls
Output:
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
8e1c4974a8d8        nginx               "nginx -g 'daemon of…"   3 minutes ago       Up 2 seconds        0.0.0.0:8080->80/tcp   my_nginx

با استفاده از شناسه یا نام container به صورت زیر، به آن متصل شوید:

$ docker container attach my_nginx

دستور پیش فرض nginx image که هنگام اجرای container اجرا می‌شود، بصورت  CMD ["nginx", "-g", "daemon off;"] تنظیم می‌شود. وقتی دستور attach را اجرا می‌کنید، ترمینال شما به فرآیند nginx متصل می‌شود.

اکنون 127.0.0.1:8080 را در مرورگر خود باز کنید. شما می‌توانید خروجی فرآیند nginx را بصورت زمان واقعی مشاهده نمایید.

192.168.33.1 - - [04/Oct/2019:21:12:28 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"
192.168.33.1 - - [04/Oct/2019:21:12:28 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.33.71:8080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"

برای دسترسی به گزارش‌های container باید از دستور docker logs استفاده کنید.

برای جدا شدن از container بدون متوقف کردن آن، از ترکیب کلید CTRL-pو CTRL-q استفاده نمایید. فشار دادن کلید CTRL-c منجر به توقف container می‌شود.

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

 

ارائه یک shell به یک container

دستور docker exec به شما امکان می‌دهد، دستورات داخل یک container در حال اجرا را اجرا کنید.

برای دیدن نحوه عملکرد دستور exec و نحوه استفاده از آن برای ورود به container shell، ابتدا یک container جدید را راه‌اندازی نمایید. در اینجا از MySQL image رسمی استفاده خواهیم کرد:

$ docker container run --name my_mysql -d mysql

این، یک container با نام "my_mysql" ایجاد می‌کند.

برای اجرای یک دستور در داخل container، دستور زیر را اجرا نمایید:

$ docker container exec -it my_mysql ls /var

گزینه i- مخفف interactive (تعاملی) است و t- به Docker می‌گوید یک دستگاه شبه TTY اختصاص دهد. دستور ls، تمام فایل‌ها و دایرکتوری‌های داخل دایرکتوری var/ مربوط به container را لیست می‌کند:

Output:
backups  cache	lib  local  lock  log  mail  opt  run  spool  tmp

برای ارائه یک shell به container، یعنی برای ورود به داخل container، یک نشست shell جدید را با اجرای دودویی shell راه‌اندازی نمایید. می‌توانید از sh ،bash یا هر shell دیگری که در image موجود است، استفاده کنید.

دستور زیر، یک نشست Bash جدید داخل container ایجاد می‌کند:

$ docker container exec -it my_mysql /bin/bash

با این کار، درخواست دستور شما تغییر خواهد کرد که نشان دهنده این است که اکنون در حال کار بر روی container shell هستید.

از اینجا، می‌توانید دستورات را به همان روشی که در سرورهای دیگر لینوکس انجام می‌دهید، اجرا نمایید. به‌عنوان‌مثال، برای ارائه لیستی از متغیرهای محیطی فعلی، دستور env را تایپ نمایید:

$ env

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

Output:
HOSTNAME=e0214d97e0fe
MYSQL_ROOT_PASSWORD=my-secret-pw
PWD=/
HOME=/root
MYSQL_MAJOR=8.0
GOSU_VERSION=1.7
MYSQL_VERSION=8.0.17-1debian9
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env

 

 

منبع:

linuxize