آموزش کامل نصب و راه اندازی و پیکربندی داکر (Docker) در ویندوز و لینوکس

داکر یک ابزار اوپن سورس برای طراحی و ساخت برنامه‌ها به کمک Container است. Container به برنامه نویس کمک می‌کند که پروژه خود را با تمام بخش هایی که دارد (مثل کتابخانه ها، وابستگی‌ها و غیره) به صورت یک پکیج دربیاورد. به لطف این تکنیک، برنامه نویس خیالش راحت است که برنامه او می‌تواند در سیستم‌های دیگر بدون نیاز به تنظیمات خاص یا ابزارهای جانبی اجرا شود. داکر را شبیه به ماشین مجازی در نظر بگیرید، با این تفاوت که بازدهی بسیار بالاتری دارد چون نیاز به سیستم عامل مجزا ندارد. با اینکه داکر در شروع کار برای لینوکس ساخته شد اما امروزه به خوبی در ویندوز و MacOS هم اجرا می‌شود. برای ساخت یک برنامه با داکر باید از کامپوننت‌های مختلفی استفاده کنیم. 

 داکر Docker چیست؟

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

داکر در مقایسه با مجازی سازی
داکر در مقایسه با مجازی سازی

این قابلیت سال‌هاست که در لینوکس وجود دارد  و سوال اینجاست که داکر چه چیزی به این قابلیت اضافه می‌کند؟ نسخه‌های اولیه داکر، از LXC برای مدیریت کانتینر‌ها استفاده می‌کردند، اما از نسخه 9/0 به بعد، داکر به صورت مستقیم و با کمک کتابخانه‌هایی که LXC هم از آن ها استفاده می‌کند، مدیریت کانتینر‌ها را انجام می‌دهد. آن چه داکر را از بقیه متمایز می‌کند، تکنیک «مدیریت لایه لایه فایل سیستم» و امکان Copy-on-write فایل سیستم است. با توجه به فلسفه «همه چیز فایل است» در سیستم‌های مبتنی بر یونیکس، برای انتقال یک سیستم‌عامل و حتی ذخیره کردن وضعیت برنامه‌های در حال اجرا، کافی است راهی برای مدیریت همه این فایل‌ها وجود داشته باشد.

هر کانتینر در داکر یک فایل‌سیستمِ کاملِ لینوکسی است که از چندین لایه تشکیل شده و هر لایه عبارت است از تغییرات فایل‌های لایه قبلی نسبت به لایه بعدی. داکر به جای نگه داشتن مجموع فایل‌های هرلایه، تنها فایل‌هایی را که از لایه قبلی تا لایه بعدی تغییر کرده‌اند، نگه داری می‌کند. مدیریت این لایه‌ها شبیه به سیستم‌های کنترل نسخه (بیش تر از همه git) انجام می‌شود و امکان گرفتن انشعاب، تگ کردن و برگشتن به یک لایه به‌خصوص در داکر وجود دارد. در داکر قابلیت ایجاد یک مخزن مرکزی از این لایه‌ها وجود دارد و به این ترتیب با کمک docker-registry (که خود یک پروژه متن‌باز دیگر است) امکان انتقال این کانتینر‌ها به راحتی فراهم می‌شود.

هنگامی که یک نسخه از یک کانتینر به یک ماشین دیگر انتقال پیدا می‌کند، می‌توان تا بی‌نهایت رونوشت (بسته به منابع سخت‌افزاری آن ماشین) از آن کانتینر ایجاد کرد. همه کانتینر‌ها در ابتدا در لایه‌های فایل‌سیستم مشترک هستند اما پس از اجرا در لایه جدید به صورت مستقل خواهند بود، این اشتراک در لایه‌ها، باعث کم شدن فضای مورد استفاده می‌شود.

لایه های داکر
docker layers

نصب داکر

نصب داکر بسیار ساده است. داکر معمولا با یک یا دو دستور ساده نصب می‌شود.

 sudo apt-get install docker

برای استفاده از داکر می‌توانید به این صورت عمل کنید:

ابتدا سرویس داکر را اجرا کنید. بسته به توزیع گنو/لینوکس شما، طریقه اجرای سرویس متفاوت است. اما در نهایت دستور docker -d با دسترسی کاربر ریشه، کافی است.

سپس دستورات زیر را اجرا کنید:

(این گام نیاز به اینترنت دارد و یک نسخه از اوبونتو رسمی را از مخزن داکر دانلود خواهد کرد)

docker pull ubuntu

docker run -ti ubunt /bin/bash

تمام شد.

شما دستور bin/bash/ را در یک اوبونتو کاملا مستقل از سیستم خودتان اجرا کرده‌اید. اگر بیش تر کنکاش کنید متوجه چند نکته خواهید شد:

– یک کارت شبکه مجازی به صورت پُل(bridge) در سیستم شما به وجود آمده است که ارتباط شبکه‌ای شما با این کانتینر و همه کانتینر‌های روی یک ماشین را به عهده می‌گیرد.

– با این که شما در اوبونتو هستید، ولی خروجی دستور uname -a (که نسخه کرنل لینوکس شما را نشان می‌دهد) همچنان نسخه لینوکس اصلی شما را به شما نشان خواهد داد.

– شما تنها یک نسخه اجرا شده از bash را در سیستم داخلی خواهید دید. داکر هیچ سرویس، یا برنامه دیگری را اجرا نکرده است.

– هیچ گونه دسترسی به پروسه‌های بیرونی وجود ندارد، فایل سیستمِ بیرونی قابل دسترسی نیست (مگر این که شما قسمتی از آن را با کانتینر به اشتراک گذاشته باشید)

– از بیرون، پروسه‌های داخلی در دسترس هستند. می‌توان آن ها را دید و حتی به آن ها سیگنال Kill فرستاد، ولی هیچ راهی از داخل به بیرون نیست.

– برنامه‌ای مثل htop را در کانتینر نصب کنید و اجرا کنید. خواهید دید که کل CPUهای سیستم بیرونی، کل حافظه و فضای swap بیرونی شما در اختیار کانتینر نیز هست، یعنی اگر چندین کانتینر همزمان اجرا شوند، برخلاف مجازی‌سازی که از ابتدا همه منابع مورد نیازش را از سیستم جدا خواهد کرد، کانتینر هر زمان که لازم داشته باشد می‌تواند به منابع بیش تری دسترسی پیدا کند و هر زمان که در حالت ایده‌آل باشد می‌تواند آن منابع را رها کند. البته امکان کنترل منابع برای کانتینر‌ها نیز وجود دارد.

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

معماری داکر ساده بوده و فقط شامل چند کامپوننت‌ است. حالا برای درک بهتر مفهوم داکر بهتر است سراغ این کامپوننت‌ها رفته و آن‌ها را بررسی کنیم:

اجزای معماری داکر

Dockerfile

هر Container داکر با یک فایل داکر شروع به کار می‌کند. Dockerfile یک فایل متنی بوده که داخل آن با یک سینتکس ساده و قابل فهم دستورالعمل‌های ساخت Docker Image قرار داده شده است (کمی جلوتر این مفهوم را بررسی خواهیم  کرد) این فایل اطلاعات بسیار مهمی را در برمی گیرد که برای راه اندازی داکر استفاده از آنها ضروری است. در واقع Dockerfile مشخص می‌کند که پشت Container ما چه سیستم عاملی قرار بگیرد، همینطور از چه زبان ها، متغیرهای محلی، پورت‌های شبکه یا غیره استفاده شود. و مهم‌تر از همه اینکه مشخص کند Container ما بعد از اینکه واقعا اجرا شد قرار است چه کاری انجام دهد.

تفاوت داکر فایل با داکر ایمیج و داکر کانتینر
تفاوت داکر فایل با داکر ایمیج و داکر کانتینر

Docker image

در واقع زمانی که کار نوشتن Dockerfile را تمام کردید، یک قابلیت به اسم Docker Build را فراخوانی می‌کنید که وظیفه دارد یک Image بر اساس محتویات Dockerfile شما بسازد. Dockerfile شامل یک سری دستورالعمل برای ساختن یک Image است، در حالی که Docker Image یک فایل قابل حمل است که شامل یک سری دستورالعمل بوده که مشخص می‌کند Container کدام کامپوننت‌های نرم افزاری را اجرا کند و اینکه چطور آنها اجرا شوند. به احتمال زیاد Dockerfile بخواهد تعدادی فایل را از مخزن‌های مختلف (Repository) دانلود کند و اینجا باید به طور واضح مشخص کنید که کدام نسخه‌ها دریافت شوند. همینطور Image ساخته شده استاتیک می‌باشد، یعنی یک بار ساختن آن کافی بوده و نیازی به تغییر آن ندارید. همانطور که از اسم آنها می‌توانید حدس بزنید، Image یک تصویر از سیستم عامل اصلی می‌باشد.

