معمولا همه ی آموزش های برنامه نویسی با برنامه ی hello-world شروع می شوند. containerization هم از این مسئله مستثنی نیست. داکر یک کانتینر hello-world را در ابتدای کار خود منتشر کرد که بسیار سبک و ساده برای اجرا است. این کانتینر با هدف آشنایی با اجرای یک کانتینر single process با طول عمر محدود استفاده می شود.

در این مثال از دستوراتی که در قسمت قبل دیدیم استفاده می کنیم تا کانتینر را دانلو، اجرا و وضعیت آن را مشاهده کنیم. مراحل زیر را به ترتیب پیش ببرید تا مثال را به اتمام برسانید:

1- دستور زیر را در ترمینال Bash یا PowerShell وارد کنید:

docker run hello-world

در خروجی خواهید دید:


docker : Unable to find image 'hello-world:latest' locally

At line:1 char:1

+ docker run hello-world

+ ~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : NotSpecified: (Unable to find ...latest' locally

:String) [], RemoteException

+ FullyQualifiedErrorId : NativeCommandError

latest: Pulling from library/hello-world

719385e32844: Pulling fs layer

719385e32844: Download complete

719385e32844: Pull complete

Digest: sha256:fc6cf906cbfa013e80938cdf0bb199fbdbb86d6e3e013783e5a766f50f5dbce0

Status: Downloaded newer image for hello-world:latest

Hello from Docker!

This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:

The Docker client contacted the Docker daemon.

The Docker daemon pulled the "hello-world" image from the Docker Hub.

(amd64)

The Docker daemon created a new container from that image which runs the

executable that produces the output you are currently reading.

The Docker daemon streamed that output to the Docker client, which sent it

to your terminal.

To try something more ambitious, you can run an Ubuntu container with:

$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:

https://hub.docker.com/

For more examples and ideas, visit:

https://docs.docker.com/get-started/


چی شد؟! با دستوری که وارد کردیم از داکر خواستیم تا کانتینر hello-world را اجرا( run ) کند. داکر اول دنبال image آن در local container cache خودش گشت و چون چیزی پیدا نکرد که هم اسم آن باشد، از container registry و از طریق اینترنت تلاش کرد تا کانتینر را پیدا کند. تنها از طریق نام کانتینر( hello-world ) داکر قادر به پیدا کردن و دانلود و اجرای کانتینر از طریق یک query ساده به Docker Hub بود. اگر به خروجی بالا دقت کنید این کانتینر در آدرس library/hello-world قرار داشت و دیدیم که برای دانلود آن به صورت لایه به لایه( layer by layer ) اقدام شد. در فصل بعدی تصاویر و لایه ها را بیشتر بررسی می کنیم.

بعد از دانلود کامل تصویر، داکر آن را اجرا کرد و خروجی مورد نظر کانتینر را در خروجی به ما نمایش داد. از آنجایی که تنها فرآیند اجرایی این کانتینر نمایش دادن همین پیام Hello from Docker بود، بعد از نمایش این پیام از کار می افتد و دیگر به عنوان یک کانتینر فعال بر روی سیستم ما وجود نخواهد داشت.

2- از دستور زیر استفاده کنید تا کانتینر های فعال روی سیستم خود را ببینید:

docker ps

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


CONTAINER ID IMAGE COMMAND CREATED

STATUS PORTS NAMES


خروجی این دستور خالی است چون که تنها کانتینر های در حال اجرا را نمایش می دهد. با استفاده از پرچم(flag) a- میتوان تمام کانتینرهای موجود را استخراج کرد.

3- دستور زیر را وارد کنید:

docker ps -a


CONTAINER ID IMAGE COMMAND CREATED STATUS

PORTS NAMES

71f7af7328d8 hello-world "/hello" 13 minutes ago Exited (0) 13 minutes a

go nice_wing


خب! داکر به کانتینر یک unique container ID اختصاص داده، همچنین اسم IMAGE رو برامون مشخص کرده و دستوری( COMMAND ) که داخل IMAGE اجرا شده و TIME ای که ایجاد شده. همچنین وضعیت( STATUS ) فعلی اجرایی کانتینر رو میبینیم( Exited (0) ) و از روی PORTS پریدیم چون این کانتینر هیچ پورتی رو استفاده نمی کرده و یک اسم خوانا هم nice_wing به کانتینر اختصاص داده شده.

4- میتونید به سیستم خودتون (local container cache) هم query بزنید و ببینید که چه تصاویری رو روی سیستم خودتون دارید:

docker images

توی خروجی پایین شما باید فقط یک کانتینر ببینید ولی متاسفانه به خاطر اینترنت ایران اگر من کانتینر هامو پاک کنم معلوم نیست چقدر باید دوباره برای نصبشون زمان بگذارم. باقی توضیحات رو با این فرض می نویسم که فقط کانتینر hello-world رو توی خروجی این دستور میبینید:


REPOSITORY TAG IMAGE ID CREATED SIZE

cockroachdb/cockroach latest 518f304e6bb1 8 days ago 531MB

postgres latest f14b0d96cff9 12 days ago 379MB

hello-world latest 9c7a54a9a43c 2 weeks ago 13.3kB

adminer latest 78893d63a9cc 2 weeks ago 250MB

redis/redis-stack latest f6a0917d0704 4 weeks ago 583MB


