داکر چیست؟
داکر (Docker) یک پروژه متنباز است که استقرار برنامهها در کانتینرها (Containers) را از طریق پیادهسازی یک لایه انتزاعی اضافی و مجازیسازی سطح سیستمعامل به فرآیندی خودکار تبدیل میکند. به بیان سادهتر، داکر ابزاری است که به توسعهدهندگان اجازه میدهد به سهولت برنامههای کاربردی را در یک جعبه شن (Sandbox) که به آن کانتینر گفته میشود توسعه داده و روی سیستمعامل میزبان اجرا کنند. در اینجا، سندباکس یک محدوده آزمایشی روی یک سیستم است که اجازه میدهد بدون تاثیر بر سختافزار یا نرمافزار یک برنامه نرمافزاری را اجرا کرد. داکر به کاربران اجازه میدهد یک برنامه را به همراه تمام وابستگیهای (Dependancies) آنها در یک واحد استانداردسازی شده برای توسعه نرمافزار بستهبندی کنند.
برخلاف ماشینهای مجازی، کانتینرها سربار (Overhead) زیادی ندارند و میتوان از آنها در سیستمهای زیربنایی و به شکل بهینهای از منابع استفاده کرد.
Docker Container چیست؟
کانتینر یک مکانیزم نرمافزاری استاندارد است که کدها را به همراه تمام وابستگیهای آنها بستهبندی میکند تا امکان اجرای سریع و قابل اطمینان برنامه توسعه داده شده در محیطهای محاسباتی مختلف بهوجود آید. امروزه دنیای نرمافزار به سمت اجرای برنامههای نرمافزاری در ماشینهای مجازی سوق پیدا کرده و برنامهها اغلب در یک سیستمعامل مهمان اجرا میشود. این سیستمعامل مهمان روی سختافزار مجازی به وسیله سیستمعامل میزبان در سرور اجرا میشود. ماشینهای مجازی در ایزوله کردن پردازشهای مرتبط با برنامههای کاربردی عملکرد خوبی دارند. با استفاده از ماشینهای مجازی به ندرت شاهد بروز مشکلی در سیستمعامل میزبان هستیم که باعث میشود سایر نرمافزارهای در حال اجرا روی سیستمعامل میزبان بدون مشکل کار کنند؛ با اینحال، ایزولهسازی در ماشینهای مجازی هزینهبر است، زیرا محاسباتی که صرف مجازیسازی سختافزار برای استفاده یک سیستمعامل مهمان میشوند، سربار قابل توجهی دارند. در نقطه مقابل، کانتینرها از رویکرد متفاوتی استفاده میکنند. با بهکارگیری قابلیتهای سطح پایین سیستمعامل میزبان، کانتینرها به میزان زیادی ایزولهسازی ماشینهای مجازی را با توان محاسباتی کمتری فراهم میکنند. فناوری مذکور در سال 2013 میلادی به عنوان یک موتور داکر متنباز منتشر شد. در فناوری فوق مفاهیم محاسباتی کانتینرها و بهویژه مفاهیم اولیه دنیای لینوکس، مثل فضاهای نام به بهترین شکل استفاده شدهاند. فناوری داکر به این دلیل منحصربهفرد است که بر نیازمندیهای توسعهدهندگان و اپراتورهای سیستم برای ایزوله کردن وابستگیهای سیستمی از زیرساختشان متمرکز است.
Container Image در داکر چیست؟
ایمیج کانتینر در داکر به یک بسته نرمافزاری اجرایی مستقل و کم حجم اشاره دارد که شامل تمام موارد مورد نیاز برای اجرای یک برنامه کاربردی است. این موارد کدها، زمان اجرا (Runtime)، ابزارهای سیستمی، کتابخانههای سیستمی و تنظیمات هستند. کانتینر ایمیجها در زمان اجرا تبدیل به کانتینر میشوند و در خصوص کانتینرهای داکر، ایمیجها هنگامی تبدیل به کانتینر میشوند که روی موتور داکر (Docker Engine) اجرا شوند. این فرایند تبدیل برای برنامههای ویندوزی و لینوکسی به شکل یکسانی انجام میشود. کانتینرها نرمافزار را از محیط خود ایزوله میکنند و این اطمینان را میدهند که فرایند طراحی و توسعه برنامههای کاربردی به شکل یکنواختی انجام میشود.
چرا باید از کانتینرها استفاده کنیم؟
کانتینرها یک مکانیزم بستهبندی قدرتمند ارائه میکنند که در آن ایزوله کردن انتزاعی برنامهها از محیط واقعی اجرای این برنامهها فراهم است. این ایزولهسازی به برنامههای کانتینرمحور اجازه میدهد تا استقرار نرمافزار بهراحتی و بهطور پایدار فارغ از ماهیت محیط میزبان (مرکز داده خصوصی، محیط ابر عمومی یا لپتاپ شخصی برنامهنویس) انجام شود. در این حالت، توسعهدهندگان میتوانند محیطهای قابل پیشبینی ایجاد کنند که از سایر برنامهها ایزوله هستند و میتوانند در هر مکانی اجرا شوند. از منظر عملیاتی، علاوه بر قابلیت حمل، کانتینرها امکان کنترل دانهای (Granular Control) بیشتری روی منابع ارائه میکنند که بهبود عملکرد زیرساختها و استفاده بهینهتر از منابع محاسباتی را بههمراه دارد. به خاطر این قابلیتها، بسیاری از توسعهدهندگان علاقهمند به استفاده از کانتینرها و داکر شدهاند. شرکتهای بزرگی مثل گوگل، متا، نتفلیکس و Salesforce نیز از کانتینرها برای بهبود عملکرد تیمهای مهندسی بزرگ و استفاده کارآمدتر از منابع محاسباتی استفاده میکنند.
کانتینر و ماشین مجازی چه تفاوتی دارند؟
مزیتهای استفاده از سازوکارهای ایزولهسازی و تخصیص منابع در کانتینرها و ماشینهای مجازی مشابه هستند، اما این دو فناوری به روشهای متفاوتی اینکار را انجام میدهند، زیرا کانتینرها به جای مجازیسازی سختافزار، سیستمعامل را مجازیسازی میکنند و به همین دلیل قابلیت حمل بیشتری دارند و نسبت به ماشین مجازی بهینهتر عمل میکنند.
ماشینهای مجازی با انتزاعی کردن سختافزار فیزیکی یک سرور را به چند سرور تبدیل میکنند. لایه نرمافزاری برای ساخت محیط مجازی که به آن هایپروایزر (Hypervisor) گفته میشود به چند ماشین مجازی اجازه میدهد روی یک ماشین واحد اجرا شوند. هر ماشین مجازی یک نسخه کامل از سیستمعامل، برنامه کاربردی، پردازهها و سرویسهای مخصوص به خود، کتابخانههای مورد نیاز و موارد این چنینی را دارد که چندین گیگابایت فضا اشغال میکنند. علاوه بر این، بوت شدن ماشینهای مجازی زمانبر است.
در سویی دیگر، کانتینرها مفهوم انتزاعی را در لایه برنامه کاربردی ارائه میکنند تا کدها و وابستگیها همه با هم بستهبندی شوند؛ به همین دلیل چند کانتینر قابلیت اجرا روی یک ماشین مشترک را دارند و این امکان وجود دارد تا کرنل سیستمعامل را با دیگر کانتینرها بهاشتراک قرار داد تا هر کدام از آنها در فضای کاربری به شکل پردازههای مجزا و مستقل اجرا شوند. بهعلاوه، کانتینرها فضای کمتری نسبت به ماشینهای مجازی اشغال میکنند. علاوه بر این، کانتینرها میتوانند برنامههای بیشتری را پشتیبانی کنند و با استفاده از آنها نیاز به ماشینهای مجازی و سیستمعاملها تا حد زیادی کمتر میشود.
چگونه از داکر استفاده کنیم؟
برای کار با داکر باید مهارتهای اولیه در ارتباط با توسعه برنامههای وبمحور و لینوکس داشته باشید. مورد دیگری که باید به آن دقت کنید ساخت حساب کاربری در هر یک از سایتهای وب سرویسهای آمازون و داکر هاب است. اگر قصد یادگیری لینوکس به منظور استفاده از داکر را دارید، پیشنهاد میکنیم به فکر یادگیری مفاهیم زیر باشید:
- Cgroups : یک روش ایزولهسازی پردازه برای گروهبندی پردازهها است تا کانتینرها بدون تداخل قادر به کار باشند.
- Namespaces: فضای نام برای بخشبندی پشته شبکه بین کانتینرها استفاده میشود.
- COW سرنام Copy on Write : روش مدیریت منابع برای کنترل ایمیجها در وضعیت فقط خواندنی است.
- Volumes and Bind Mounting: برای مدیریت دادهها در کانتینرها و انجام کارهایی مثل اتصال فایلهای سیستمی میزبان به عنوان مخزن استفاده میشود.
آشنایی با مباحث شبکه: توصیه میکنیم دانش خود در ارتباط با مفاهیم شبکههای کامپیوتری و فناوریهایی مثل سوکت، مسیریابی، پروتکل آیپی، بریجها، شبکههای مجازی، Iptables، پورتها، معماری کلاینتسرور و موارد این چنینی را افزایش دهید تا بدون مشکل از داکر استفاده کنید. بهطور کلی، داکر به دو بخش کلاینت و سرور که از طریق یک سوکت، شبکه یا فایل با یکدیگر ارتباط برقرار میکنند، تشکیل شده است. بهعلاوه، داکر از بریجها و NAT برای ساخت شبکههای مجازی در کامپیوتر استفاده میکند. برای آنکه مکانیزم ارتباطی در وضعیت ایمنی قرار داشته باشد داکر فایروالی بهنام iptables را برای انتقال بستهها بین کانتینرها و اینترنت بهکار میگیرد. همانگونه که مشاهده میکنید تسلط بر مفاهیم شبکههای کامپیوتری و لینوکس در درک بهتر داکر و استفاده بدون مشکل از آن کمک شایانی میکند.
نصب داکر روی ویندوز
آمادهسازی تمام ابزارها و پیشنیازهای لازم روی کامپیوتر شخصی کار سختی نیست، زیرا راهاندازی و اجرای آن روی هر سیستمعاملی ساده است. در ادامه روش نصب داکر روی ویندوز و سپس لینوکس را بررسی میکنیم.
ابتدا باید به سایت https://www.docker.com/products/docker-desktop بروید و روی دکمه Download for Windows کلیک کنید تا فایل نصب که حجمی حدود 500 مگابایت دارد را دانلود کنید. علاوه بر این، برای استفاده از Docker Hub بهتر است یک حساب کاربری ایجاد کنید. برای انجام اینکار در لینک بالا روی دکمه Get Started در گوشه سمت راست بالا کلیک کنید تا به صفحه ساخت حساب کاربری وارد شوید (شکل 1).
پس از دانلود، نوبت به نصب فایل Docker Desktop Installer میرسد. مراحل نصب ساده است و تنها باید روی گزینه Install کلیک کنید. پس از اتمام نصب سیستم را راهاندازی کنید تا Docker Desktop بهشکل خودکار اجرا شود. در ابتدا ممکن است خطایی مبنی بر نیاز به نصب بهروزرسانی بسته کرنل لینوکس در ویندوز را مشاهده کنید. در صورت مشاهده این پیغام خطا Linux kernel update package را دانلود و نصب کنید. پس از انجام اینکار در پنجره خطای برنامه Docker Desktop دکمه Continue را کلیک کنید. پس از آن، Docker Engine در برنامه Docker Desktop بهشکل خودکار بارگذاری میشود. پس از انجام مراحل فوق، یک آموزش شروع به کار با داکر در داخل برنامه Docker Desktop به صورت خودکار آغاز میشود و کاربر را برای شروع به کار با داکر در Docker Desktop راهنمایی میکند. در این راهنما یک پنجره ترمینال در Docker Desktop وجود دارد و دستورات خط فرمان برای مراحل مختلف شروع به کار به شکل آماده در هر مرحله ارائه شده که تنها با کلیک روی آن، دستورات در ترمینال اجرا میشوند.
نصب داکر در لینوکس
میتوان داکر را روی توزیعهای مختلف لینوکس نصب کرد. در ادامه روش نصب روی توزیع اوبونتو با مدیر بسته apt را بررسی میکنیم. دستورالعملهای نصب و راهاندازی داکر برای سایر توزیعهای لینوکس را میتوان در مستندات داکر یافت. برای نصب جدیدترین نسخه داکر سادهترین ابزار، مدیر بسته در لینوکس است. ابتدا باید شاخه (Repository) داکر را اضافه کرد، فهرست بستهها را بهروزرسانی و داکر را نصب کرد. این فرایندها به ترتیب زیر انجام میشود:
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
در ادامه، نوبت به افزودن کلید GPG پوشه داکر است:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
در ادامه باید پوشه را به منبع اضافه و فهرست بسته را بهروزرسانی کرد:
echo “deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
در نهایت با استفاده از دستور زیر داکر را نصب میکنیم:
sudo apt-get install docker-ce docker-ce-cli containerd.io
پس از نصب داکر از دستور docker run hello-world:latest برای اطمینان از این موضوع که بدون مشکل نصب شده استفاده کنید.
برنامه Hello World برای شروع آموزش داکر
پس از آنکه همه چیز آماده شد، زمان اجرای داکر است. در این بخش، یک کانتینر Busybox را روی سیستم اجرا میکنیم و کار را با دستور docker run آغاز میکنیم. Busybox یک بسته نرمافزاری است که چند ابزار تحت یونیکس را به شکل ابتدایی در قالب یک فایل اجرایی ارائه میکند. برای شروع، باید دستور زیر را در خط فرمان اجرا کنید:
$ docker pull busybox
بسته به اینکه داکر چگونه روی سیستم نصب شده، ممکن است یک خطای عدم صدور مجوز (Permission Denied) پس از اجرای دستور فوق نشان داده شود. اگر از سیستمعامل مک استفاده میکنید، باید مطمئن شوید که Docker Engine در حال اجرا است. اگر از لینوکس استفاده میکنید و این خطا را مشاهده میکنید باید قبل از دستور فوق از کلمه کلیدی Sudo استفاده کنید. علاوه بر آن، میتوان یک گروه داکر (Docker Group) ایجاد کرد تا دیگر این مشکل را مشاهده نکنید. دستور pull ایمیج Busybox را از رجیستری داکر دریافت و آنرا در سیستم ذخیره میکند. میتوان از دستور docker images برای مشاهده فهرستی از ایمیجهای روی سیستم استفاده کرد:
$ docker images
اکنون برای اجرای ایمیج busybox از دستور docker run به شرح زیر استفاده میکنیم:
$ docker run busybox
با اجرای دستور فوق، چیزی مشاهده نمیکنید و بهنظر میرسد اتفاقی نیفتاده است؛ اما در پشت صحنه اتفاقات زیادی رخ داده است. وقتی از دستور run استفاده میکنید، کلاینت، داکر ایمیج را (Busybox) پیدا میکند، کانتینر را بارگذاری میکند و دستوری در آن کانتینر اجرا میکند.
وقتی که دستور docker run busybox اجرا میشود، هیچ دستوری ارجاع داده نشده است. بنابراین، کانتینر پس از بارگذاری، یک دستور خالی را اجرا میکند و خارج میشود. به همین دلیل است که با اجرای دستور فوق هیچ اتفاقی نمیافتد. در ادامه دستوری برای اجرا به کانتینر ارسال میکنیم:
$ docker run busybox echo “hello from busybox»
این مرتبه خروجی زیر را مشاهده میکنید:
hello from busybox
با اجرای دستور docker run خروجی قابل فهمی نشان داده میشود. در این حالت، کلاینت داکر دستور echo در کانتینر Busybox را اجرا میکند و خارج میشود. همانطور که مشاهده میکنید، تمامی این کارها به سرعت انجام میشود. اکنون زمان آن رسیده تا به سراغ دستور docker ps برویم. این دستور تمام کانتینرهایی را نشان میدهد که اکنون در حال اجرا هستند:
$ docker ps -a
اجرای دستور فوق خروجی زیر را نشان میدهد:
در اینجا فهرستی از تمام کانتینرهایی که تاکنون اجرا شدهاند نشان داده میشود. ستون Created نشان میدهد این کانتینرها چه زمانی ساخته شدهاند. آیا راهی برای اجرای بیش از یک دستور در یک کانتینر وجود دارد؟ پاسخ مثبت است. اجرای چند دستور با استفاده از
docker run به شکل زیر انجام میشود:
$ docker run -it busybox sh
/ # ls
bin dev etc home proc root sys tmp usr var
/ # uptime
05:45:21 up 5:58, 0 users, load average: 0.00, 0.01, 0.04
اجرای دستور run با سوییچ -it لینک موردنیاز برای برقراری ارتباط با یک کانتینر tty را ارائه میکند. اکنون قادر به اجرای دستورات موردنظر هستید. برای آشنایی با کاربردها و سوییچهای دیگر از دستور run، از ترکیب نحوی docker run –help استفاده کنید.
حذف کانتینرها در داکر چگونه انجام میشود؟
همانگونه که مشاهده کنید، این امکان وجود دارد که اطلاعاتی در ارتباط با یک کانتینر حتی پس از خروج از آن به وسیله دستور
docker ps –a بهدست آورد. نکته مهمی که باید در ارتباط با کانتینرها به آن دقت کنید این است که عدم آزادسازی کانتینرها باعث میشود فضای دیسک بدون دلیل اشغال شود. بنابراین، بهتر است پس از اتمام کار با یک کانتینر، آنرا پاک کنید. برای انجام این کار از دستور docker rm استفاده میشود. هنگام استفاده از دستور rm باید شناسه (ID) کانتینر را کپی و آنها را در ادامه دستور قرار دهید:
$ docker rm 305297d7a235 ff0a5c3750b9
هنگامی که کانتینری حذف میشود، شناسه آن در خروجی نشان داده میشود. امکان حذف چند کانتینر داکر به شکل همزمان نیز وجود دارد. اگر قصد حذف چند کانتینر را بهشکل همزمان دارید، کپی و الصاق شناسههای هر کانتینر چندان جالب نیست. برای حل این مشکل باید از دستور زیر استفاده کرد:
$ docker rm $(docker ps -a -q -f status=exited)
دستور فوق کانتینرهایی را حذف میکند که وضعیت (Status) خارج شده (exited) دارند. لازم به توضیح است که سوییچ -q تنها شناسههای عددی را بر میگرداند و سوییچ -f خروجی را بر مبنای شرایط ذکر شده ارائه میکند. مورد دیگری که باید به آن اشاره کنیم سوییچ –rm است. دستور فوق را میتوان در دستور docker run استفاده کرد. دستور مذکور کانتینر را به شکل خودکار در زمان خروج حذف میکند. استفاده از این سوییچ برای کانتینرهایی که تنها برای یک بار اجرا میشوند مفید است. در نسخههای جدیدتر داکر میتوان از دستور docker container prune برای پاک کردن تمام کانتینرهای متوقف شده استفاده کرد:
$ docker container prune
در این حالت پیغام هشداری نشان داده میشود که دستور فوق تمامی کانتینرها را پاک میکند. اگر قصد حذف ایمیجهایی دارید که دیگر نیازی به آنها ندارید باید از دستور docker rmi استفاده کنید
ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را میتوانید از کتابخانههای عمومی سراسر کشور و نیز از دکههای روزنامهفروشی تهیه نمائید.
ثبت اشتراک نسخه کاغذی ماهنامه شبکه
ثبت اشتراک نسخه آنلاین
کتاب الکترونیک +Network راهنمای شبکهها
- برای دانلود تنها کتاب کامل ترجمه فارسی +Network اینجا کلیک کنید.
کتاب الکترونیک دوره مقدماتی آموزش پایتون
- اگر قصد یادگیری برنامهنویسی را دارید ولی هیچ پیشزمینهای ندارید اینجا کلیک کنید.
نظر شما چیست؟