Docker run

قابلیت Docker run در واقع یک دستور است که Container را راه اندازی می‌کند. می‌دانیم که هر Container یک instance یا نمونه از Image است و ماهیت Container به صورت موقتی می‌باشد. اما با این حال می‌توان آنها را متوقف (Stop) یا راه اندازی مجدد (Restart) کرد. هر Image می‌تواند تعداد زیادی Container داشته باشد (تا زمانی که هر کدام نام منحصر به فردی داشته باشند)

Docker Hub

هر چند ساخت Containerها کار راحتی است، اما لزومی ندارد برای هر Image از اول Container بسازید. Docker Hub یک مخزن Saas برای به اشتراک گذاری و مدیریت Containerها است. در آنجا می‌توانید Imageهای رسمی داکر که معمولا به صورت متن باز هستند را پیدا کنید. همینطور عموم مردم هم پروژه‌های خود را به این Repository اضافه می‌کنند.

Docker Engine

مغز متفکر و هسته اصلی داکر به حساب می‌آید. یک تکنولوژی کلاینت/سرور که Containerها را ساخته و آنها را اجرا می‌کند. در واقع اگر کسی درباره داکر صحبت کرده و منظورش شرکت داکر یا پروژه داکر نباشد، یعنی دارد درباره Docker Engine حرف می‌زند. این موتور در دو نسخه Enterprise یا Community عرضه می‌شود. نسخه Community به طور متن باز و کاملا رایگان قابل استفاده است در حالی که نسخه Enterprise یک سری قابلیت‌های اضافه داشته و سالانه برای هر Node نزدیک به 1500 دلار هزینه دارد.

دستورات داکر بر اساس کامپوننت‌ها 

معماری داکر دارای اجزای مختلفی است و هر کدام از اجزای آن دارای دستورات مخصوص به خود هستند. شکل های زیر به بهترین نحو ممکن دستورات مربوط به هر بخش از داکر را نمایش میدهد.

 

معماری و دسته بندی دستورات داکر
معماری و دسته بندی دستورات داکر

دستورات داکر
دستورات داکر

شرح دستورات داکر

docker ps

این دستور کانتینرهای در حال اجرا را به شما نشان میده همچنین اگر از پارامتر -a استفاده کنید میتوانید کانتینرهای متوقف شده را نیز مشاهده کنید.

docker version

با دستور بالا نیز می‌توانید نسخه‌ی نصب شده رو مشاهده کنید.

hub.docker.com 

مخزن کانتینرهای داکر

docker -v

برای دیدن ورژن داکر

docker info

برای دیدن اطلاعات داکر نصب شده بر روی سیستماطلاعات کامل از تصاویر و کانتینر ها

docker login

برای استفاده از مخزن داکر باید login کرد

docker compose

برای تعریف و اجرای برنامه هایی که از چند کانتینر تشکیل شده اند بکار میرود. با استفاده از این ابزار میتوان یک یا چند کانتینر را به همراه تمام پارامترهای لازم برای اجرای آنها در یک فایل YAML به نام کامپوزفایل (docker-compose.yml) تعریف کرد و سپس همه آنها را با استفاده از تنها یک دستور ایجاد و راه اندازی نمود. در این فایل هر یک از این کانتینرها یک سرویس نامیده میشود که تعریف دقیق آن به این صورت است.

      

docker-compose.yml

شما با استفاده از فایل docker-compose.yml می‌توانید سرویس‌های برنامتان را اجرا و کانفیگ کنید. بعد از آن فقط  با استفاده از یک دستور می‌توانید همه‌‌‌ی سرویس‌هایی را که در فایل yaml خود مشخص کردید، را بسازید و اجرا کنید.

docker-compose up       

استفاده از دستور docker-compose up که باعث اجرای کامپوز و اجرای کامل برنامه‌ی شما می‌شود.

docker ps -a 

دیدن آی دی و نام همه کانتینرهای داکر موجود بر روی ماشین