با فرض اینکه اول راه هستید احتمالا فقط تصویر hello-world برای شما cached شده. این تصویر شامل آخرین نسخه( latest version ) از برنامست و توی این تاریخ برای من 2 هفته ی پیش ایجاد شده که برای شما ممکنه کمتر یا بیشتر باشه. سایز فایلش هم 13.3 کیلوبایت هست.


نکته:

الآن که یک عدم پیوستگی توی دوره پیش اومده سایز تصاویر دیتابیس های پستگرس، ردیس استک و کاکروچ رو با hello-world مقایسه کنید! تصاویر واقعی حدودا 30هزار برابر حجم بیشتری از این تصویر دارن!


تاریخ created و tag میتوانند برای نسخه بندی و یکپارچه سازی ابزاری که در پروژه ها استفاده می کنیم، بسیار به ما کمک کنند.

چون به داکر گفتیم که کانتینر hello-world را برای ما اجرا کند و نسخه ی خاصی را تعریف نکردیم، داکر در زمان دانلود تصویر latest version را دانلود می کند. مثلا در خروجی بالا اگر قصد استفاده از دیتابیس پستگرس برای توسعه ی محصول را داشته باشید، این کار کاملا اشتباه است و باید نسخه ی مشخصی را انتخاب و همان را دانلود و اجرا کنیم. یا مثلا فرض کنید که میخواهیم نسخه ی 2.0 از hello-world را دانلود کنیم. برای این کار میتوانیم دستور زیر را بنویسیم(لازم نیست وارد کنید فقط ببینید):

docker run hello-world:2.0

دنیای توسعه ی نرم افزار و کانتینرها کمی پیچیده تر است. معمولا نسخه ی برنامه ها بسیار اهمیت دارند و همواره کلی کتابخانه ی third-party با نسخه های مشخص هر برنامه در کنار برنامه دانلود و اجرا می شوند. به صورت سنتی هر برنامه مراحل راه اندازی و نصب بسیار طولانی و گاهی پیچیده داشت و وابستگی به سیستم عامل توسعه دهنده و سخت افزار باعث مهاجرت بسیاری از برنامه نویسان به توزیع های لینوکسی شده بود.

الآن اما این مسئله فرق می کند و اگر شما برنامه ی خود را در یک Docker registry منتشر( publish ) کنید، برای اجرای آن تنها نیاز است از دستور docker run برای اجرای برنامه ی خود از طریق کانتینر استفاده کنید. از طریق داکر، برنامه روی تمام پلتفرم ها رفتار یکسانی خواهد داشت و خود کانتینر، جزییات محیط اجرا و کتابخانه های لازم را در درون خودش مدیریت می کند. بگذریم!

5- بیایید دوباره دستور docker run را برای hello-world اجرا کنیم:

docker run hello-world

در خروجی داریم:


Hello from Docker!

This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:

The Docker client contacted the Docker daemon.

The Docker daemon pulled the "hello-world" image from the Docker Hub.

(amd64)

The Docker daemon created a new container from that image which runs the

executable that produces the output you are currently reading.

The Docker daemon streamed that output to the Docker client, which sent it

to your terminal.

To try something more ambitious, you can run an Ubuntu container with:

$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:

https://hub.docker.com/

For more examples and ideas, visit:

https://docs.docker.com/get-started/


برای هر دستور docker run که اجرا کنید، یک instance جدید از کانتینر ایجاد می شود. این قابلیت به ما امکان میدهد تا به راحتی چند instance از یک برنامه ی نرم افزاری را اجرا کنیم. دقت کنید که خروجی این دستور با دفعه ی قبل فرق می کند. داکر دیگر هیچ تصویری را دانلود نکرده چرا که این تصویر در local container cache وجود دارد.

6- بیایید کانتینر های موجود روی سیستم را بررسی کنیم:

docker ps -a

در خروجی میبینیم:


CONTAINER ID IMAGE COMMAND CREATED STATUS

PORTS NAMES

916e103d3ac8 hello-world "/hello" 21 seconds ago Exited (0) 21 second

s ago bold_almeida

71f7af7328d8 hello-world "/hello" About an hour ago Exited (0) About an

hour ago nice_wing


حالا یک instance دیگر از کانتینر وجود دارد که متوقف شده است. هر بار که docker run را اجرا کنید هم یک instance مجزا از کانتینر اجرا می شود. مثلا در بالا کانتینر اول 1 ساعت قبل و دومی هم 21 ثانیه قبل ایجاد شد و هردو ID های متفاوت دارند.

6- چه اتفاقی برای تصاویر روی سیستم می افتد؟

docker images

در خروجی خواهیم داشت:


REPOSITORY TAG IMAGE ID CREATED SIZE

cockroachdb/cockroach latest 518f304e6bb1 8 days ago 531MB

postgres latest f14b0d96cff9 12 days ago 379MB

hello-world latest 9c7a54a9a43c 2 weeks ago 13.3kB

adminer latest 78893d63a9cc 2 weeks ago 250MB

redis/redis-stack latest f6a0917d0704 4 weeks ago 583MB


هیچ تغییری در تصاویر رخ نمیدهد چرا که تصویر از قبل موجود بوده و نیازی به دانلود دوباره ی آن وجود ندارد.

مدیریت کانتینرهای داکر خیلی پیچیده تر از مثالی بود که باهم بررسی کردیم. از فصل بعدی وارد دنیای این پیچیدگی ها می شویم ولی بهتر است قبل از آن چند دستور مهم داکر را یاد بگیریم. به قسمت بعدی دقت کنید!