docker inspect [container-ID] or container_name] 

تمام اطلاعات جزئی در مورد یک کانتینر را نشان می‌دهد.

docker rm [container_name]

برای پاک کردن یک کانینراین سوئیچ برای فورس کردن استفاده می شود در صورتی با دستور بالا کانتینر حذف نشود.

sudo systemctl enable docker

بالا آمدن خودکار داکر در زمان بوت سیستم 

docker container ls -a

نمایش تمامی کانتینرها حتی آنهایی که قبلا اجرا شده-a 

Docker run hello-world 

یک ایمیج آماده برای تست داکر بعد از لاگین کردن 

docker images 

نمایش های ایمیج های که قبلا به داخل سیستم واکشی شده 

docker rmi -f [image-name]

پاک کردن یک ایمیج محلیبرای اجبار

docker search [image-name] 

جستجوی یک ایمیج در مخزن

 docker pull [image-name] 

 واکشی یک ایمیج از مخزن

docker container prune

پاک کردن تمامی کانتینرها نه ایمیج ها یعنی وقتی دستورمیزنیم دیگر کانتینری دیده نمی شود 

docker run -it [image-name]

اجرای یک کانتینر جدید از ایمیج به صورت یعنی کانتینر فعال می‌ماند و بسته نمیشود

Docker attach [containet-id]

اتصال به یک کانتینر در حال اجرا در یک شل دیگر 

“docker commit -a [user-name] -m ‘message’  [container-ID] [new-image-name] “

  ذخیره تغییراتِ یک کانتینر در یک ایمیج جدید

docker push [user-image-name] 

 پوش کردن یک ایمیج در مخزن داکر

Docker pull [user/image] 

 جهت واکشی یک ایمیج از مخزن 

docker run -it -v ${pwd}:/data docker-image 

مانت کردن پوشه ی موجود در کانتینر به پوشه جاری در سیستم عامل میزبان-v = volume

docker volume create volume-namedocker run -it –mount source=volume-name, destination=/dir -source image-name    

ساختن یک والیوم و مانت کردن آن به یک پوش از کانتینر برای ذخیره داده ها<br>چون کانتینرها داده ها را نگهداری نمی‌کنند و به محض استاپ شدن داده ها از بین میرود.

docker run -it -d -p 9000=80 image-name

   اجرای داکر و مانت کردن پرت 80 کانتینر به پرت 9000 سیستم عامل میزباندر پس زمینه -it به صورت تعاملی

docker logs -f container-ID

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

docker stats

وضعیت منابع استفاده شده توسط کانتینر های در حال اجرا را نمایش می‌دهد.

docker top container-ID

نشان می دهد که داخل یک کانتینر در حال اجرا چه پروسه هایی در حال اجرا هستند.

docker exec -it [containet-id] command

اجرا یک دستور بر روی کانتینر مورد نظر از کنسول جاری مثلا دستور زیر برای ما یک شل باز میکندdocker exec -it [containet-id] sh

docker-compose up docker-compose down 

اگر در مسیر جاری فایل docker-compose.yml وجود داشته باشد آن را با دستورات فوق اجرا و استاپ میکنیم.

جریان کار در داکر
جریان کار در داکر

 

برای دیدن فلیم های سینماییِ مهیج و جذاب”در حوزه فناوری اطلاعات، اوسینت و هوش مصنوعی“، بر روی اینجا کلیک کنید.

آدرس کانال تلگرام سایت بیگ دیتا:

t.me/bigdata_channel

آدرس کانال سروش ما:
https://sapp.ir/bigdata_channel

جهت دیدن سرفصل های دوره های آموزشی بر روی اینجا کلیک کنید.

جهت ثبت نام در دوره های آموزشی بر روی اینجا کلیک کنید.

Visits: 3704

همچنین ببینید

واقعیت مجازی و واقعیت افزوده

پنج راه که واقعیت مجازی (VR) جهان را تغییر خواهد داد

عناوين مطالب: 'واقعیت مجازی چیست؟پنج راه که واقعیت مجازی جهان را تغییر خواهد داد1 – …

معرفی WSO2

WSO2 چیست؟

معرفی WSO2  این فناوری یک تکنولوژی متن باز و میان ابزاری (Middle ware) با زبان …

دیدگاهتان را بنویسید